diff --git a/backend/src/entities/company-info/use-cases/invite-user-in-company.use.case.ts b/backend/src/entities/company-info/use-cases/invite-user-in-company.use.case.ts index 7cee38d6c..907b6393f 100644 --- a/backend/src/entities/company-info/use-cases/invite-user-in-company.use.case.ts +++ b/backend/src/entities/company-info/use-cases/invite-user-in-company.use.case.ts @@ -6,12 +6,12 @@ import { InviteUserInCompanyAndConnectionGroupDs } from '../application/data-str import { IInviteUserInCompanyAndConnectionGroup } from './company-info-use-cases.interface.js'; import { InvitedUserInCompanyAndConnectionGroupDs } from '../application/data-structures/invited-user-in-company-and-connection-group.ds.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { Logger } from '../../../helpers/logging/Logger.js'; import { isSaaS } from '../../../helpers/app/is-saas.js'; import { SaasCompanyGatewayService } from '../../../microservices/gateways/saas-gateway.ts/saas-company-gateway.service.js'; import { isTest } from '../../../helpers/app/is-test.js'; import { EmailService } from '../../email/email/email.service.js'; import { CompanyInfoHelperService } from '../company-info-helper.service.js'; +import { WinstonLogger } from '../../logging/winston-logger.js'; @Injectable({ scope: Scope.REQUEST }) export class InviteUserInCompanyAndConnectionGroupUseCase @@ -24,6 +24,7 @@ export class InviteUserInCompanyAndConnectionGroupUseCase private readonly saasCompanyGatewayService: SaasCompanyGatewayService, private readonly emailService: EmailService, private readonly companyInfoHelperService: CompanyInfoHelperService, + private readonly logger: WinstonLogger, ) { super(); } @@ -90,7 +91,7 @@ export class InviteUserInCompanyAndConnectionGroupUseCase } if (!isSaaS()) { - Logger.printTechString(`Invitation verification string: ${renewedEmailVerification.verification_string}`); + this.logger.printTechString(`Invitation verification string: ${renewedEmailVerification.verification_string}`); } throw new HttpException( { diff --git a/backend/src/entities/email/email/email.service.ts b/backend/src/entities/email/email/email.service.ts index fe0270a7c..f75dd7edd 100644 --- a/backend/src/entities/email/email/email.service.ts +++ b/backend/src/entities/email/email/email.service.ts @@ -1,21 +1,21 @@ -import { IMessage } from './email.interface.js'; -import { EmailTransporterService } from '../transporter/email-transporter-service.js'; -import { EmailGenerator } from './email.generator.js'; -import SMTPTransport from 'nodemailer/lib/smtp-transport'; -import { EmailLetter } from '../email-messages/email-message.js'; import { Inject, Injectable } from '@nestjs/common'; -import * as nunjucks from 'nunjucks'; import * as Sentry from '@sentry/node'; -import { getProcessVariable } from '../../../helpers/get-process-variable.js'; -import { Constants } from '../../../helpers/constants/constants.js'; -import { BaseType } from '../../../common/data-injection.tokens.js'; -import { Logger } from '../../../helpers/logging/Logger.js'; -import PQueue from 'p-queue'; import Mail from 'nodemailer/lib/mailer/index.js'; -import { EMAIL_TEXT } from '../email-text/email-text.js'; -import { escapeHtml } from '../utils/escape-html.util.js'; +import SMTPTransport from 'nodemailer/lib/smtp-transport'; +import * as nunjucks from 'nunjucks'; +import PQueue from 'p-queue'; +import { BaseType } from '../../../common/data-injection.tokens.js'; import { TableActionEventEnum } from '../../../enums/table-action-event-enum.js'; +import { Constants } from '../../../helpers/constants/constants.js'; +import { getProcessVariable } from '../../../helpers/get-process-variable.js'; +import { WinstonLogger } from '../../logging/winston-logger.js'; import { UserInfoMessageData } from '../../table-actions/table-actions-module/table-action-activation.service.js'; +import { EmailLetter } from '../email-messages/email-message.js'; +import { EMAIL_TEXT } from '../email-text/email-text.js'; +import { EmailTransporterService } from '../transporter/email-transporter-service.js'; +import { escapeHtml } from '../utils/escape-html.util.js'; +import { EmailGenerator } from './email.generator.js'; +import { IMessage } from './email.interface.js'; export interface ICronMessagingResults { messageId?: string; @@ -30,6 +30,7 @@ export class EmailService { @Inject(BaseType.NUNJUCKS) private readonly nunjucksEnv: nunjucks.Environment, private readonly emailTransporterService: EmailTransporterService, + private readonly logger: WinstonLogger, ) {} public async sendEmailToUser(letterContent: IMessage): Promise { @@ -106,7 +107,7 @@ export class EmailService { ); return mailingResults; } catch (error) { - Logger.logError(error); + this.logger.error(error); } } diff --git a/backend/src/entities/logging/winston-logger.ts b/backend/src/entities/logging/winston-logger.ts index 8eaa3a58b..526da1336 100644 --- a/backend/src/entities/logging/winston-logger.ts +++ b/backend/src/entities/logging/winston-logger.ts @@ -14,34 +14,38 @@ export class WinstonLogger implements LoggerService { }); } - log(message: any, ...optionalParams: any[]) { + public log(message: any, ...optionalParams: any[]) { this.logger.info(message, ...optionalParams); } - error(message: any, ...optionalParams: any[]) { + public error(message: any, ...optionalParams: any[]) { this.logger.error(message, ...optionalParams); } - warn(message: any, ...optionalParams: any[]) { + public warn(message: any, ...optionalParams: any[]) { this.logger.warn(message, ...optionalParams); } - logWithSlack(message: any, ...optionalParams: any[]) { + public logWithSlack(message: any, ...optionalParams: any[]) { this.logger.error(message, ...optionalParams); slackPostMessage(message).catch((error) => { this.logger.error('Failed to send Slack message', error); }); } - debug(message: any, ...optionalParams: any[]) { + public printTechString(str: string): void { + this.logger.info(`\n ${str} \n`); + } + + public debug(message: any, ...optionalParams: any[]) { this.logger.debug(message, ...optionalParams); } - verbose(message: any, ...optionalParams: any[]) { + public verbose(message: any, ...optionalParams: any[]) { this.logger.verbose(message, ...optionalParams); } - fatal(message: any, ...optionalParams: any[]) { + public fatal(message: any, ...optionalParams: any[]) { this.logger.error(message, ...optionalParams); slackPostMessage(message).catch((error) => { this.logger.error('Failed to send Slack message', error); diff --git a/backend/src/entities/table/use-cases/find-tables-in-connection.use.case.ts b/backend/src/entities/table/use-cases/find-tables-in-connection.use.case.ts index 5f5d6fc30..b51bbd6f6 100644 --- a/backend/src/entities/table/use-cases/find-tables-in-connection.use.case.ts +++ b/backend/src/entities/table/use-cases/find-tables-in-connection.use.case.ts @@ -12,7 +12,6 @@ import { ExceptionOperations } from '../../../exceptions/custom-exceptions/excep import { UnknownSQLException } from '../../../exceptions/custom-exceptions/unknown-sql-exception.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { isConnectionTypeAgent } from '../../../helpers/index.js'; -import { Logger } from '../../../helpers/logging/Logger.js'; import { isObjectPropertyExists } from '../../../helpers/validators/is-object-property-exists-validator.js'; import { AmplitudeService } from '../../amplitude/amplitude.service.js'; import { ConnectionEntity } from '../../connection/connection.entity.js'; @@ -24,6 +23,7 @@ import { FindTablesDs } from '../application/data-structures/find-tables.ds.js'; import { FoundTableDs } from '../application/data-structures/found-table.ds.js'; import { buildTableFieldInfoEntity, buildTableInfoEntity } from '../utils/save-tables-info-in-database.util.js'; import { IFindTablesInConnection } from './table-use-cases.interface.js'; +import { WinstonLogger } from '../../logging/winston-logger.js'; @Injectable() export class FindTablesInConnectionUseCase @@ -34,6 +34,7 @@ export class FindTablesInConnectionUseCase @Inject(BaseType.GLOBAL_DB_CONTEXT) protected _dbContext: IGlobalDatabaseContext, private amplitudeService: AmplitudeService, + private readonly logger: WinstonLogger, ) { super(); } @@ -87,7 +88,7 @@ export class FindTablesInConnectionUseCase throw new UnknownSQLException(e.message, ExceptionOperations.FAILED_TO_GET_TABLES); } finally { if (!connection.isTestConnection && tables && tables.length) { - Logger.logInfo({ + this.logger.log({ tables: tables.map((table) => table.tableName), connectionId: connectionId, connectionType: connection.type, 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 ff836bebc..359caefc4 100644 --- a/backend/src/entities/widget/utils/validate-create-widgets-ds.ts +++ b/backend/src/entities/widget/utils/validate-create-widgets-ds.ts @@ -38,19 +38,25 @@ export async function validateCreateWidgetsDs( } } 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; + if (typeof widget_params === 'string') { + widget_params = JSON5.parse(widget_params); + } + if ( - widgetDS.widget_params['algorithm'] && - !Object.keys(EncryptionAlgorithmEnum).find((key) => key === widgetDS.widget_params['algorithm']) + widget_params['algorithm'] && + !Object.keys(EncryptionAlgorithmEnum).find((key) => key === widget_params['algorithm']) ) { - errors.push(Messages.ENCRYPTION_ALGORITHM_INCORRECT(widgetDS.widget_params['algorithm'])); + errors.push(Messages.ENCRYPTION_ALGORITHM_INCORRECT(widget_params['algorithm'])); } - if (widgetDS.widget_params['encrypt'] === undefined) { + if (widget_params['encrypt'] === undefined) { errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING('encrypt')); } } diff --git a/backend/src/exceptions/all-exceptions.filter.ts b/backend/src/exceptions/all-exceptions.filter.ts index eb6e4ac5d..5fed34334 100644 --- a/backend/src/exceptions/all-exceptions.filter.ts +++ b/backend/src/exceptions/all-exceptions.filter.ts @@ -1,12 +1,14 @@ import { ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus } from '@nestjs/common'; -import { Logger } from '../helpers/logging/Logger.js'; + import { processExceptionMessage } from './utils/process-exception-message.js'; import Sentry from '@sentry/minimal'; import { Messages } from './text/messages.js'; +import { WinstonLogger } from '../entities/logging/winston-logger.js'; export type ExceptionType = 'no_master_key' | 'invalid_master_key' | 'query_timeout'; @Catch() export class AllExceptionsFilter implements ExceptionFilter { + constructor(private readonly logger: WinstonLogger) {} async catch(exception: any, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); @@ -28,7 +30,7 @@ export class AllExceptionsFilter implements ExceptionFilter { Sentry.captureException(exception, sentryContextObject); if (status === 500 || status === 408) { - Logger.logError(exception); + this.logger.error(exception); } const customExceptionType = this.getErrorType(text); diff --git a/backend/src/helpers/logging/Logger.ts b/backend/src/helpers/logging/Logger.ts deleted file mode 100644 index ac0c75d13..000000000 --- a/backend/src/helpers/logging/Logger.ts +++ /dev/null @@ -1,31 +0,0 @@ -import winston from 'winston'; - -export class Logger { - private static readonly infoLogger = winston.createLogger({ - level: 'info', - format: winston.format.json(), - transports: [new winston.transports.Console()], - }); - - private static readonly errorLogger = winston.createLogger({ - level: 'error', - format: winston.format.json(), - transports: [new winston.transports.Console()], - }); - - public static logInfo(log_object: Record): void { - this.infoLogger.info(log_object); - } - - public static logInfoString(str: string): void { - this.infoLogger.info(str); - } - - public static printTechString(str: string): void { - this.infoLogger.info(`\n ${str} \n`); - } - - public static logError(log_object: Record): void { - this.errorLogger.info(log_object); - } -} diff --git a/backend/src/main.ts b/backend/src/main.ts index e4fc9d97a..b035250a6 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -36,7 +36,7 @@ async function bootstrap() { const globalPrefix = process.env.GLOBAL_PREFIX || '/'; app.setGlobalPrefix(globalPrefix); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.use(helmet()); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-company-info-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-company-info-e2e.test.ts index 3ad5df2b8..62b5769c0 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-company-info-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-company-info-e2e.test.ts @@ -20,6 +20,7 @@ import { nanoid } from 'nanoid'; import { Constants } from '../../../src/helpers/constants/constants.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -36,7 +37,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-connection-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-connection-e2e.test.ts index 9ef0d41f5..0b954288f 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-connection-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-connection-e2e.test.ts @@ -21,6 +21,7 @@ import { ValidationException } from '../../../src/exceptions/custom-exceptions/v import { ValidationError } from 'class-validator'; import { ErrorsMessages } from '../../../src/exceptions/custom-exceptions/messages/custom-errors-messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const mockFactory = new MockFactory(); let app: INestApplication; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-connection-properties-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-connection-properties-e2e.test.ts index 080787f70..7958b963e 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-connection-properties-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-connection-properties-e2e.test.ts @@ -16,6 +16,7 @@ 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 { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const mockFactory = new MockFactory(); let app: INestApplication; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-custom-field-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-custom-field-e2e.test.ts index fda430cd8..628525967 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-custom-field-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-custom-field-e2e.test.ts @@ -21,9 +21,11 @@ import { ValidationException } from '../../../src/exceptions/custom-exceptions/v import { ValidationError } from 'class-validator'; import { ErrorsMessages } from '../../../src/exceptions/custom-exceptions/messages/custom-errors-messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; + const mockFactory = new MockFactory(); const masterPwd = 'ahalaimahalai'; @@ -46,7 +48,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-group-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-group-e2e.test.ts index 822d7bd71..a5c1af9a5 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-group-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-group-e2e.test.ts @@ -23,9 +23,11 @@ import { ValidationException } from '../../../src/exceptions/custom-exceptions/v import { ValidationError } from 'class-validator'; import { ErrorsMessages } from '../../../src/exceptions/custom-exceptions/messages/custom-errors-messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; + const mockFactory = new MockFactory(); test.before(async () => { @@ -38,7 +40,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-permissions-e2e.test.ts index b19acf6a6..fc257d550 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-permissions-e2e.test.ts @@ -21,6 +21,7 @@ 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 { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; @@ -36,7 +37,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-postgres-with-binary-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-postgres-with-binary-e2e.test.ts index b2fd0fec9..75883a96a 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-postgres-with-binary-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-postgres-with-binary-e2e.test.ts @@ -21,6 +21,7 @@ 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 { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -37,7 +38,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts index 96d258370..108e06908 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts @@ -26,6 +26,8 @@ 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 { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -46,7 +48,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts index 67e710bcb..f5d83979a 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts @@ -27,6 +27,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -47,7 +49,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -2076,8 +2078,6 @@ test.serial(`${currentTest} should add row in table and return result`, async (t t.is(rows[42][testTableSecondColumnName], row[testTableSecondColumnName]); t.is(rows[42].ID, rows[41].ID + 1); - - // check that rows adding was logged const getLogsResponse = await request(app.getHttpServer()) @@ -2090,7 +2090,7 @@ test.serial(`${currentTest} should add row in table and return result`, async (t const getLogsRO = JSON.parse(getLogsResponse.text); t.is(getLogsRO.hasOwnProperty('logs'), true); t.is(getLogsRO.hasOwnProperty('pagination'), true); - t.is(getLogsRO.logs.length > 0 , true); + t.is(getLogsRO.logs.length > 0, true); const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); t.is(getLogsRO.logs[addRowLogIndex].hasOwnProperty('affected_primary_key'), true); t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts index f1ef8cf3d..efed56704 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts @@ -27,6 +27,8 @@ import { join } from 'path'; import { send } from 'process'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -47,7 +49,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts index 3b7bb16f7..7ab5a4e93 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts @@ -23,6 +23,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -41,7 +42,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts index 5e545466b..7bfcaff85 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts @@ -23,6 +23,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -41,7 +42,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts index c911fadd3..d7c0f4d79 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts @@ -23,6 +23,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -41,7 +42,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts index 28e9147a4..85545d4f2 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts @@ -23,6 +23,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -41,7 +42,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts index 6e8625a6c..b579de935 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts @@ -23,6 +23,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -41,7 +42,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts index 11f04235c..21e6d07f4 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts @@ -23,6 +23,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -42,7 +43,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts index d61f23e5e..3d0b565da 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts @@ -23,6 +23,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -41,7 +42,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-settings-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-settings-e2e.test.ts index ba983d3d6..c84b3c46d 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-settings-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-settings-e2e.test.ts @@ -19,6 +19,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -35,7 +36,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { 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 401e45e04..dc35a2476 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 @@ -19,6 +19,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -39,7 +40,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -511,35 +512,32 @@ test.serial(`${currentTest} should return table widgets without deleted widget`, 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'); +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 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`, 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 81c4615d6..4fafc1a08 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 @@ -23,11 +23,13 @@ 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 { ErrorsMessages } from '../../../src/exceptions/custom-exceptions/messages/custom-errors-messages.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; let currentTest: string; + const mockFactory = new MockFactory(); const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); @@ -41,7 +43,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-e2e.test.ts index 7e8623dca..b1734995b 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-e2e.test.ts @@ -17,6 +17,7 @@ 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 { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let currentTest: string; @@ -32,7 +33,7 @@ test.beforeEach(async () => { testUtils = moduleFixture.get(TestUtils); // await testUtils.resetDb(); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { 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 1cf4d1e15..57dff488c 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 @@ -23,6 +23,7 @@ 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 { ErrorsMessages } from '../../../src/exceptions/custom-exceptions/messages/custom-errors-messages.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; @@ -50,7 +51,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { 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 adb2cbb77..1dd067124 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 @@ -22,6 +22,7 @@ import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-use 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'; let app: INestApplication; let testUtils: TestUtils; @@ -49,7 +50,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { 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 1a6bfea62..a1b04f22f 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 @@ -23,6 +23,7 @@ import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { pauseCode } from '../../../src/helpers/pause-code.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'; let app: INestApplication; let testUtils: TestUtils; @@ -50,7 +51,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -2138,7 +2139,10 @@ test.serial( t.is(updateConnectionResponse.status, 200); - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded(firstTableInfo.testTableName, false); + const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded( + firstTableInfo.testTableName, + false, + ); newConnectionProperties.hidden_tables = []; newConnectionProperties.tables_audit = false; diff --git a/backend/test/ava-tests/saas-tests/action-rules-e2e.test.ts b/backend/test/ava-tests/saas-tests/action-rules-e2e.test.ts index 3fd4209c8..73b99b503 100644 --- a/backend/test/ava-tests/saas-tests/action-rules-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/action-rules-e2e.test.ts @@ -30,6 +30,7 @@ import nock from 'nock'; import { CreateConnectionDto } from '../../../src/entities/connection/application/dto/create-connection.dto.js'; import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/enums/connection-types-enum.js'; import { FoundTableActionRulesRoDTO } from '../../../src/entities/table-actions/table-action-rules-module/application/dto/found-table-action-rules.ro.dto.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -50,7 +51,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/api-key-e2e.test.ts b/backend/test/ava-tests/saas-tests/api-key-e2e.test.ts index 6b9b46774..8cda87308 100644 --- a/backend/test/ava-tests/saas-tests/api-key-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/api-key-e2e.test.ts @@ -18,9 +18,11 @@ import { createTestTable } from '../../utils/create-test-table.js'; import { getTestData } from '../../utils/get-test-data.js'; import { MockFactory } from '../../mock.factory.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let currentTest: string; + const mockFactory = new MockFactory(); test.before(async () => { @@ -32,7 +34,7 @@ test.before(async () => { // testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/company-info-e2e.test.ts b/backend/test/ava-tests/saas-tests/company-info-e2e.test.ts index cd47d7418..28da164b0 100644 --- a/backend/test/ava-tests/saas-tests/company-info-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/company-info-e2e.test.ts @@ -26,6 +26,7 @@ import { } 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'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -43,7 +44,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/connection-e2e.test.ts b/backend/test/ava-tests/saas-tests/connection-e2e.test.ts index 366eb4de1..0e8afe3c4 100644 --- a/backend/test/ava-tests/saas-tests/connection-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/connection-e2e.test.ts @@ -21,6 +21,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; diff --git a/backend/test/ava-tests/saas-tests/connection-properties-e2e.test.ts b/backend/test/ava-tests/saas-tests/connection-properties-e2e.test.ts index d2dcb4c23..a5d9380a8 100644 --- a/backend/test/ava-tests/saas-tests/connection-properties-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/connection-properties-e2e.test.ts @@ -15,6 +15,7 @@ import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-ret import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const mockFactory = new MockFactory(); let app: INestApplication; diff --git a/backend/test/ava-tests/saas-tests/custom-domains-e2e.test.ts b/backend/test/ava-tests/saas-tests/custom-domains-e2e.test.ts index a48e3e7ae..fb631aba8 100644 --- a/backend/test/ava-tests/saas-tests/custom-domains-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/custom-domains-e2e.test.ts @@ -18,6 +18,7 @@ import { TestUtils } from '../../utils/test.utils.js'; import { createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions } from '../../utils/user-with-different-permissions-utils.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; // import nock from 'nock'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -35,7 +36,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/custom-field-e2e.test.ts b/backend/test/ava-tests/saas-tests/custom-field-e2e.test.ts index fef0dc95f..084f65987 100644 --- a/backend/test/ava-tests/saas-tests/custom-field-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/custom-field-e2e.test.ts @@ -19,9 +19,11 @@ 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 { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; + const mockFactory = new MockFactory(); const masterPwd = 'ahalaimahalai'; @@ -43,7 +45,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/different-tables-structures-e2e-test.ts b/backend/test/ava-tests/saas-tests/different-tables-structures-e2e-test.ts index c01001592..5677513b2 100644 --- a/backend/test/ava-tests/saas-tests/different-tables-structures-e2e-test.ts +++ b/backend/test/ava-tests/saas-tests/different-tables-structures-e2e-test.ts @@ -28,6 +28,8 @@ import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; import { clearAllTestKnex, getTestKnex } from '../../utils/get-test-knex.js'; import { Knex } from 'knex'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -47,7 +49,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/group-e2e.test.ts b/backend/test/ava-tests/saas-tests/group-e2e.test.ts index f6c380958..ae57df8a7 100644 --- a/backend/test/ava-tests/saas-tests/group-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/group-e2e.test.ts @@ -22,9 +22,11 @@ import { ValidationException } from '../../../src/exceptions/custom-exceptions/v import { ValidationError } from 'class-validator'; import { ErrorsMessages } from '../../../src/exceptions/custom-exceptions/messages/custom-errors-messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; + const mockFactory = new MockFactory(); test.before(async () => { @@ -36,7 +38,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/permissions-e2e.test.ts index 9a190ace4..4ffcdc5da 100644 --- a/backend/test/ava-tests/saas-tests/permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/permissions-e2e.test.ts @@ -20,9 +20,11 @@ import { Messages } from '../../../src/exceptions/text/messages.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; + const mockFactory = new MockFactory(); test.before(async () => { @@ -34,7 +36,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/postgres-with-binary-e2e.test.ts b/backend/test/ava-tests/saas-tests/postgres-with-binary-e2e.test.ts index f099bfbe0..c01f8a1c2 100644 --- a/backend/test/ava-tests/saas-tests/postgres-with-binary-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/postgres-with-binary-e2e.test.ts @@ -20,6 +20,7 @@ import { hexToBinary } from '../../../src/helpers/binary-to-hex.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -35,7 +36,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts b/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts index d1272dc17..417d3c7ac 100644 --- a/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts @@ -26,6 +26,7 @@ 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 { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -52,7 +53,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); connectionToTestDB = getTestData(mockFactory).cassandraAgentTestConnection; app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -106,7 +107,7 @@ test.serial(`${currentTest} should return list of tables in connection`, async ( .set('Accept', 'application/json'); const getTablesRO = JSON.parse(getTablesResponse.text); - console.log('🚀 ~ test.serial ~ getTablesRO:', getTablesRO) + console.log('🚀 ~ test.serial ~ getTablesRO:', getTablesRO); t.is(typeof getTablesRO, 'object'); t.is(getTablesRO.length > 0, true); @@ -3134,25 +3135,22 @@ test.skip(`${currentTest} should test connection and return result`, async (t) = t.is(message, 'Successfully connected'); }); -test.skip( - `${currentTest} should test connection and return negative result when connection password is incorrect result`, - async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; +test.skip(`${currentTest} should test connection and return negative result when connection password is incorrect result`, async (t) => { + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - connectionToTestDB.password = '8764323452888'; - connectionToTestDB.database = 'test_db'; - const testConnectionResponse = await request(app.getHttpServer()) - .post('/connection/test/') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + connectionToTestDB.password = '8764323452888'; + connectionToTestDB.database = 'test_db'; + const testConnectionResponse = await request(app.getHttpServer()) + .post('/connection/test/') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(testConnectionResponse.status, 201); - const { result } = JSON.parse(testConnectionResponse.text); - t.is(result, false); - }, -); + t.is(testConnectionResponse.status, 201); + const { result } = JSON.parse(testConnectionResponse.text); + t.is(result, false); +}); currentTest = 'GET table/csv/:slug'; diff --git a/backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts b/backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts index a352d0ed9..d79fdfd79 100644 --- a/backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts @@ -25,6 +25,8 @@ import { createTestTable } from '../../utils/create-test-table.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 { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -44,7 +46,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts index 29b0a3765..f747df2ca 100644 --- a/backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts @@ -25,6 +25,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -44,7 +46,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts index 7ac5c418f..1c508ebae 100644 --- a/backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts @@ -25,6 +25,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -44,7 +46,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -1037,77 +1039,80 @@ should return all found rows with search, pagination: page=1, perPage=2 and DESC }, ); -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).elasticsearchTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).elasticsearchTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - testTables.push(testTableName); + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - undefined, - undefined, - undefined, - undefined, - undefined, - ); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + undefined, + undefined, + undefined, + undefined, + undefined, + ); - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( `${currentTest} with search, with pagination and with sorting diff --git a/backend/test/ava-tests/saas-tests/table-filters-e2e-test.ts b/backend/test/ava-tests/saas-tests/table-filters-e2e-test.ts index dd3846c77..3903516b6 100644 --- a/backend/test/ava-tests/saas-tests/table-filters-e2e-test.ts +++ b/backend/test/ava-tests/saas-tests/table-filters-e2e-test.ts @@ -21,6 +21,8 @@ import { createTestTable } from '../../utils/create-test-table.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 { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -40,7 +42,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts index 20779211a..f04a67b95 100644 --- a/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts @@ -26,6 +26,8 @@ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -51,7 +53,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -437,8 +439,1062 @@ test.serial(`${currentTest} should return page of all rows with pagination page= } }); -test.serial(`${currentTest} with search, with pagination, without sorting -should return all found rows with pagination page=1 perPage=2`, async (t) => { +test.serial( + `${currentTest} with search, with pagination, without sorting +should return all found rows with pagination page=1 perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'ID'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'INTEGER'); + + //todo: rework pagination + // t.is(getTableRowsRO.pagination.total, 3); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, without sorting +should return all found rows with pagination page=1 perPage=3`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'ID'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'INTEGER'); + + //todo: rework pagination + // t.is(getTableRowsRO.pagination.total, 3); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by DESC`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 42, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 200); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 42); + t.is(getTableRowsRO.rows[1].ID, 41); + t.is(getTableRowsRO.rows[41].ID, 1); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by ASC`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 42, + QueryOrderingEnum.ASC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 1); + t.is(getTableRowsRO.rows[1].ID, 2); + t.is(getTableRowsRO.rows[41].ID, 42); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and with pagination and with sorting +should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 42); + t.is(getTableRowsRO.rows[1].ID, 41); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 1); + t.is(getTableRowsRO.rows[1].ID, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=3`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 39); + t.is(getTableRowsRO.rows[1].ID, 38); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 38); + t.is(getTableRowsRO.rows[1].ID, 22); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 1); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=1, perPage=2 and ASC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 1); + t.is(getTableRowsRO.rows[1].ID, 22); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and ASC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].ID, 38); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'ID'; + const fieldvalue = '45'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].ID, 38); + t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[1].ID, 22); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'ID'; + const fieldvalue = '41'; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=10&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].ID, 38); + t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[1].ID, 22); + t.is(getTableRowsRO.rows[2][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[2].ID, 1); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 10); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'ID'; + const fieldvalue = '41'; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=2&perPage=2&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].ID, 1); + + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'ID'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + + t.is(getTableRowsRO.rows[0].ID, 38); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -456,8 +1512,8 @@ should return all found rows with pagination page=1 perPage=2`, async (t) => { undefined, undefined, 3, - undefined, - undefined, + QueryOrderingEnum.DESC, + 'ID', undefined, undefined, undefined, @@ -473,42 +1529,25 @@ should return all found rows with pagination page=1 perPage=2`, async (t) => { .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); + const fieldname = 'ID'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + createConnectionRO.id = ''; const getTableRowsResponse = await request(app.getHttpServer()) .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'ID'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'INTEGER'); - - //todo: rework pagination - // t.is(getTableRowsRO.pagination.total, 3); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsResponse.status, 404); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} with search, with pagination, without sorting -should return all found rows with pagination page=1 perPage=3`, async (t) => { +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -526,8 +1565,8 @@ should return all found rows with pagination page=1 perPage=3`, async (t) => { undefined, undefined, 3, - undefined, - undefined, + QueryOrderingEnum.DESC, + 'ID', undefined, undefined, undefined, @@ -543,42 +1582,30 @@ should return all found rows with pagination page=1 perPage=3`, async (t) => { .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); + const fieldname = 'ID'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + createConnectionRO.id = faker.string.uuid(); const getTableRowsResponse = await request(app.getHttpServer()) .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 403); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'ID'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'INTEGER'); + const { message } = JSON.parse(getTableRowsResponse.text); - //todo: rework pagination - // t.is(getTableRowsRO.pagination.total, 3); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by DESC`, async (t) => { +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -595,7 +1622,7 @@ should return all found rows with sorting ids by DESC`, async (t) => { [testTableColumnName], undefined, undefined, - 42, + 3, QueryOrderingEnum.DESC, 'ID', undefined, @@ -613,1153 +1640,176 @@ should return all found rows with sorting ids by DESC`, async (t) => { .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); + const fieldname = 'ID'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 400); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 200); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 42); - t.is(getTableRowsRO.rows[1].ID, 41); - t.is(getTableRowsRO.rows[41].ID, 1); + const { message } = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(message, Messages.TABLE_NOT_FOUND); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by ASC`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 42, - QueryOrderingEnum.ASC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); +test.serial( + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = faker.lorem.words(1); + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTablesRO = JSON.parse(getTableRowsResponse.text); + t.is(getTablesRO.rows.length, 2); + t.is(getTablesRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTablesRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTablesRO.hasOwnProperty('primaryColumns'), true); + t.is(getTablesRO.hasOwnProperty('pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); +currentTest = 'GET /table/structure/:slug'; +test.serial(`${currentTest} should return table structure`, async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 200); + const getTableStructureRO = JSON.parse(getTableStructure.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 1); - t.is(getTableRowsRO.rows[1].ID, 2); - t.is(getTableRowsRO.rows[41].ID, 42); + t.is(typeof getTableStructureRO, 'object'); + t.is(typeof getTableStructureRO.structure, 'object'); + t.is(getTableStructureRO.structure.length, 5); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; + for (const element of getTableStructureRO.structure) { + t.is(element.hasOwnProperty('column_name'), true); + t.is(element.hasOwnProperty('column_default'), true); + t.is(element.hasOwnProperty('data_type'), true); + t.is(element.hasOwnProperty('isExcluded'), true); + t.is(element.hasOwnProperty('isSearched'), true); } -}); - -test.serial(`${currentTest} without search and with pagination and with sorting -should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); + t.is(getTableStructureRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableStructureRO.hasOwnProperty('foreignKeys'), true); - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); + for (const element of getTableStructureRO.primaryColumns) { + t.is(element.hasOwnProperty('column_name'), true); + t.is(element.hasOwnProperty('data_type'), true); + } - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); + for (const element of getTableStructureRO.foreignKeys) { + t.is(element.hasOwnProperty('referenced_column_name'), true); + t.is(element.hasOwnProperty('referenced_table_name'), true); + t.is(element.hasOwnProperty('constraint_name'), true); + t.is(element.hasOwnProperty('column_name'), true); + } +}); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); +test.serial(`${currentTest} should throw an exception whe connection id not passed in request`, async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + createConnectionRO.id = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 404); +}); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 42); - t.is(getTableRowsRO.rows[1].ID, 41); +test.serial(`${currentTest} should throw an exception whe connection id passed in request id incorrect`, async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 1); - t.is(getTableRowsRO.rows[1].ID, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=3`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 39); - t.is(getTableRowsRO.rows[1].ID, 38); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 38); - t.is(getTableRowsRO.rows[1].ID, 22); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 1); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=1, perPage=2 and ASC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 1); - t.is(getTableRowsRO.rows[1].ID, 22); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and ASC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].ID, 38); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'ID'; - const fieldvalue = '45'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].ID, 38); - t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[1].ID, 22); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'ID'; - const fieldvalue = '41'; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=10&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].ID, 38); - t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[1].ID, 22); - t.is(getTableRowsRO.rows[2][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[2].ID, 1); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 10); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'ID'; - const fieldvalue = '41'; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=2&perPage=2&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].ID, 1); - - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'ID'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - - t.is(getTableRowsRO.rows[0].ID, 38); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'ID'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - createConnectionRO.id = ''; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'ID'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - createConnectionRO.id = faker.string.uuid(); - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 403); - - const { message } = JSON.parse(getTableRowsResponse.text); - - t.is(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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'ID'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 400); - - const { message } = JSON.parse(getTableRowsResponse.text); - - t.is(message, Messages.TABLE_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = faker.lorem.words(1); - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTablesRO = JSON.parse(getTableRowsResponse.text); - t.is(getTablesRO.rows.length, 2); - t.is(getTablesRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTablesRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTablesRO.hasOwnProperty('primaryColumns'), true); - t.is(getTablesRO.hasOwnProperty('pagination'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -currentTest = 'GET /table/structure/:slug'; -test.serial(`${currentTest} should return table structure`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 200); - const getTableStructureRO = JSON.parse(getTableStructure.text); - - t.is(typeof getTableStructureRO, 'object'); - t.is(typeof getTableStructureRO.structure, 'object'); - t.is(getTableStructureRO.structure.length, 5); - - for (const element of getTableStructureRO.structure) { - t.is(element.hasOwnProperty('column_name'), true); - t.is(element.hasOwnProperty('column_default'), true); - t.is(element.hasOwnProperty('data_type'), true); - t.is(element.hasOwnProperty('isExcluded'), true); - t.is(element.hasOwnProperty('isSearched'), true); - } - - t.is(getTableStructureRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableStructureRO.hasOwnProperty('foreignKeys'), true); - - for (const element of getTableStructureRO.primaryColumns) { - t.is(element.hasOwnProperty('column_name'), true); - t.is(element.hasOwnProperty('data_type'), true); - } - - for (const element of getTableStructureRO.foreignKeys) { - t.is(element.hasOwnProperty('referenced_column_name'), true); - t.is(element.hasOwnProperty('referenced_table_name'), true); - t.is(element.hasOwnProperty('constraint_name'), true); - t.is(element.hasOwnProperty('column_name'), true); - } -}); - -test.serial(`${currentTest} should throw an exception whe connection id not passed in request`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - createConnectionRO.id = ''; - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 404); -}); - -test.serial(`${currentTest} should throw an exception whe connection id passed in request id incorrect`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - createConnectionRO.id = faker.string.uuid(); - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 403); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); + createConnectionRO.id = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 403); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); }); test.serial(`${currentTest}should throw an exception when tableName not passed in request`, async (t) => { @@ -1862,9 +1912,6 @@ test.serial(`${currentTest} should add row in table and return result`, async (t t.is(rows[42][testTableSecondColumnName], row[testTableSecondColumnName]); t.is(rows[42].ID, rows[41].ID + 1); - - - // check that rows adding was logged const getLogsResponse = await request(app.getHttpServer()) @@ -1877,7 +1924,7 @@ test.serial(`${currentTest} should add row in table and return result`, async (t const getLogsRO = JSON.parse(getLogsResponse.text); t.is(getLogsRO.hasOwnProperty('logs'), true); t.is(getLogsRO.hasOwnProperty('pagination'), true); - t.is(getLogsRO.logs.length > 0 , true); + t.is(getLogsRO.logs.length > 0, true); const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); t.is(getLogsRO.logs[addRowLogIndex].hasOwnProperty('affected_primary_key'), true); t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); @@ -2282,66 +2329,72 @@ test.serial(`${currentTest} should throw an exception when primary key not passe t.is(message, Messages.PRIMARY_KEY_INVALID); }); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field name`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); -}); + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field value`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); + t.is(updateRowInTableResponse.status, 400); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); + }, +); - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=100000000`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); - const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - const { message } = updateRowInTableRO; - t.is(message, 'Failed to update row in table. No data returned from agent'); -}); + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + const { message } = updateRowInTableRO; + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, +); currentTest = 'DELETE /table/row/:slug'; @@ -2602,68 +2655,74 @@ test.serial(`${currentTest} should throw an exception when primary key not passe t.is(deletedRowIndex < 0, false); }); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field name`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForDeletion = 1; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakePKey=1`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakePKey=1`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(deleteRowInTableResponse.status, 400); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); + t.is(deleteRowInTableResponse.status, 400); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); - //checking that the line wasn't deleted - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); + //checking that the line wasn't deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - const { rows, primaryColumns, pagination } = getTableRowsRO; + const { rows, primaryColumns, pagination } = getTableRowsRO; - t.is(rows.length, 42); - const deletedRowIndex = rows.map((row: Record) => row.ID).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); -}); + t.is(rows.length, 42); + const deletedRowIndex = rows.map((row: Record) => row.ID).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, false); + }, +); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field value`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=100000`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 500); - t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); -}); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + }, +); currentTest = 'GET /table/row/:slug'; @@ -2721,28 +2780,31 @@ test.serial(`${currentTest} should throw an exception, when connection id is not t.is(foundRowInTableResponse.status, 404); }); -test.serial(`${currentTest} should throw an exception, when connection id passed in request is incorrect`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1; - createConnectionRO.id = faker.string.uuid(); - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1; + createConnectionRO.id = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 403); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); -}); + t.is(foundRowInTableResponse.status, 403); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + }, +); test.serial(`${currentTest} should throw an exception, when tableName in not passed in request`, async (t) => { const createConnectionResponse = await request(app.getHttpServer()) @@ -2811,49 +2873,55 @@ test.serial(`${currentTest} should throw an exception, when primary key is not p t.is(message, Messages.PRIMARY_KEY_INVALID); }); -test.serial(`${currentTest} should throw an exception, when primary key passed in request has incorrect name`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); -}); + t.is(foundRowInTableResponse.status, 400); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); + }, +); -test.serial(`${currentTest} should throw an exception, when primary key passed in request has incorrect value`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1000000; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 500); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); -}); + t.is(foundRowInTableResponse.status, 500); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + }, +); currentTest = 'PUT /table/rows/delete/:slug'; @@ -2981,67 +3049,70 @@ test.serial(`${currentTest} should return csv file with table data`, async (t) = t.is(isFileExists, true); }); -test.serial(`${currentTest} should return csv file with table data with search, with pagination, with sorting, -with search and pagination: page=1, perPage=2 and DESC sorting`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should return csv file with table data with search, with pagination, with sorting, +with search and pagination: page=1, perPage=2 and DESC sorting`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - undefined, - undefined, - undefined, - undefined, - undefined, - ); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + undefined, + undefined, + undefined, + undefined, + undefined, + ); - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); - const getTableCsvResponse = await request(app.getHttpServer()) - .post( - `/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'text/csv') - .set('Accept', 'text/csv'); + const getTableCsvResponse = await request(app.getHttpServer()) + .post( + `/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'text/csv') + .set('Accept', 'text/csv'); - if (getTableCsvResponse.status !== 201) { - console.log(getTableCsvResponse.text); - } - t.is(getTableCsvResponse.status, 201); - const fileName = `${testTableName}.csv`; - const downloadedFilePatch = join(__dirname, 'response-files', fileName); + if (getTableCsvResponse.status !== 201) { + console.log(getTableCsvResponse.text); + } + t.is(getTableCsvResponse.status, 201); + const fileName = `${testTableName}.csv`; + const downloadedFilePatch = join(__dirname, 'response-files', fileName); - const dir = join(__dirname, 'response-files'); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir); - } - // eslint-disable-next-line security/detect-non-literal-fs-filename - fs.writeFileSync(downloadedFilePatch, getTableCsvResponse.body); + const dir = join(__dirname, 'response-files'); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir); + } + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, getTableCsvResponse.body); - // eslint-disable-next-line security/detect-non-literal-fs-filename - const isFileExists = fs.existsSync(downloadedFilePatch); - t.is(isFileExists, true); -}); + // eslint-disable-next-line security/detect-non-literal-fs-filename + const isFileExists = fs.existsSync(downloadedFilePatch); + t.is(isFileExists, true); + }, +); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { diff --git a/backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts index bfe4eba94..889b708ba 100644 --- a/backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts @@ -26,6 +26,8 @@ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -45,7 +47,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-logs-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-logs-e2e.test.ts index 57d3412f1..66937fdad 100644 --- a/backend/test/ava-tests/saas-tests/table-logs-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-logs-e2e.test.ts @@ -18,6 +18,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -37,7 +39,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -104,117 +106,120 @@ test.serial(`${currentTest} should return all found logs in connection`, async ( } }); -test.serial(`${currentTest} should return all found logs in connection with included searched primary keys`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); +test.serial( + `${currentTest} should return all found logs in connection with included searched primary keys`, + 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 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 getLogsInTableRO = JSON.parse(getTableLogs.text); + 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 getLogsInTableRO = JSON.parse(getTableLogs.text); - t.is(getLogsInTableRO.logs.length, 1); - t.is(getLogsInTableRO.logs[0].hasOwnProperty('affected_primary_key'), true); - const searchedAffectedPrimaryKey = JSON.stringify(getLogsInTableRO.logs[0].affected_primary_key); + t.is(getLogsInTableRO.logs.length, 1); + t.is(getLogsInTableRO.logs[0].hasOwnProperty('affected_primary_key'), true); + const searchedAffectedPrimaryKey = JSON.stringify(getLogsInTableRO.logs[0].affected_primary_key); - let additionalRowAddResponse = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: faker.person.firstName(), - [testData.firstTableInfo.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(additionalRowAddResponse.status, 201); + let additionalRowAddResponse = await request(app.getHttpServer()) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .send({ + [testData.firstTableInfo.testTableColumnName]: faker.person.firstName(), + [testData.firstTableInfo.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(additionalRowAddResponse.status, 201); - additionalRowAddResponse = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: faker.person.firstName(), - [testData.firstTableInfo.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(additionalRowAddResponse.status, 201); + additionalRowAddResponse = await request(app.getHttpServer()) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .send({ + [testData.firstTableInfo.testTableColumnName]: faker.person.firstName(), + [testData.firstTableInfo.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(additionalRowAddResponse.status, 201); - additionalRowAddResponse = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: faker.person.firstName(), - [testData.firstTableInfo.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(additionalRowAddResponse.status, 201); + additionalRowAddResponse = await request(app.getHttpServer()) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .send({ + [testData.firstTableInfo.testTableColumnName]: faker.person.firstName(), + [testData.firstTableInfo.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(additionalRowAddResponse.status, 201); - additionalRowAddResponse = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: faker.person.firstName(), - [testData.firstTableInfo.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(additionalRowAddResponse.status, 201); + additionalRowAddResponse = await request(app.getHttpServer()) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .send({ + [testData.firstTableInfo.testTableColumnName]: faker.person.firstName(), + [testData.firstTableInfo.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(additionalRowAddResponse.status, 201); - //check that logs was created + //check that logs was created - const getTableLogsAfterAddingExtraRows = await request(app.getHttpServer()) - .get(`/logs/${testData.connections.firstId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowAfterAddingExtraRowsRO = JSON.parse(getTableLogsAfterAddingExtraRows.text); + const getTableLogsAfterAddingExtraRows = await request(app.getHttpServer()) + .get(`/logs/${testData.connections.firstId}`) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getRowAfterAddingExtraRowsRO = JSON.parse(getTableLogsAfterAddingExtraRows.text); - t.is(getRowAfterAddingExtraRowsRO.logs.length, 5); + t.is(getRowAfterAddingExtraRowsRO.logs.length, 5); - const getTableLogsSearched = await request(app.getHttpServer()) - .get(`/logs/${testData.connections.firstId}?affected_primary_key=${searchedAffectedPrimaryKey}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const getTableLogsSearched = await request(app.getHttpServer()) + .get(`/logs/${testData.connections.firstId}?affected_primary_key=${searchedAffectedPrimaryKey}`) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const getRowInTableSearchedRO = JSON.parse(getTableLogsSearched.text); - t.is(getTableLogsSearched.status, 200); - t.is(getRowInTableSearchedRO.logs.length, 1); - t.is(JSON.stringify(getRowInTableSearchedRO.logs[0].affected_primary_key), searchedAffectedPrimaryKey); - } catch (error) { - console.error(error); - throw error; - } -}); + const getRowInTableSearchedRO = JSON.parse(getTableLogsSearched.text); + t.is(getTableLogsSearched.status, 200); + t.is(getRowInTableSearchedRO.logs.length, 1); + t.is(JSON.stringify(getRowInTableSearchedRO.logs[0].affected_primary_key), searchedAffectedPrimaryKey); + } 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'`, diff --git a/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts index fa685f0d5..c8141c19f 100644 --- a/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts @@ -25,6 +25,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -50,7 +52,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -175,936 +177,16 @@ test.serial(`${currentTest} should throw an error when connection id is incorrec .set('Accept', 'application/json'); t.is(getTablesResponse.status, 400); const { message } = JSON.parse(getTablesResponse.text); - t.is(message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); - -currentTest = 'GET /table/rows/:slug'; - -test.serial(`${currentTest} should return rows of selected table without search and without pagination`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.hasOwnProperty('large_dataset'), true); - t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0].hasOwnProperty('_id'), true); - t.is(getTableRowsRO.rows[1].hasOwnProperty(testTableColumnName), true); - t.is(getTableRowsRO.rows[10].hasOwnProperty(testTableSecondColumnName), true); - t.is(getTableRowsRO.rows[15].hasOwnProperty('created_at'), true); - t.is(getTableRowsRO.rows[19].hasOwnProperty('updated_at'), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return rows of selected table with search and without pagination`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['_id'], - undefined, - undefined, - 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const searchedDescription = insertedSearchedIds.find((id) => id.number === 5)._id; - - const getTableRowsResponse = await request(app.getHttpServer()) - .post(`/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 201); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0]._id, searchedDescription); - t.is(getTableRowsRO.rows[0].hasOwnProperty(testTableColumnName), true); - t.is(getTableRowsRO.rows[0].hasOwnProperty(testTableSecondColumnName), true); - t.is(getTableRowsRO.rows[0].hasOwnProperty('created_at'), true); - t.is(getTableRowsRO.rows[0].hasOwnProperty('updated_at'), true); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return page of all rows with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['_id'], - undefined, - undefined, - 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Content-Type', 'application/json') - .set('Cookie', firstUserToken) - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0].hasOwnProperty('_id'), true); - t.is(getTableRowsRO.rows[1].hasOwnProperty(testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, '_id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'string'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return page of all rows with pagination page=3, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['_id'], - undefined, - undefined, - 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=3&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0].hasOwnProperty('_id'), true); - t.is(getTableRowsRO.rows[1].hasOwnProperty(testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, '_id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'string'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 3); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, without sorting -should return all found rows with pagination page=1 perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, '_id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'string'); - - t.is(getTableRowsRO.pagination.total, 3); - t.is(getTableRowsRO.pagination.lastPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, without sorting -should return all found rows with pagination page=1 perPage=3`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, '_id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'string'); - - t.is(getTableRowsRO.pagination.total, 3); - t.is(getTableRowsRO.pagination.lastPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by DESC`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 42, - QueryOrderingEnum.DESC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - // t.is(getTableRowsRO.rows[0]._id, 42); - // t.is(getTableRowsRO.rows[1]._id, 41); - // t.is(getTableRowsRO.rows[41]._id, 1); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by ASC`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 42, - QueryOrderingEnum.ASC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - const searchedLastId = insertedSearchedIds.find((id) => id.number === 41)._id; - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 0)._id; - const searchedSecondId = insertedSearchedIds.find((id) => id.number === 1)._id; - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0]._id, searchedFirstId); - t.is(getTableRowsRO.rows[1]._id, searchedSecondId); - t.is(getTableRowsRO.rows[41]._id, searchedLastId); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} without search and with pagination and with sorting -should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - const searchedLastId = insertedSearchedIds.find((id) => id.number === 1)._id; - - const preSearchedLastId = insertedSearchedIds.find((id) => id.number === 0)._id; - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0]._id, preSearchedLastId); - t.is(getTableRowsRO.rows[1]._id, searchedLastId); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 0)._id; - - const preSearchedSecondId = insertedSearchedIds.find((id) => id.number === 1)._id; - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0]._id, searchedFirstId); - t.is(getTableRowsRO.rows[1]._id, preSearchedSecondId); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=3`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 3)._id; - - const searchedSecondId = insertedSearchedIds.find((id) => id.number === 4)._id; - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0]._id, searchedFirstId); - t.is(getTableRowsRO.rows[1]._id, searchedSecondId); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 0)._id; - - const searchedSecondId = insertedSearchedIds.find((id) => id.number === 21)._id; - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0]._id, searchedFirstId); - t.is(getTableRowsRO.rows[1]._id, searchedSecondId); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37)._id; - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0]._id, searchedFirstId); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=1, perPage=2 and ASC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getTableRowsResponse.status, 200); - - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 0)._id; - const searchedSecondId = insertedSearchedIds.find((id) => id.number === 21)._id; - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0]._id, searchedFirstId); - t.is(getTableRowsRO.rows[1]._id, searchedSecondId); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(message, Messages.CONNECTION_NOT_FOUND); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and ASC sorting`, async (t) => { +currentTest = 'GET /table/rows/:slug'; + +test.serial(`${currentTest} should return rows of selected table without search and without pagination`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -1115,51 +197,27 @@ should return all found rows with search, pagination: page=2, perPage=2 and ASC const createConnectionRO = JSON.parse(createConnectionResponse.text); t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); t.is(getTableRowsResponse.status, 200); const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37)._id; t.is(typeof getTableRowsRO, 'object'); t.is(getTableRowsRO.hasOwnProperty('rows'), true); t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0]._id, searchedFirstId); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.hasOwnProperty('large_dataset'), true); + t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0].hasOwnProperty('_id'), true); + t.is(getTableRowsRO.rows[1].hasOwnProperty(testTableColumnName), true); + t.is(getTableRowsRO.rows[10].hasOwnProperty(testTableSecondColumnName), true); + t.is(getTableRowsRO.rows[15].hasOwnProperty('created_at'), true); + t.is(getTableRowsRO.rows[19].hasOwnProperty('updated_at'), true); t.is(typeof getTableRowsRO.primaryColumns, 'object'); t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); @@ -1170,9 +228,7 @@ should return all found rows with search, pagination: page=2, perPage=2 and ASC } }); -// todo: rework for other tables after removing old endpoint -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering in body`, async (t) => { +test.serial(`${currentTest} should return rows of selected table with search and without pagination`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -1186,12 +242,12 @@ should return all found rows with search, pagination: page=1, perPage=2 and DESC const createTableSettingsDTO = mockFactory.generateTableSettings( createConnectionRO.id, testTableName, - [testTableColumnName], + ['_id'], undefined, undefined, 3, - QueryOrderingEnum.DESC, - '_id', + undefined, + undefined, undefined, undefined, undefined, @@ -1205,39 +261,30 @@ should return all found rows with search, pagination: page=1, perPage=2 and DESC .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - const fieldname = 'age'; - const fieldvalue = 18; + t.is(createTableSettingsResponse.status, 201); - const filters = { - [fieldname]: { lt: fieldvalue }, - }; + const searchedDescription = insertedSearchedIds.find((id) => id.number === 5)._id; const getTableRowsResponse = await request(app.getHttpServer()) - .post( - `/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .send({ filters }) + .post(`/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 201); t.is(typeof getTableRowsRO, 'object'); t.is(getTableRowsRO.hasOwnProperty('rows'), true); t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); t.is(getTableRowsRO.hasOwnProperty('pagination'), true); t.is(getTableRowsRO.rows.length, 1); t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - - const foundId = insertedSearchedIds.find((id) => id.number === 0)._id; - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0]._id, foundId); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - + t.is(getTableRowsRO.rows[0]._id, searchedDescription); + t.is(getTableRowsRO.rows[0].hasOwnProperty(testTableColumnName), true); + t.is(getTableRowsRO.rows[0].hasOwnProperty(testTableSecondColumnName), true); + t.is(getTableRowsRO.rows[0].hasOwnProperty('created_at'), true); + t.is(getTableRowsRO.rows[0].hasOwnProperty('updated_at'), true); t.is(typeof getTableRowsRO.primaryColumns, 'object'); t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); @@ -1247,8 +294,7 @@ should return all found rows with search, pagination: page=1, perPage=2 and DESC } }); -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, async (t) => { +test.serial(`${currentTest} should return page of all rows with pagination page=1, perPage=2`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -1262,12 +308,12 @@ should return all found rows with search, pagination: page=1, perPage=10 and DES const createTableSettingsDTO = mockFactory.generateTableSettings( createConnectionRO.id, testTableName, - [testTableColumnName], + ['_id'], undefined, undefined, 3, - QueryOrderingEnum.DESC, - '_id', + undefined, + undefined, undefined, undefined, undefined, @@ -1283,51 +329,40 @@ should return all found rows with search, pagination: page=1, perPage=10 and DES .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); - const fieldname = 'age'; - const fieldvalue = 18; - - const filters = { - [fieldname]: { lt: fieldvalue }, - }; - const getTableRowsResponse = await request(app.getHttpServer()) - .post( - `/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=10`, - ) - .send({ filters }) - .set('Cookie', firstUserToken) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) .set('Content-Type', 'application/json') + .set('Cookie', firstUserToken) .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 201); - + t.is(getTableRowsResponse.status, 200); const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); t.is(getTableRowsRO.hasOwnProperty('rows'), true); t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - - const foundId = insertedSearchedIds.find((id) => id.number === 0)._id; - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0]._id, foundId); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 10); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0].hasOwnProperty('_id'), true); + t.is(getTableRowsRO.rows[1].hasOwnProperty(testTableColumnName), true); t.is(typeof getTableRowsRO.primaryColumns, 'object'); t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, '_id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'string'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 21); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 1); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, async (t) => { +test.serial(`${currentTest} should return page of all rows with pagination page=3, perPage=2`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -1341,12 +376,12 @@ should return all found rows with search, pagination: page=1, perPage=2 and DESC const createTableSettingsDTO = mockFactory.generateTableSettings( createConnectionRO.id, testTableName, - [testTableColumnName], + ['_id'], undefined, undefined, 3, - QueryOrderingEnum.DESC, - '_id', + undefined, + undefined, undefined, undefined, undefined, @@ -1362,50 +397,1059 @@ should return all found rows with search, pagination: page=1, perPage=2 and DESC .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); - const fieldname = 'age'; - const fieldGtvalue = 14; - const fieldLtvalue = 95; - - const filters = { - [fieldname]: { lt: fieldLtvalue, gt: fieldGtvalue }, - }; - const getTableRowsResponse = await request(app.getHttpServer()) - .post( - `/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=3`, - ) - .send({ filters }) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=3&perPage=2`) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 201); - + t.is(getTableRowsResponse.status, 200); const getTableRowsRO = JSON.parse(getTableRowsResponse.text); t.is(typeof getTableRowsRO, 'object'); t.is(getTableRowsRO.hasOwnProperty('rows'), true); t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - - const findRowId = insertedSearchedIds.find((id) => id.number === 21)._id; - - t.is(getTableRowsRO.rows[0]._id, findRowId); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 3); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0].hasOwnProperty('_id'), true); + t.is(getTableRowsRO.rows[1].hasOwnProperty(testTableColumnName), true); t.is(typeof getTableRowsRO.primaryColumns, 'object'); t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, '_id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'string'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 21); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 3); } catch (e) { console.error(e); throw e; } }); +test.serial( + `${currentTest} with search, with pagination, without sorting +should return all found rows with pagination page=1 perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, '_id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'string'); + + t.is(getTableRowsRO.pagination.total, 3); + t.is(getTableRowsRO.pagination.lastPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, without sorting +should return all found rows with pagination page=1 perPage=3`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, '_id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'string'); + + t.is(getTableRowsRO.pagination.total, 3); + t.is(getTableRowsRO.pagination.lastPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by DESC`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 42, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + // t.is(getTableRowsRO.rows[0]._id, 42); + // t.is(getTableRowsRO.rows[1]._id, 41); + // t.is(getTableRowsRO.rows[41]._id, 1); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by ASC`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 42, + QueryOrderingEnum.ASC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + const searchedLastId = insertedSearchedIds.find((id) => id.number === 41)._id; + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 0)._id; + const searchedSecondId = insertedSearchedIds.find((id) => id.number === 1)._id; + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0]._id, searchedFirstId); + t.is(getTableRowsRO.rows[1]._id, searchedSecondId); + t.is(getTableRowsRO.rows[41]._id, searchedLastId); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and with pagination and with sorting +should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + const searchedLastId = insertedSearchedIds.find((id) => id.number === 1)._id; + + const preSearchedLastId = insertedSearchedIds.find((id) => id.number === 0)._id; + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0]._id, preSearchedLastId); + t.is(getTableRowsRO.rows[1]._id, searchedLastId); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 0)._id; + + const preSearchedSecondId = insertedSearchedIds.find((id) => id.number === 1)._id; + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0]._id, searchedFirstId); + t.is(getTableRowsRO.rows[1]._id, preSearchedSecondId); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=3`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 3)._id; + + const searchedSecondId = insertedSearchedIds.find((id) => id.number === 4)._id; + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0]._id, searchedFirstId); + t.is(getTableRowsRO.rows[1]._id, searchedSecondId); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 0)._id; + + const searchedSecondId = insertedSearchedIds.find((id) => id.number === 21)._id; + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0]._id, searchedFirstId); + t.is(getTableRowsRO.rows[1]._id, searchedSecondId); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37)._id; + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0]._id, searchedFirstId); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=1, perPage=2 and ASC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getTableRowsResponse.status, 200); + + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 0)._id; + const searchedSecondId = insertedSearchedIds.find((id) => id.number === 21)._id; + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0]._id, searchedFirstId); + t.is(getTableRowsRO.rows[1]._id, searchedSecondId); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and ASC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37)._id; + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0]._id, searchedFirstId); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +// todo: rework for other tables after removing old endpoint +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering in body`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'age'; + const fieldvalue = 18; + + const filters = { + [fieldname]: { lt: fieldvalue }, + }; + + const getTableRowsResponse = await request(app.getHttpServer()) + .post( + `/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .send({ filters }) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + + const foundId = insertedSearchedIds.find((id) => id.number === 0)._id; + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0]._id, foundId); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'age'; + const fieldvalue = 18; + + const filters = { + [fieldname]: { lt: fieldvalue }, + }; + + const getTableRowsResponse = await request(app.getHttpServer()) + .post( + `/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=10`, + ) + .send({ filters }) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 201); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + + const foundId = insertedSearchedIds.find((id) => id.number === 0)._id; + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0]._id, foundId); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 10); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'age'; + const fieldGtvalue = 14; + const fieldLtvalue = 95; + + const filters = { + [fieldname]: { lt: fieldLtvalue, gt: fieldGtvalue }, + }; + + const getTableRowsResponse = await request(app.getHttpServer()) + .post( + `/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=3`, + ) + .send({ filters }) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 201); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + + const findRowId = insertedSearchedIds.find((id) => id.number === 21)._id; + + t.is(getTableRowsRO.rows[0]._id, findRowId); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 3); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) @@ -1575,65 +1619,68 @@ test.serial(`${currentTest} should throw an exception when table name passed in } }); -test.serial(`${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = faker.lorem.words(1); - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTablesRO = JSON.parse(getTableRowsResponse.text); - t.is(getTablesRO.rows.length, 2); - t.is(getTablesRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTablesRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTablesRO.hasOwnProperty('primaryColumns'), true); - t.is(getTablesRO.hasOwnProperty('pagination'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = faker.lorem.words(1); + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTablesRO = JSON.parse(getTableRowsResponse.text); + t.is(getTablesRO.rows.length, 2); + t.is(getTablesRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTablesRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTablesRO.hasOwnProperty('primaryColumns'), true); + t.is(getTablesRO.hasOwnProperty('pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { @@ -1819,9 +1866,6 @@ test.serial(`${currentTest} should add row in table and return result`, async (t t.is(rows[42][testTableColumnName], row[testTableColumnName]); t.is(rows[42][testTableSecondColumnName], row[testTableSecondColumnName]); - - - // check that rows adding was logged const getLogsResponse = await request(app.getHttpServer()) @@ -1834,7 +1878,7 @@ test.serial(`${currentTest} should add row in table and return result`, async (t const getLogsRO = JSON.parse(getLogsResponse.text); t.is(getLogsRO.hasOwnProperty('logs'), true); t.is(getLogsRO.hasOwnProperty('pagination'), true); - t.is(getLogsRO.logs.length > 0 , true); + t.is(getLogsRO.logs.length > 0, true); const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); t.is(getLogsRO.logs[addRowLogIndex].hasOwnProperty('affected_primary_key'), true); t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); @@ -2241,65 +2285,71 @@ test.serial(`${currentTest} should throw an exception when primary key not passe t.is(message, Messages.PRIMARY_KEY_INVALID); }); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field name`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); -}); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field value`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + t.is(updateRowInTableResponse.status, 400); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); + }, +); - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=6606c97e2fff2ec599cc7bca`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; - t.is(updateRowInTableResponse.status, 500); - const responseObject = JSON.parse(updateRowInTableResponse.text); - t.is(responseObject.originalMessage, `No data returned from agent`); -}); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=6606c97e2fff2ec599cc7bca`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 500); + const responseObject = JSON.parse(updateRowInTableResponse.text); + t.is(responseObject.originalMessage, `No data returned from agent`); + }, +); currentTest = 'PUT /table/rows/update/:connectionId'; @@ -2619,68 +2669,74 @@ test.serial(`${currentTest} should throw an exception when primary key not passe t.is(deletedRowIndex < 0, false); }); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field name`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForDeletion = insertedSearchedIds[0]._id; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakePKey=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForDeletion = insertedSearchedIds[0]._id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakePKey=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(deleteRowInTableResponse.status, 400); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); + t.is(deleteRowInTableResponse.status, 400); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); - //checking that the line wasn't deleted - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); + //checking that the line wasn't deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - const { rows, primaryColumns, pagination } = getTableRowsRO; + const { rows, primaryColumns, pagination } = getTableRowsRO; - t.is(rows.length, 42); - const deletedRowIndex = rows.map((row: Record) => row._id).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); -}); + t.is(rows.length, 42); + const deletedRowIndex = rows.map((row: Record) => row._id).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, false); + }, +); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field value`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=6606c97e2fff2ec599cc7bca`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=6606c97e2fff2ec599cc7bca`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 500); - t.is(deleteRowInTableRO.originalMessage, `No data returned from agent`); -}); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.originalMessage, `No data returned from agent`); + }, +); currentTest = 'GET /table/row/:slug'; @@ -2738,28 +2794,31 @@ test.serial(`${currentTest} should throw an exception, when connection id is not t.is(foundRowInTableResponse.status, 404); }); -test.serial(`${currentTest} should throw an exception, when connection id passed in request is incorrect`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1; - createConnectionRO.id = faker.string.uuid(); - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1; + createConnectionRO.id = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 403); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); -}); + t.is(foundRowInTableResponse.status, 403); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + }, +); test.serial(`${currentTest} should throw an exception, when tableName in not passed in request`, async (t) => { const createConnectionResponse = await request(app.getHttpServer()) @@ -2828,49 +2887,55 @@ test.serial(`${currentTest} should throw an exception, when primary key is not p t.is(message, Messages.PRIMARY_KEY_INVALID); }); -test.serial(`${currentTest} should throw an exception, when primary key passed in request has incorrect name`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = insertedSearchedIds[0]._id; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = insertedSearchedIds[0]._id; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); -}); + t.is(foundRowInTableResponse.status, 400); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); + }, +); -test.serial(`${currentTest} should throw an exception, when primary key passed in request has incorrect value`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = '6604197dab8d910eb77783f9'; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = '6604197dab8d910eb77783f9'; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 500); - const findRowResponse = JSON.parse(foundRowInTableResponse.text); - t.is(findRowResponse.message, `Failed to get row by primary key. No data returned from agent`); -}); + t.is(foundRowInTableResponse.status, 500); + const findRowResponse = JSON.parse(foundRowInTableResponse.text); + t.is(findRowResponse.message, `Failed to get row by primary key. No data returned from agent`); + }, +); currentTest = 'PUT /table/rows/delete/:slug'; @@ -3056,67 +3121,70 @@ test.serial(`${currentTest} should return csv file with table data`, async (t) = t.is(isFileExists, true); }); -test.serial(`${currentTest} should return csv file with table data with search, with pagination, with sorting, -with search and pagination: page=1, perPage=2 and DESC sorting`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); +test.serial( + `${currentTest} should return csv file with table data with search, with pagination, with sorting, +with search and pagination: page=1, perPage=2 and DESC sorting`, + async (t) => { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); - const getTableCsvResponse = await request(app.getHttpServer()) - .post( - `/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'text/csv') - .set('Accept', 'text/csv'); + const getTableCsvResponse = await request(app.getHttpServer()) + .post( + `/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'text/csv') + .set('Accept', 'text/csv'); - if (getTableCsvResponse.status !== 201) { - console.log(getTableCsvResponse.text); - } - t.is(getTableCsvResponse.status, 201); - const fileName = `${testTableName}.csv`; - const downloadedFilePatch = join(__dirname, 'response-files', fileName); + if (getTableCsvResponse.status !== 201) { + console.log(getTableCsvResponse.text); + } + t.is(getTableCsvResponse.status, 201); + const fileName = `${testTableName}.csv`; + const downloadedFilePatch = join(__dirname, 'response-files', fileName); - const dir = join(__dirname, 'response-files'); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir); - } - // eslint-disable-next-line security/detect-non-literal-fs-filename - fs.writeFileSync(downloadedFilePatch, getTableCsvResponse.body); + const dir = join(__dirname, 'response-files'); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir); + } + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, getTableCsvResponse.body); - // eslint-disable-next-line security/detect-non-literal-fs-filename - const isFileExists = fs.existsSync(downloadedFilePatch); - t.is(isFileExists, true); -}); + // eslint-disable-next-line security/detect-non-literal-fs-filename + const isFileExists = fs.existsSync(downloadedFilePatch); + t.is(isFileExists, true); + }, +); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { diff --git a/backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts index 47675768f..3fda77b3b 100644 --- a/backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts @@ -25,6 +25,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -44,7 +46,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts index 4e29d3933..93cc854df 100644 --- a/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts @@ -29,6 +29,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -54,7 +56,7 @@ test.before(async () => { app = moduleFixture.createNestApplication(); testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -475,77 +477,1058 @@ test.serial(`${currentTest} should return page of all rows with pagination page= } }); -test.serial(`${currentTest} with search, with pagination, without sorting -should return all found rows with pagination page=1 perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} with search, with pagination, without sorting +should return all found rows with pagination page=1 perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, without sorting +should return all found rows with pagination page=1 perPage=3`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by DESC`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 42, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 42); + t.is(getTableRowsRO.rows[1].id, 41); + t.is(getTableRowsRO.rows[41].id, 1); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by ASC`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 42, + QueryOrderingEnum.ASC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.rows[1].id, 2); + t.is(getTableRowsRO.rows[41].id, 42); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and with pagination and with sorting +should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 42); + t.is(getTableRowsRO.rows[1].id, 41); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.rows[1].id, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=3`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 39); + t.is(getTableRowsRO.rows[1].id, 38); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.rows[1].id, 22); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=1, perPage=2 and ASC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.rows[1].id, 22); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and ASC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'id'; + const fieldvalue = '45'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[1].id, 22); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'id'; + const fieldvalue = '41'; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=10&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[1].id, 22); + t.is(getTableRowsRO.rows[2][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[2].id, 1); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 10); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'id'; + const fieldvalue = '41'; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=2&perPage=2&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].id, 1); + + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'id'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} with search, with pagination, without sorting -should return all found rows with pagination page=1 perPage=3`, async (t) => { +test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -563,74 +1546,6 @@ should return all found rows with pagination page=1 perPage=3`, async (t) => { undefined, undefined, 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by DESC`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 42, QueryOrderingEnum.DESC, 'id', undefined, @@ -648,98 +1563,25 @@ should return all found rows with sorting ids by DESC`, async (t) => { .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); + const fieldname = 'id'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + createConnectionRO.id = ''; const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 42); - t.is(getTableRowsRO.rows[1].id, 41); - t.is(getTableRowsRO.rows[41].id, 1); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by ASC`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 42, - QueryOrderingEnum.ASC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.rows[1].id, 2); - t.is(getTableRowsRO.rows[41].id, 42); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsResponse.status, 404); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} without search and with pagination and with sorting -should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, async (t) => { +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -774,883 +1616,30 @@ should return all found rows with sorting ports by DESC and with pagination page .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 42); - t.is(getTableRowsRO.rows[1].id, 41); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const fieldname = 'id'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.rows[1].id, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=3`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 39); - t.is(getTableRowsRO.rows[1].id, 38); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.rows[1].id, 22); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=1, perPage=2 and ASC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.rows[1].id, 22); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and ASC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldvalue = '45'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[1].id, 22); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldvalue = '41'; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=10&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[1].id, 22); - t.is(getTableRowsRO.rows[2][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[2].id, 1); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 10); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldvalue = '41'; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=2&perPage=2&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].id, 1); - - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - createConnectionRO.id = ''; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - createConnectionRO.id = faker.string.uuid(); - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 403); - - const { message } = JSON.parse(getTableRowsResponse.text); - - t.is(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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + createConnectionRO.id = faker.string.uuid(); const getTableRowsResponse = await request(app.getHttpServer()) .get( - `/table/rows/${createConnectionRO.id}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 400); + t.is(getTableRowsResponse.status, 403); const { message } = JSON.parse(getTableRowsResponse.text); - t.is(message, Messages.TABLE_NOT_FOUND); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, async (t) => { +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -1685,31 +1674,92 @@ test.serial(`${currentTest} should return an array with searched fields when fil .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); - const fieldname = faker.lorem.words(1); + const fieldname = 'id'; const fieldGtvalue = '25'; const fieldLtvalue = '40'; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; const getTableRowsResponse = await request(app.getHttpServer()) .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + `/table/rows/${createConnectionRO.id}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); + t.is(getTableRowsResponse.status, 400); + + const { message } = JSON.parse(getTableRowsResponse.text); - const getTablesRO = JSON.parse(getTableRowsResponse.text); - t.is(getTablesRO.rows.length, 2); - t.is(getTablesRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTablesRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTablesRO.hasOwnProperty('primaryColumns'), true); - t.is(getTablesRO.hasOwnProperty('pagination'), true); + t.is(message, Messages.TABLE_NOT_FOUND); } catch (e) { console.error(e); throw e; } }); +test.serial( + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = faker.lorem.words(1); + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTablesRO = JSON.parse(getTableRowsResponse.text); + t.is(getTablesRO.rows.length, 2); + t.is(getTablesRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTablesRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTablesRO.hasOwnProperty('primaryColumns'), true); + t.is(getTablesRO.hasOwnProperty('pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { testTables.push(testTableName); @@ -1907,9 +1957,6 @@ test.serial(`${currentTest} should add row in table and return result`, async (t t.is(rows[42][testTableSecondColumnName], row[testTableSecondColumnName]); t.is(rows[42].id, rows[41].id + 1); - - - // check that rows adding was logged const getLogsResponse = await request(app.getHttpServer()) @@ -1922,7 +1969,7 @@ test.serial(`${currentTest} should add row in table and return result`, async (t const getLogsRO = JSON.parse(getLogsResponse.text); t.is(getLogsRO.hasOwnProperty('logs'), true); t.is(getLogsRO.hasOwnProperty('pagination'), true); - t.is(getLogsRO.logs.length > 0 , true); + t.is(getLogsRO.logs.length > 0, true); const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); t.is(getLogsRO.logs[addRowLogIndex].hasOwnProperty('affected_primary_key'), true); t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); @@ -2347,69 +2394,75 @@ test.serial(`${currentTest} should throw an exception when primary key not passe t.is(message, Messages.PRIMARY_KEY_INVALID); }); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field name`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); -}); + t.is(updateRowInTableResponse.status, 400); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); + }, +); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field value`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=100000000`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(message, 'Failed to update row in table. No data returned from agent'); -}); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, +); currentTest = 'PUT /table/rows/update/:connectionId'; @@ -2738,73 +2791,79 @@ test.serial(`${currentTest} should throw an exception when primary key not passe t.is(deletedRowIndex < 0, false); }); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field name`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForDeletion = 1; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakePKey=1`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakePKey=1`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(deleteRowInTableResponse.status, 400); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); + t.is(deleteRowInTableResponse.status, 400); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); - //checking that the line wasn't deleted - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); + //checking that the line wasn't deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - const { rows, primaryColumns, pagination } = getTableRowsRO; + const { rows, primaryColumns, pagination } = getTableRowsRO; - t.is(rows.length, 42); - const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); -}); + t.is(rows.length, 42); + const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, false); + }, +); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field value`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=100000`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 500); - t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); - t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); -}); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + }, +); currentTest = 'GET /table/row/:slug'; @@ -2866,30 +2925,33 @@ test.serial(`${currentTest} should throw an exception, when connection id is not t.is(foundRowInTableResponse.status, 404); }); -test.serial(`${currentTest} should throw an exception, when connection id passed in request is incorrect`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1; - createConnectionRO.id = faker.string.uuid(); - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1; + createConnectionRO.id = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 403); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); -}); + t.is(foundRowInTableResponse.status, 403); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + }, +); test.serial(`${currentTest} should throw an exception, when tableName in not passed in request`, async (t) => { testTables.push(testTableName); @@ -2964,54 +3026,60 @@ test.serial(`${currentTest} should throw an exception, when primary key is not p t.is(message, Messages.PRIMARY_KEY_INVALID); }); -test.serial(`${currentTest} should throw an exception, when primary key passed in request has incorrect name`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); -}); + t.is(foundRowInTableResponse.status, 400); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); + }, +); -test.serial(`${currentTest} should throw an exception, when primary key passed in request has incorrect value`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1000000; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); - t.is(foundRowInTableResponse.status, 500); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); - t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); -}); + const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); + t.is(foundRowInTableResponse.status, 500); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + }, +); currentTest = 'PUT /table/rows/delete/:slug'; diff --git a/backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts index eee179865..894cca698 100644 --- a/backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts @@ -26,6 +26,8 @@ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -45,7 +47,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts index 144e085d5..1338c7ddc 100644 --- a/backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts @@ -22,6 +22,7 @@ import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-ret import { TestUtils } from '../../utils/test.utils.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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -39,7 +40,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts index 265578ac3..6399dcdaf 100644 --- a/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts @@ -29,6 +29,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -54,7 +56,7 @@ test.before(async () => { app = moduleFixture.createNestApplication(); testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -471,77 +473,1058 @@ test.serial(`${currentTest} should return page of all rows with pagination page= } }); -test.serial(`${currentTest} with search, with pagination, without sorting -should return all found rows with pagination page=1 perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} with search, with pagination, without sorting +should return all found rows with pagination page=1 perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, without sorting +should return all found rows with pagination page=1 perPage=3`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by DESC`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 42, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 42); + t.is(getTableRowsRO.rows[1].id, 41); + t.is(getTableRowsRO.rows[41].id, 1); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by ASC`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 42, + QueryOrderingEnum.ASC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.rows[1].id, 2); + t.is(getTableRowsRO.rows[41].id, 42); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} without search and with pagination and with sorting +should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 42); + t.is(getTableRowsRO.rows[1].id, 41); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.rows[1].id, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=3`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 39); + t.is(getTableRowsRO.rows[1].id, 38); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.rows[1].id, 22); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=1, perPage=2 and ASC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.rows[1].id, 22); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination and with sorting +should return all found rows with search, pagination: page=2, perPage=2 and ASC sorting`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'id'; + const fieldvalue = '45'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[1].id, 22); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'id'; + const fieldvalue = '41'; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=10&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[1].id, 22); + t.is(getTableRowsRO.rows[2][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[2].id, 1); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 10); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'id'; + const fieldvalue = '41'; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=2&perPage=2&f_${fieldname}__lt=${fieldvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].id, 1); + + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} with search, with pagination, with sorting and with filtering +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'id'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + + t.is(getTableRowsRO.rows[0].id, 38); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} with search, with pagination, without sorting -should return all found rows with pagination page=1 perPage=3`, async (t) => { +test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -559,74 +1542,6 @@ should return all found rows with pagination page=1 perPage=3`, async (t) => { undefined, undefined, 3, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by DESC`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 42, QueryOrderingEnum.DESC, 'id', undefined, @@ -644,98 +1559,25 @@ should return all found rows with sorting ids by DESC`, async (t) => { .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); + const fieldname = 'id'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + createConnectionRO.id = ''; const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 42); - t.is(getTableRowsRO.rows[1].id, 41); - t.is(getTableRowsRO.rows[41].id, 1); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by ASC`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 42, - QueryOrderingEnum.ASC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}`) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.rows[1].id, 2); - t.is(getTableRowsRO.rows[41].id, 42); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsResponse.status, 404); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} without search and with pagination and with sorting -should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, async (t) => { +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -770,883 +1612,30 @@ should return all found rows with sorting ports by DESC and with pagination page .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 42); - t.is(getTableRowsRO.rows[1].id, 41); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const fieldname = 'id'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.rows[1].id, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=3`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 39); - t.is(getTableRowsRO.rows[1].id, 38); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.rows[1].id, 22); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=1, perPage=2 and ASC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.rows[1].id, 22); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination and with sorting -should return all found rows with search, pagination: page=2, perPage=2 and ASC sorting`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=2&perPage=2&search=${testSearchedUserName}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldvalue = '45'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[1].id, 22); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldvalue = '41'; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=10&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[1].id, 22); - t.is(getTableRowsRO.rows[2][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[2].id, 1); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 10); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldvalue = '41'; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=2&perPage=2&f_${fieldname}__lt=${fieldvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].id, 1); - - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} with search, with pagination, with sorting and with filtering -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - - t.is(getTableRowsRO.rows[0].id, 38); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); - -test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - createConnectionRO.id = ''; - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - createConnectionRO.id = faker.string.uuid(); - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, - ) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 403); - - const { message } = JSON.parse(getTableRowsResponse.text); - - t.is(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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const fieldname = 'id'; - const fieldGtvalue = '25'; - const fieldLtvalue = '40'; - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + createConnectionRO.id = faker.string.uuid(); const getTableRowsResponse = await request(app.getHttpServer()) .get( - `/table/rows/${createConnectionRO.id}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 400); + t.is(getTableRowsResponse.status, 403); const { message } = JSON.parse(getTableRowsResponse.text); - t.is(message, Messages.TABLE_NOT_FOUND); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); throw e; } }); -test.serial(`${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, async (t) => { +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { try { const createConnectionResponse = await request(app.getHttpServer()) .post('/connection') @@ -1681,31 +1670,92 @@ test.serial(`${currentTest} should return an array with searched fields when fil .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); - const fieldname = faker.lorem.words(1); + const fieldname = 'id'; const fieldGtvalue = '25'; const fieldLtvalue = '40'; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; const getTableRowsResponse = await request(app.getHttpServer()) .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + `/table/rows/${createConnectionRO.id}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, ) .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); + t.is(getTableRowsResponse.status, 400); + + const { message } = JSON.parse(getTableRowsResponse.text); - const getTablesRO = JSON.parse(getTableRowsResponse.text); - t.is(getTablesRO.rows.length, 2); - t.is(getTablesRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTablesRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTablesRO.hasOwnProperty('primaryColumns'), true); - t.is(getTablesRO.hasOwnProperty('pagination'), true); + t.is(message, Messages.TABLE_NOT_FOUND); } catch (e) { console.error(e); throw e; } }); +test.serial( + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createConnectionRO.id}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = faker.lorem.words(1); + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); + + const getTablesRO = JSON.parse(getTableRowsResponse.text); + t.is(getTablesRO.rows.length, 2); + t.is(getTablesRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTablesRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTablesRO.hasOwnProperty('primaryColumns'), true); + t.is(getTablesRO.hasOwnProperty('pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { testTables.push(testTableName); @@ -1904,9 +1954,6 @@ test.serial(`${currentTest} should add row in table and return result`, async (t t.is(rows[42][testTableSecondColumnName], row[testTableSecondColumnName]); t.is(rows[42].id, rows[41].id + 1); - - - // check that rows adding was logged const getLogsResponse = await request(app.getHttpServer()) @@ -1919,7 +1966,7 @@ test.serial(`${currentTest} should add row in table and return result`, async (t const getLogsRO = JSON.parse(getLogsResponse.text); t.is(getLogsRO.hasOwnProperty('logs'), true); t.is(getLogsRO.hasOwnProperty('pagination'), true); - t.is(getLogsRO.logs.length > 0 , true); + t.is(getLogsRO.logs.length > 0, true); const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); t.is(getLogsRO.logs[addRowLogIndex].hasOwnProperty('affected_primary_key'), true); t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); @@ -2347,68 +2394,74 @@ test.serial(`${currentTest} should throw an exception when primary key not passe t.is(message, Messages.PRIMARY_KEY_INVALID); }); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field name`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); -}); + t.is(updateRowInTableResponse.status, 400); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); + }, +); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field value`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=100000000`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - t.is(message, 'Failed to update row in table. No data returned from agent'); -}); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, +); currentTest = 'PUT /table/rows/update/:connectionId'; @@ -2739,73 +2792,79 @@ test.serial(`${currentTest} should throw an exception when primary key not passe t.is(deletedRowIndex < 0, false); }); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field name`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForDeletion = 1; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakePKey=1`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakePKey=1`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(deleteRowInTableResponse.status, 400); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); + t.is(deleteRowInTableResponse.status, 400); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); - //checking that the line wasn't deleted - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 200); + //checking that the line wasn't deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - const { rows, primaryColumns, pagination } = getTableRowsRO; + const { rows, primaryColumns, pagination } = getTableRowsRO; - t.is(rows.length, 42); - const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); -}); + t.is(rows.length, 42); + const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, false); + }, +); -test.serial(`${currentTest} should throw an exception when primary key passed in request has incorrect field value`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=100000`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 500); - t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); -}); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + }, +); currentTest = 'GET /table/row/:slug'; @@ -2867,30 +2926,33 @@ test.serial(`${currentTest} should throw an exception, when connection id is not t.is(foundRowInTableResponse.status, 404); }); -test.serial(`${currentTest} should throw an exception, when connection id passed in request is incorrect`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1; - createConnectionRO.id = faker.string.uuid(); - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1; + createConnectionRO.id = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 403); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); -}); + t.is(foundRowInTableResponse.status, 403); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + }, +); test.serial(`${currentTest} should throw an exception, when tableName in not passed in request`, async (t) => { testTables.push(testTableName); @@ -2965,55 +3027,61 @@ test.serial(`${currentTest} should throw an exception, when primary key is not p t.is(message, Messages.PRIMARY_KEY_INVALID); }); -test.serial(`${currentTest} should throw an exception, when primary key passed in request has incorrect name`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(foundRowInTableResponse.status, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); -}); + t.is(foundRowInTableResponse.status, 400); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.PRIMARY_KEY_INVALID); + }, +); -test.serial(`${currentTest} should throw an exception, when primary key passed in request has incorrect value`, async (t) => { - testTables.push(testTableName); +test.serial( + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const idForSearch = 1000000; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); - t.is(foundRowInTableResponse.status, 500); - // const {message} = JSON.parse(foundRowInTableResponse.text); - t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); -}); + const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); + t.is(foundRowInTableResponse.status, 500); + // const {message} = JSON.parse(foundRowInTableResponse.text); + t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + }, +); currentTest = 'PUT /table/rows/delete/:slug'; diff --git a/backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts index 5b30abd90..e05e15bbc 100644 --- a/backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts @@ -26,6 +26,8 @@ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -45,7 +47,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts index 48aecd163..28f9a2f15 100644 --- a/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts @@ -29,6 +29,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -54,7 +56,7 @@ test.before(async () => { app = moduleFixture.createNestApplication(); testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts index bfa5d9fec..6ff28fdf2 100644 --- a/backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts @@ -25,6 +25,8 @@ import { dropTestTables } from '../../utils/drop-test-tables.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 { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -44,7 +46,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -1346,80 +1348,83 @@ should return all found rows with search, pagination: page=1, perPage=2 and DESC }, ); -test.serial(`${currentTest} with pagination, with sorting and with filtering by date fields -should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToOracleDB; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestOracleTable(connectionToTestDB); +test.serial( + `${currentTest} with pagination, with sorting and with filtering by date fields +should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToOracleDB; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestOracleTable(connectionToTestDB); - testTables.push(testTableName); + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - undefined, - undefined, - undefined, - undefined, - undefined, - ); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + undefined, + undefined, + undefined, + undefined, + undefined, + ); - const firstFieldName = 'created_at'; - const secondFieldName = 'updated_at'; - const firstFieldValue = "2011-11-03"; + const firstFieldName = 'created_at'; + const secondFieldName = 'updated_at'; + const firstFieldValue = '2011-11-03'; - const filters = { - [firstFieldName]: { lt: firstFieldValue }, - }; + const filters = { + [firstFieldName]: { lt: firstFieldValue }, + }; - const getTableRowsResponse = await request(app.getHttpServer()) - .post(`/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) - .send({ filters }) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const getTableRowsResponse = await request(app.getHttpServer()) + .post(`/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=2`) + .send({ filters }) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 201); - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 201); + t.is(typeof getTableRowsRO, 'object'); + t.is(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].id, 1); - t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[1].id, 22); + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].id, 1); + t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[1].id, 22); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); + // t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( `${currentTest} with search, with pagination, with sorting and with filtering diff --git a/backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts index 678c2089a..661647ce1 100644 --- a/backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts @@ -22,6 +22,7 @@ import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-ret import { TestUtils } from '../../utils/test.utils.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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -39,7 +40,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts index a0ae430ef..c3d867504 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts @@ -29,6 +29,8 @@ import path from 'path'; import { fileURLToPath } from 'url'; import { join } from 'path'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -54,7 +56,7 @@ test.before(async () => { app = moduleFixture.createNestApplication(); testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts index 9b012ee0d..b0ace8a89 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts @@ -25,6 +25,8 @@ import { createTestTable } from '../../utils/create-test-table.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 { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -44,7 +46,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts index 512806512..d99c79659 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts @@ -22,6 +22,7 @@ import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-ret import { TestUtils } from '../../utils/test.utils.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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -40,7 +41,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts index 9ee2d5b8d..61f888209 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts @@ -22,6 +22,7 @@ import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-ret import { TestUtils } from '../../utils/test.utils.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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -39,7 +40,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/table-settings-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-settings-e2e.test.ts index f33ddd76f..94eacd996 100644 --- a/backend/test/ava-tests/saas-tests/table-settings-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-settings-e2e.test.ts @@ -18,6 +18,7 @@ import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-ret import { TestUtils } from '../../utils/test.utils.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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -33,7 +34,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { 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 943489459..a3f13b8ab 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 @@ -28,6 +28,7 @@ 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'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -47,7 +48,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { @@ -519,35 +520,32 @@ test.serial(`${currentTest} should return table widgets without deleted widget`, 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'); +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 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`, @@ -1474,175 +1472,178 @@ test.serial( ); // 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); +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; + const referencedOnTableTableName = `users`; + const referencedByTableName = `orders`; + const testTableColumnName = `user_name`; + const testReferencedColumnsName = `product_description`; + const referencedByColumnName = 'user_id'; + const referencedOnColumnName = 'id'; - try { - await dynamoDb.createTable(referencedOnTableTableNameTableParams); - await dynamoDb.createTable(referencedByTableTableNameTableParams); - } catch (error) { - console.error(`Error creating dynamodb table: ${error.message}`); - } + const dynamoDb = new DynamoDB({ + endpoint: connectionToTestDB.host, + credentials: { + accessKeyId: connectionToTestDB.username, + secretAccessKey: connectionToTestDB.password, + }, + region: 'localhost', + }); - const documentClient = DynamoDBDocumentClient.from(dynamoDb); + const referencedOnTableTableNameTableParams = { + TableName: referencedOnTableTableName, + KeySchema: [ + { AttributeName: 'id', KeyType: 'HASH' }, // Primary key + ], + AttributeDefinitions: [{ AttributeName: 'id', AttributeType: 'N' }], + ProvisionedThroughput: { + ReadCapacityUnits: 5, + WriteCapacityUnits: 5, + }, + } as any; - 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 }), + const referencedByTableTableNameTableParams = { + TableName: referencedByTableName, + KeySchema: [ + { AttributeName: 'id', KeyType: 'HASH' }, // Primary key + ], + AttributeDefinitions: [{ AttributeName: 'id', AttributeType: 'N' }], + ProvisionedThroughput: { + ReadCapacityUnits: 5, + WriteCapacityUnits: 5, }, - created_at: { S: new Date().toISOString() }, - updated_at: { S: new Date().toISOString() }, - }; + } as any; - const params: PutItemCommandInput = { - TableName: referencedOnTableTableName, - Item: item as any, - }; - await documentClient.send(new PutItemCommand(params)); - } + try { + await dynamoDb.createTable(referencedOnTableTableNameTableParams); + await dynamoDb.createTable(referencedByTableTableNameTableParams); + } catch (error) { + console.error(`Error creating dynamodb table: ${error.message}`); + } - 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 documentClient = DynamoDBDocumentClient.from(dynamoDb); - const params: PutItemCommandInput = { - TableName: referencedByTableName, - Item: item as any, + 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({}), + }, + ], }; - 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 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 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); - 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); - 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 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); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(getTableStructureResponse.status, 200); + t.is(getTableStructureRO.hasOwnProperty('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(getTableStructureRO.hasOwnProperty('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); - t.is(getTableStructureResponse.status, 200); - t.is(getTableStructureRO.hasOwnProperty('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(getTableStructureRO.hasOwnProperty('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); + // check table rows received with foreign keys from widget - t.is(getRowsResponse.status, 200); + 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(typeof getRowsRO.rows[0], 'object'); - for (const row of getRowsRO.rows) { - t.is(row.hasOwnProperty(referencedByColumnName), true); - t.is(row[referencedByColumnName].hasOwnProperty('id'), true); - } -}); + t.is(getRowsResponse.status, 200); + + t.is(typeof getRowsRO.rows[0], 'object'); + for (const row of getRowsRO.rows) { + t.is(row.hasOwnProperty(referencedByColumnName), true); + t.is(row[referencedByColumnName].hasOwnProperty('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 32ddb3660..d4bff72e8 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 @@ -22,6 +22,7 @@ import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-use import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; import { ErrorsMessages } from '../../../src/exceptions/custom-exceptions/messages/custom-errors-messages.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; @@ -39,7 +40,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/ava-tests/saas-tests/user-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-e2e.test.ts index a822859fc..335b4de4d 100644 --- a/backend/test/ava-tests/saas-tests/user-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-e2e.test.ts @@ -24,10 +24,12 @@ import { Constants } from '../../../src/helpers/constants/constants.js'; import { getTestData } from '../../utils/get-test-data.js'; import { createTestTable } from '../../utils/create-test-table.js'; import { MockFactory } from '../../mock.factory.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let currentTest: string; let testUtils: TestUtils; + const mockFactory = new MockFactory(); test.before(async () => { @@ -39,7 +41,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { 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 c80f7c254..50e94d023 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 @@ -22,6 +22,7 @@ import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-use import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; import { ErrorsMessages } from '../../../src/exceptions/custom-exceptions/messages/custom-errors-messages.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; let app: INestApplication; let testUtils: TestUtils; @@ -48,7 +49,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { 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 e1f37a697..af0db9998 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 @@ -21,6 +21,7 @@ import { createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnection 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'; let app: INestApplication; let testUtils: TestUtils; @@ -47,7 +48,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { 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 5e85b80f5..01631b638 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 @@ -21,6 +21,7 @@ import { createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions } f 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'; let app: INestApplication; let testUtils: TestUtils; @@ -47,7 +48,7 @@ test.before(async () => { testUtils = moduleFixture.get(TestUtils); app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); app.useGlobalPipes( new ValidationPipe({ exceptionFactory(validationErrors: ValidationError[] = []) { diff --git a/backend/test/mock.factory.ts b/backend/test/mock.factory.ts index 4f7dcff7a..78abae279 100644 --- a/backend/test/mock.factory.ts +++ b/backend/test/mock.factory.ts @@ -652,7 +652,7 @@ export class MockFactory { /* eslint-disable */ newWidgetDTO.field_name = 'id'; newWidgetDTO.widget_type = WidgetTypeEnum.Password; - newWidgetDTO.widget_params = JSON.stringify({ a: '*', b: '+', c: '#' }); + newWidgetDTO.widget_params = JSON.stringify({ a: '*', b: '+', c: '#', encrypt: false }); newWidgetDTO.name = 'new widget'; newWidgetDTO.description = 'test widget'; /* eslint-enable */ @@ -665,13 +665,13 @@ export class MockFactory { /* eslint-disable */ newWidgetDTO.field_name = 'database'; newWidgetDTO.widget_type = WidgetTypeEnum.Password; - newWidgetDTO.widget_params = json5.stringify({ a: '*', b: '+', c: '#' }); + newWidgetDTO.widget_params = json5.stringify({ a: '*', b: '+', c: '#', encrypt: false }); newWidgetDTO.name = 'new widget'; newWidgetDTO.description = 'test widget'; const newWidgetDTO2 = new CreateTableWidgetDto(); newWidgetDTO2.field_name = 'id'; newWidgetDTO2.widget_type = WidgetTypeEnum.Password; - newWidgetDTO2.widget_params = json5.stringify({ a: '&', b: '!!', c: '||' }); + newWidgetDTO2.widget_params = json5.stringify({ a: '&', b: '!!', c: '||', encrypt: false }); newWidgetDTO2.name = 'new widget'; newWidgetDTO2.description = 'test 2 widget'; /* eslint-enable */ @@ -686,13 +686,13 @@ export class MockFactory { /* eslint-disable */ newWidgetDTO.field_name = secondFieldName; newWidgetDTO.widget_type = WidgetTypeEnum.Password; - newWidgetDTO.widget_params = JSON.stringify({ a: '*', b: '+', c: '#' }); + newWidgetDTO.widget_params = JSON.stringify({ a: '*', b: '+', c: '#', encrypt: false }); newWidgetDTO.name = 'new widget'; newWidgetDTO.description = 'test widget'; const newWidgetDTO2 = new CreateTableWidgetDto(); newWidgetDTO2.field_name = firstFieldName; newWidgetDTO2.widget_type = WidgetTypeEnum.Password; - newWidgetDTO2.widget_params = JSON.stringify({ a: '&', b: '!!', c: '||' }); + newWidgetDTO2.widget_params = JSON.stringify({ a: '&', b: '!!', c: '||', encrypt: false }); newWidgetDTO2.name = 'new widget'; newWidgetDTO2.description = 'test 2 widget'; /* eslint-enable */ @@ -707,13 +707,13 @@ export class MockFactory { /* eslint-disable */ newWidgetDTO.field_name = 'database'; newWidgetDTO.widget_type = WidgetTypeEnum.Password; - newWidgetDTO.widget_params = json5.stringify({ a: '&', b: '+', c: '#' }); + newWidgetDTO.widget_params = json5.stringify({ a: '&', b: '+', c: '#', encrypt: false }); newWidgetDTO.name = 'new updated widget'; newWidgetDTO.description = 'updated test widget'; const newWidgetDTO2 = new CreateTableWidgetDto(); newWidgetDTO2.field_name = 'id'; newWidgetDTO2.widget_type = WidgetTypeEnum.Password; - newWidgetDTO2.widget_params = json5.stringify({ a: '-', b: '!!', c: '||' }); + newWidgetDTO2.widget_params = json5.stringify({ a: '-', b: '!!', c: '||', encrypt: false }); newWidgetDTO2.name = 'new updated widget'; newWidgetDTO2.description = 'updated test 2 widget'; /* eslint-enable */ @@ -728,13 +728,13 @@ export class MockFactory { /* eslint-disable */ newWidgetDTO.field_name = 'email'; newWidgetDTO.widget_type = WidgetTypeEnum.Password; - newWidgetDTO.widget_params = JSON.stringify({ a: '&', b: '+', c: '#' }); + newWidgetDTO.widget_params = JSON.stringify({ a: '&', b: '+', c: '#', encrypt: false }); newWidgetDTO.name = 'new updated widget'; newWidgetDTO.description = 'updated test widget'; const newWidgetDTO2 = new CreateTableWidgetDto(); newWidgetDTO2.field_name = 'id'; newWidgetDTO2.widget_type = WidgetTypeEnum.Password; - newWidgetDTO2.widget_params = JSON.stringify({ a: '-', b: '!!', c: '||' }); + newWidgetDTO2.widget_params = JSON.stringify({ a: '-', b: '!!', c: '||', encrypt: false }); newWidgetDTO2.name = 'new updated widget'; newWidgetDTO2.description = 'updated test 2 widget'; /* eslint-enable */ diff --git a/backend/test/utils/user-with-different-permissions-utils.ts b/backend/test/utils/user-with-different-permissions-utils.ts index d0b9727f0..cd687228a 100644 --- a/backend/test/utils/user-with-different-permissions-utils.ts +++ b/backend/test/utils/user-with-different-permissions-utils.ts @@ -17,6 +17,7 @@ export async function createConnectionsAndInviteNewUserInNewGroupInFirstConnecti secondId: null, firstAdminGroupId: null, }; + const mockFactory = new MockFactory(); const connectionAdminUserInfo = await registerUserAndReturnUserInfo(app); const simpleUserRegisterInfo = await inviteUserInCompanyAndAcceptInvitation( @@ -140,6 +141,7 @@ export async function createConnectionsAndInviteNewUserInNewGroupWithGroupPermis secondId: null, firstAdminGroupId: null, }; + const mockFactory = new MockFactory(); const connectionAdminUserInfo = await registerUserAndReturnUserInfo(app); const simpleUserRegisterInfo = await inviteUserInCompanyAndAcceptInvitation( @@ -273,6 +275,7 @@ export async function createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePe secondId: null, firstAdminGroupId: null, }; + const mockFactory = new MockFactory(); const connectionAdminUserInfo = await registerUserAndReturnUserInfo(app); const simpleUserRegisterInfo = await inviteUserInCompanyAndAcceptInvitation( @@ -427,6 +430,7 @@ export async function createConnectionsAndInviteNewUserInNewGroupWithTableDiffer secondId: null, firstAdminGroupId: null, }; + const mockFactory = new MockFactory(); const connectionAdminUserInfo = await registerUserAndReturnUserInfo(app); const simpleUserRegisterInfo = await inviteUserInCompanyAndAcceptInvitation( @@ -551,6 +555,7 @@ export async function createConnectionsAndInviteNewUserInAdminGroupOfFirstConnec secondId: null, firstAdminGroupId: null, }; + const mockFactory = new MockFactory(); const connectionAdminUserInfo = await registerUserAndReturnUserInfo(app); const simpleUserRegisterInfo = await inviteUserInCompanyAndAcceptInvitation(