diff --git a/backend/src/entities/user/user-helper.service.ts b/backend/src/entities/user/user-helper.service.ts index 56942f76a..2c6166e68 100644 --- a/backend/src/entities/user/user-helper.service.ts +++ b/backend/src/entities/user/user-helper.service.ts @@ -1,26 +1,11 @@ -import { Injectable, OnModuleInit } from '@nestjs/common'; -import { isSaaS } from '../../helpers/app/is-saas.js'; +import { Injectable } from '@nestjs/common'; import { FoundUserInGroupDs } from './application/data-structures/found-user-in-group.ds.js'; import { FoundUserDto } from './dto/found-user.dto.js'; import { UserEntity } from './user.entity.js'; import { getUserIntercomHash } from './utils/get-user-intercom-hash.js'; -import { Encryptor } from '../../helpers/encryption/encryptor.js'; -import { CompanyInfoEntity } from '../company-info/company-info.entity.js'; -import { RegisterUserDs } from './application/data-structures/register-user-ds.js'; -import { UserRoleEnum } from './enums/user-role.enum.js'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { buildRegisteringUser } from './utils/build-registering-user.util.js'; @Injectable() -export class UserHelperService implements OnModuleInit { - constructor( - @InjectRepository(UserEntity) - private readonly userRepository: Repository, - @InjectRepository(CompanyInfoEntity) - private readonly companyInfoRepository: Repository, - ) {} - +export class UserHelperService { public buildFoundUserInGroupDs(user: UserEntity): FoundUserInGroupDs { return { id: user.id, @@ -50,35 +35,4 @@ export class UserHelperService implements OnModuleInit { show_test_connections: user.showTestConnections, }; } - - public async onModuleInit(): Promise { - if (isSaaS() || process.env.NODE_ENV !== 'test') { - return; - } - const email = (process.env.ADMIN_EMAIL || 'admin@email.local').toLowerCase(); - const password = - process.env.ADMIN_PASSWORD || - (process.env.NODE_ENV === 'test' ? 'test12345' : Encryptor.generateRandomString(10)); - - const foundTestUser = await this.userRepository.findOneBy({ email: email }); - if (foundTestUser) { - return; - } - - const registerUserData: RegisterUserDs = { - email: email, - password: password, - isActive: true, - gclidValue: null, - name: 'Admin', - role: UserRoleEnum.ADMIN, - }; - const savedUser = await this.userRepository.save(buildRegisteringUser(registerUserData)); - const newCompanyInfo = new CompanyInfoEntity(); - newCompanyInfo.id = Encryptor.generateUUID(); - const savedCompanyInfo = await this.companyInfoRepository.save(newCompanyInfo); - savedUser.company = savedCompanyInfo; - await this.userRepository.save(savedUser); - console.info(`Admin user created with email: "${email}" and password: "${password}"`); - } } diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-ai-chat-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-ai-chat-e2e.test.ts index 944edf34f..6d3806a2b 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-ai-chat-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-ai-chat-e2e.test.ts @@ -12,7 +12,7 @@ import { Cacher } from '../../../src/helpers/cache/cacher.js'; import { DatabaseModule } from '../../../src/shared/database/database.module.js'; import { DatabaseService } from '../../../src/shared/database/database.service.js'; import { MockFactory } from '../../mock.factory.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { TestUtils } from '../../utils/test.utils.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -77,6 +77,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-app-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-app-e2e.test.ts index c90c4bd53..e85362d0c 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-app-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-app-e2e.test.ts @@ -8,31 +8,33 @@ import { DatabaseService } from '../../../src/shared/database/database.service.j import { DatabaseModule } from '../../../src/shared/database/database.module.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; let app: INestApplication; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService], - }).compile(); - app = moduleFixture.createNestApplication(); - await app.init(); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService], + }).compile(); + app = moduleFixture.createNestApplication(); + await app.init(); + await createInitialTestUser(app); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error('After tests error ' + e); + } }); test.serial(' > get hello', async (t) => { - const result = await request(app.getHttpServer()).get('/hello'); - const responseText = result.text; - t.assert('Hello World!', responseText); - t.pass(); + const result = await request(app.getHttpServer()).get('/hello'); + const responseText = result.text; + t.assert('Hello World!', responseText); + t.pass(); }); 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 e8fb849c1..faf501f18 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 @@ -22,6 +22,7 @@ import { MockFactory } from '../../mock.factory.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { TestUtils } from '../../utils/test.utils.js'; import { createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions } from '../../utils/user-with-different-permissions-utils.js'; +import { createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; const _mockFactory = new MockFactory(); let app: INestApplication; @@ -47,6 +48,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 a95a03a25..db722fd3e 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 @@ -15,6 +15,7 @@ import { TestUtils } from '../../utils/test.utils.js'; import { inviteUserInCompanyAndAcceptInvitation, registerUserAndReturnUserInfo, + createInitialTestUser, } from '../../utils/register-user-and-return-user-info.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -49,6 +50,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 4c24e0e9b..c7acb830a 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 @@ -11,7 +11,7 @@ import { DatabaseService } from '../../../src/shared/database/database.service.j import { MockFactory } from '../../mock.factory.js'; import { getTestKnex } from '../../utils/get-test-knex.js'; import { TestUtils } from '../../utils/test.utils.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; @@ -48,6 +48,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 83c9ee91a..cc4b4e70d 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 @@ -9,7 +9,7 @@ import { INestApplication, ValidationPipe } from '@nestjs/common'; import { MockFactory } from '../../mock.factory.js'; import { Encryptor } from '../../../src/helpers/encryption/encryptor.js'; import test from 'ava'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { getTestData } from '../../utils/get-test-data.js'; import request from 'supertest'; import { replaceTextInCurlies } from '../../../src/helpers/index.js'; @@ -56,6 +56,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-dashboard-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-dashboard-e2e.test.ts index f34350df8..fa046ff5a 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-dashboard-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-dashboard-e2e.test.ts @@ -15,7 +15,7 @@ import { DatabaseModule } from '../../../src/shared/database/database.module.js' import { DatabaseService } from '../../../src/shared/database/database.service.js'; import { MockFactory } from '../../mock.factory.js'; import { getTestData } from '../../utils/get-test-data.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { TestUtils } from '../../utils/test.utils.js'; import { DashboardWidgetTypeEnum } from '../../../src/enums/dashboard-widget-type.enum.js'; @@ -46,6 +46,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 71dc4db37..4ab8a4c9b 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 @@ -12,6 +12,7 @@ import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filt import { inviteUserInCompanyAndAcceptInvitation, registerUserAndReturnUserInfo, + createInitialTestUser, } from '../../utils/register-user-and-return-user-info.js'; import { getTestData } from '../../utils/get-test-data.js'; import request from 'supertest'; @@ -57,6 +58,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 c90cc0d4e..c8de72090 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 @@ -11,7 +11,7 @@ import { DatabaseModule } from '../../../src/shared/database/database.module.js' import { DatabaseService } from '../../../src/shared/database/database.service.js'; import cookieParser from 'cookie-parser'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { getTestData } from '../../utils/get-test-data.js'; import request from 'supertest'; import { AccessLevelEnum } from '../../../src/enums/index.js'; @@ -46,6 +46,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 a98f072c6..05d8bca69 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 @@ -13,7 +13,7 @@ import { DatabaseModule } from '../../../src/shared/database/database.module.js' import { DatabaseService } from '../../../src/shared/database/database.service.js'; import { MockFactory } from '../../mock.factory.js'; import { getTestData } from '../../utils/get-test-data.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { getTestKnex } from '../../utils/get-test-knex.js'; import { hexToBinary } from '../../../src/helpers/binary-to-hex.js'; @@ -47,6 +47,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts index 42d9cf1be..05f4b6581 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts @@ -1,25 +1,28 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { faker } from "@faker-js/faker"; -import { INestApplication, ValidationPipe } from "@nestjs/common"; -import { Test } from "@nestjs/testing"; -import test from "ava"; -import { ValidationError } from "class-validator"; -import cookieParser from "cookie-parser"; -import request from "supertest"; -import { ApplicationModule } from "../../../src/app.module.js"; -import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; -import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; -import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; -import { Messages } from "../../../src/exceptions/text/messages.js"; -import { Cacher } from "../../../src/helpers/cache/cacher.js"; -import { DatabaseModule } from "../../../src/shared/database/database.module.js"; -import { DatabaseService } from "../../../src/shared/database/database.service.js"; -import { MockFactory } from "../../mock.factory.js"; -import { getRandomTestTableName } from "../../utils/get-random-test-table-name.js"; -import { getTestData } from "../../utils/get-test-data.js"; -import { getTestKnex } from "../../utils/get-test-knex.js"; -import { registerUserAndReturnUserInfo } from "../../utils/register-user-and-return-user-info.js"; -import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; +import { faker } from '@faker-js/faker'; +import { INestApplication, ValidationPipe } from '@nestjs/common'; +import { Test } from '@nestjs/testing'; +import test from 'ava'; +import { ValidationError } from 'class-validator'; +import cookieParser from 'cookie-parser'; +import request from 'supertest'; +import { ApplicationModule } from '../../../src/app.module.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; +import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; +import { Messages } from '../../../src/exceptions/text/messages.js'; +import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { DatabaseModule } from '../../../src/shared/database/database.module.js'; +import { DatabaseService } from '../../../src/shared/database/database.service.js'; +import { MockFactory } from '../../mock.factory.js'; +import { getRandomTestTableName } from '../../utils/get-random-test-table-name.js'; +import { getTestData } from '../../utils/get-test-data.js'; +import { getTestKnex } from '../../utils/get-test-knex.js'; +import { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; +import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; const mockFactory = new MockFactory(); let app: INestApplication; @@ -27,11 +30,7 @@ let currentTest: string; // Helper to setup user with connection, secrets, table with S3 widget, and row data async function setupS3WidgetTestEnvironment( - options: { - createSecrets?: boolean; - createWidget?: boolean; - s3FieldName?: string; - } = {}, + options: { createSecrets?: boolean; createWidget?: boolean; s3FieldName?: string } = {}, ): Promise<{ token: string; connectionId: string; @@ -39,55 +38,48 @@ async function setupS3WidgetTestEnvironment( fieldName: string; rowPrimaryKey: Record; }> { - const { - createSecrets = true, - createWidget = true, - s3FieldName = "file_key", - } = options; + const { createSecrets = true, createWidget = true, s3FieldName = 'file_key' } = options; const { token } = await registerUserAndReturnUserInfo(app); const connectionToPostgres = getTestData(mockFactory).connectionToPostgres; // Create test table with S3 field - const { testTableName } = await createTestTableWithS3Field( - connectionToPostgres, - s3FieldName, - ); + const { testTableName } = await createTestTableWithS3Field(connectionToPostgres, s3FieldName); // Create connection const createdConnection = await request(app.getHttpServer()) - .post("/connection") + .post('/connection') .send(connectionToPostgres) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const connectionId = JSON.parse(createdConnection.text).id; // Create secrets for AWS credentials if (createSecrets) { await request(app.getHttpServer()) - .post("/secrets") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json") + .post('/secrets') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') .send({ - slug: "test-aws-access-key", - value: "AKIAIOSFODNN7EXAMPLE", + slug: 'test-aws-access-key', + value: 'AKIAIOSFODNN7EXAMPLE', masterEncryption: false, }); await request(app.getHttpServer()) - .post("/secrets") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json") + .post('/secrets') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') .send({ - slug: "test-aws-secret-key", - value: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + slug: 'test-aws-secret-key', + value: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', masterEncryption: false, }); } @@ -95,21 +87,21 @@ async function setupS3WidgetTestEnvironment( // Create S3 widget for the field if (createWidget) { const s3WidgetParams = JSON.stringify({ - bucket: "test-bucket", - prefix: "uploads", - region: "us-east-1", - aws_access_key_id_secret_name: "test-aws-access-key", - aws_secret_access_key_secret_name: "test-aws-secret-key", + bucket: 'test-bucket', + prefix: 'uploads', + region: 'us-east-1', + aws_access_key_id_secret_name: 'test-aws-access-key', + aws_secret_access_key_secret_name: 'test-aws-secret-key', }); const widgetDto = { widgets: [ { field_name: s3FieldName, - widget_type: "S3", + widget_type: 'S3', widget_params: s3WidgetParams, - name: "S3 File Widget", - description: "Test S3 widget", + name: 'S3 File Widget', + description: 'Test S3 widget', }, ], }; @@ -117,10 +109,10 @@ async function setupS3WidgetTestEnvironment( await request(app.getHttpServer()) .post(`/widget/${connectionId}?tableName=${testTableName}`) .send(widgetDto) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); } return { @@ -138,11 +130,11 @@ async function createTestTableWithS3Field( s3FieldName: string, ): Promise<{ testTableName: string; testTableColumnName: string }> { const testTableName = getRandomTestTableName(); - const testTableColumnName = "name"; + const testTableColumnName = 'name'; const Knex = getTestKnex(connectionParams); await Knex.schema.createTable(testTableName, (table) => { - table.increments("id"); + table.increments('id'); table.string(testTableColumnName); table.string(s3FieldName); // Field to store S3 file key table.timestamps(); @@ -150,8 +142,8 @@ async function createTestTableWithS3Field( // Insert test row with file key await Knex(testTableName).insert({ - [testTableColumnName]: "Test User", - [s3FieldName]: "uploads/test-file.pdf", + [testTableColumnName]: 'Test User', + [s3FieldName]: 'uploads/test-file.pdf', created_at: new Date(), updated_at: new Date(), }); @@ -177,6 +169,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); @@ -185,493 +178,389 @@ test.after(async () => { await Cacher.clearAllCache(); await app.close(); } catch (e) { - console.error("After tests error " + e); + console.error('After tests error ' + e); } }); // ==================== GET /s3/file/:connectionId Tests ==================== -currentTest = "GET /s3/file/:connectionId"; - -test.serial( - `${currentTest} - should return 403 when user tries to access another user's connection`, - async (t) => { - // First user creates connection - const { connectionId, tableName, fieldName, rowPrimaryKey } = - await setupS3WidgetTestEnvironment(); - - // Second user tries to access first user's connection - const { token: secondUserToken } = await registerUserAndReturnUserInfo(app); - - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, - ) - .set("Cookie", secondUserToken) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 403); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); - }, -); - -test.serial( - `${currentTest} - should return 403 when using fake connection ID`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const fakeConnectionId = faker.string.uuid(); - - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${fakeConnectionId}?tableName=test_table&fieldName=file_key&rowPrimaryKey=${JSON.stringify({ id: 1 })}`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 403); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); - }, -); - -test.serial( - `${currentTest} - should return 400 when tableName is missing`, - async (t) => { - const { token, connectionId, fieldName, rowPrimaryKey } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - }, -); - -test.serial( - `${currentTest} - should return 400 when fieldName is missing`, - async (t) => { - const { token, connectionId, tableName, rowPrimaryKey } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "Field name is required"); - }, -); - -test.serial( - `${currentTest} - should return 400 when rowPrimaryKey is missing`, - async (t) => { - const { token, connectionId, tableName, fieldName } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "Row primary key is required"); - }, -); - -test.serial( - `${currentTest} - should return 400 when rowPrimaryKey has invalid JSON format`, - async (t) => { - const { token, connectionId, tableName, fieldName } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=invalid-json`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "Invalid row primary key format"); - }, -); - -test.serial( - `${currentTest} - should return 400 when S3 widget is not configured for the field`, - async (t) => { - const { token, connectionId, tableName, rowPrimaryKey } = - await setupS3WidgetTestEnvironment({ - createWidget: false, - }); +currentTest = 'GET /s3/file/:connectionId'; - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&fieldName=file_key&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "S3 widget not configured for this field"); - }, -); - -test.serial( - `${currentTest} - should return 404 when row with primary key not found`, - async (t) => { - const { token, connectionId, tableName, fieldName } = - await setupS3WidgetTestEnvironment(); - - // Use a primary key that doesn't exist - const nonExistentPrimaryKey = { id: 99999 }; - - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(nonExistentPrimaryKey)}`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 404); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, -); - -test.serial( - `${currentTest} - should return 404 when AWS credentials secrets are not found`, - async (t) => { - const { token, connectionId, tableName, fieldName, rowPrimaryKey } = - await setupS3WidgetTestEnvironment({ - createSecrets: false, - }); +test.serial(`${currentTest} - should return 403 when user tries to access another user's connection`, async (t) => { + // First user creates connection + const { connectionId, tableName, fieldName, rowPrimaryKey } = await setupS3WidgetTestEnvironment(); + + // Second user tries to access first user's connection + const { token: secondUserToken } = await registerUserAndReturnUserInfo(app); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set('Cookie', secondUserToken) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 403); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); +}); + +test.serial(`${currentTest} - should return 403 when using fake connection ID`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const fakeConnectionId = faker.string.uuid(); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${fakeConnectionId}?tableName=test_table&fieldName=file_key&rowPrimaryKey=${JSON.stringify({ id: 1 })}`, + ) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 403); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); +}); + +test.serial(`${currentTest} - should return 400 when tableName is missing`, async (t) => { + const { token, connectionId, fieldName, rowPrimaryKey } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get(`/s3/file/${connectionId}?fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); +}); + +test.serial(`${currentTest} - should return 400 when fieldName is missing`, async (t) => { + const { token, connectionId, tableName, rowPrimaryKey } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get(`/s3/file/${connectionId}?tableName=${tableName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'Field name is required'); +}); + +test.serial(`${currentTest} - should return 400 when rowPrimaryKey is missing`, async (t) => { + const { token, connectionId, tableName, fieldName } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get(`/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'Row primary key is required'); +}); - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 404); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "AWS credentials secrets not found"); - }, -); +test.serial(`${currentTest} - should return 400 when rowPrimaryKey has invalid JSON format`, async (t) => { + const { token, connectionId, tableName, fieldName } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get(`/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=invalid-json`) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'Invalid row primary key format'); +}); + +test.serial(`${currentTest} - should return 400 when S3 widget is not configured for the field`, async (t) => { + const { token, connectionId, tableName, rowPrimaryKey } = await setupS3WidgetTestEnvironment({ + createWidget: false, + }); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=file_key&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'S3 widget not configured for this field'); +}); + +test.serial(`${currentTest} - should return 404 when row with primary key not found`, async (t) => { + const { token, connectionId, tableName, fieldName } = await setupS3WidgetTestEnvironment(); + + // Use a primary key that doesn't exist + const nonExistentPrimaryKey = { id: 99999 }; + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(nonExistentPrimaryKey)}`, + ) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 404); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); +}); + +test.serial(`${currentTest} - should return 404 when AWS credentials secrets are not found`, async (t) => { + const { token, connectionId, tableName, fieldName, rowPrimaryKey } = await setupS3WidgetTestEnvironment({ + createSecrets: false, + }); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 404); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'AWS credentials secrets not found'); +}); // ==================== POST /s3/upload-url/:connectionId Tests ==================== -currentTest = "POST /s3/upload-url/:connectionId"; - -test.serial( - `${currentTest} - should return 403 when user tries to access another user's connection`, - async (t) => { - // First user creates connection - const { connectionId, tableName, fieldName } = - await setupS3WidgetTestEnvironment(); - - // Second user tries to access first user's connection - const { token: secondUserToken } = await registerUserAndReturnUserInfo(app); - - const response = await request(app.getHttpServer()) - .post( - `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, - ) - .send({ filename: "test.pdf", contentType: "application/pdf" }) - .set("Cookie", secondUserToken) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 403); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); - }, -); - -test.serial( - `${currentTest} - should return 403 when using fake connection ID`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const fakeConnectionId = faker.string.uuid(); - - const response = await request(app.getHttpServer()) - .post( - `/s3/upload-url/${fakeConnectionId}?tableName=test_table&fieldName=file_key`, - ) - .send({ filename: "test.pdf", contentType: "application/pdf" }) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 403); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); - }, -); - -test.serial( - `${currentTest} - should return 400 when tableName is missing`, - async (t) => { - const { token, connectionId, fieldName } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .post(`/s3/upload-url/${connectionId}?fieldName=${fieldName}`) - .send({ filename: "test.pdf", contentType: "application/pdf" }) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - }, -); - -test.serial( - `${currentTest} - should return 400 when fieldName is missing`, - async (t) => { - const { token, connectionId, tableName } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .post(`/s3/upload-url/${connectionId}?tableName=${tableName}`) - .send({ filename: "test.pdf", contentType: "application/pdf" }) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "Field name is required"); - }, -); - -test.serial( - `${currentTest} - should return 400 when filename is missing`, - async (t) => { - const { token, connectionId, tableName, fieldName } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .post( - `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, - ) - .send({ contentType: "application/pdf" }) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "Filename is required"); - }, -); - -test.serial( - `${currentTest} - should return 400 when contentType is missing`, - async (t) => { - const { token, connectionId, tableName, fieldName } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .post( - `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, - ) - .send({ filename: "test.pdf" }) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "Content type is required"); - }, -); - -test.serial( - `${currentTest} - should return 400 when S3 widget is not configured for the field`, - async (t) => { - const { token, connectionId, tableName } = - await setupS3WidgetTestEnvironment({ - createWidget: false, - }); +currentTest = 'POST /s3/upload-url/:connectionId'; - const response = await request(app.getHttpServer()) - .post( - `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=file_key`, - ) - .send({ filename: "test.pdf", contentType: "application/pdf" }) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 400); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "S3 widget not configured for this field"); - }, -); - -test.serial( - `${currentTest} - should return 404 when AWS credentials secrets are not found`, - async (t) => { - const { token, connectionId, tableName, fieldName } = - await setupS3WidgetTestEnvironment({ - createSecrets: false, - }); +test.serial(`${currentTest} - should return 403 when user tries to access another user's connection`, async (t) => { + // First user creates connection + const { connectionId, tableName, fieldName } = await setupS3WidgetTestEnvironment(); + + // Second user tries to access first user's connection + const { token: secondUserToken } = await registerUserAndReturnUserInfo(app); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`) + .send({ filename: 'test.pdf', contentType: 'application/pdf' }) + .set('Cookie', secondUserToken) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 403); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); +}); - const response = await request(app.getHttpServer()) - .post( - `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, - ) - .send({ filename: "test.pdf", contentType: "application/pdf" }) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 404); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, "AWS credentials secrets not found"); - }, -); +test.serial(`${currentTest} - should return 403 when using fake connection ID`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const fakeConnectionId = faker.string.uuid(); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${fakeConnectionId}?tableName=test_table&fieldName=file_key`) + .send({ filename: 'test.pdf', contentType: 'application/pdf' }) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 403); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); +}); + +test.serial(`${currentTest} - should return 400 when tableName is missing`, async (t) => { + const { token, connectionId, fieldName } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?fieldName=${fieldName}`) + .send({ filename: 'test.pdf', contentType: 'application/pdf' }) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); +}); + +test.serial(`${currentTest} - should return 400 when fieldName is missing`, async (t) => { + const { token, connectionId, tableName } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?tableName=${tableName}`) + .send({ filename: 'test.pdf', contentType: 'application/pdf' }) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'Field name is required'); +}); + +test.serial(`${currentTest} - should return 400 when filename is missing`, async (t) => { + const { token, connectionId, tableName, fieldName } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`) + .send({ contentType: 'application/pdf' }) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'Filename is required'); +}); + +test.serial(`${currentTest} - should return 400 when contentType is missing`, async (t) => { + const { token, connectionId, tableName, fieldName } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`) + .send({ filename: 'test.pdf' }) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'Content type is required'); +}); + +test.serial(`${currentTest} - should return 400 when S3 widget is not configured for the field`, async (t) => { + const { token, connectionId, tableName } = await setupS3WidgetTestEnvironment({ + createWidget: false, + }); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=file_key`) + .send({ filename: 'test.pdf', contentType: 'application/pdf' }) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'S3 widget not configured for this field'); +}); + +test.serial(`${currentTest} - should return 404 when AWS credentials secrets are not found`, async (t) => { + const { token, connectionId, tableName, fieldName } = await setupS3WidgetTestEnvironment({ + createSecrets: false, + }); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`) + .send({ filename: 'test.pdf', contentType: 'application/pdf' }) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 404); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'AWS credentials secrets not found'); +}); // ==================== Authorization Tests - Multiple Users ==================== -currentTest = "S3 Widget Authorization"; - -test.serial( - `${currentTest} - user A cannot get file URL from user B's connection`, - async (t) => { - // User A sets up their environment - const userA = await setupS3WidgetTestEnvironment(); - - // User B registers - const { token: userBToken } = await registerUserAndReturnUserInfo(app); - - // User B tries to get file URL from User A's connection - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${userA.connectionId}?tableName=${userA.tableName}&fieldName=${userA.fieldName}&rowPrimaryKey=${JSON.stringify(userA.rowPrimaryKey)}`, - ) - .set("Cookie", userBToken) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - }, -); - -test.serial( - `${currentTest} - user A cannot get upload URL from user B's connection`, - async (t) => { - // User A sets up their environment - const userA = await setupS3WidgetTestEnvironment(); - - // User B registers - const { token: userBToken } = await registerUserAndReturnUserInfo(app); - - // User B tries to get upload URL from User A's connection - const response = await request(app.getHttpServer()) - .post( - `/s3/upload-url/${userA.connectionId}?tableName=${userA.tableName}&fieldName=${userA.fieldName}`, - ) - .send({ filename: "malicious.pdf", contentType: "application/pdf" }) - .set("Cookie", userBToken) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - }, -); - -test.serial( - `${currentTest} - user can access their own connection successfully`, - async (t) => { - // User sets up their environment - this should work without permission errors - // Note: The actual S3 call may fail (no real AWS), but we should not get 403 - const { token, connectionId, tableName, fieldName, rowPrimaryKey } = - await setupS3WidgetTestEnvironment(); - - const response = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, - ) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - // Should not be 403 - may fail at S3 level but authorization passes - t.not(response.status, 403); - }, -); - -test.serial( - `${currentTest} - unauthenticated user cannot access S3 endpoints`, - async (t) => { - const { connectionId, tableName, fieldName, rowPrimaryKey } = - await setupS3WidgetTestEnvironment(); - - // Try to access without authentication token - const getFileResponse = await request(app.getHttpServer()) - .get( - `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, - ) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(getFileResponse.status, 401); - - const uploadUrlResponse = await request(app.getHttpServer()) - .post( - `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, - ) - .send({ filename: "test.pdf", contentType: "application/pdf" }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(uploadUrlResponse.status, 401); - }, -); +currentTest = 'S3 Widget Authorization'; + +test.serial(`${currentTest} - user A cannot get file URL from user B's connection`, async (t) => { + // User A sets up their environment + const userA = await setupS3WidgetTestEnvironment(); + + // User B registers + const { token: userBToken } = await registerUserAndReturnUserInfo(app); + + // User B tries to get file URL from User A's connection + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${userA.connectionId}?tableName=${userA.tableName}&fieldName=${userA.fieldName}&rowPrimaryKey=${JSON.stringify(userA.rowPrimaryKey)}`, + ) + .set('Cookie', userBToken) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); +}); + +test.serial(`${currentTest} - user A cannot get upload URL from user B's connection`, async (t) => { + // User A sets up their environment + const userA = await setupS3WidgetTestEnvironment(); + + // User B registers + const { token: userBToken } = await registerUserAndReturnUserInfo(app); + + // User B tries to get upload URL from User A's connection + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${userA.connectionId}?tableName=${userA.tableName}&fieldName=${userA.fieldName}`) + .send({ filename: 'malicious.pdf', contentType: 'application/pdf' }) + .set('Cookie', userBToken) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); +}); + +test.serial(`${currentTest} - user can access their own connection successfully`, async (t) => { + // User sets up their environment - this should work without permission errors + // Note: The actual S3 call may fail (no real AWS), but we should not get 403 + const { token, connectionId, tableName, fieldName, rowPrimaryKey } = await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + // Should not be 403 - may fail at S3 level but authorization passes + t.not(response.status, 403); +}); + +test.serial(`${currentTest} - unauthenticated user cannot access S3 endpoints`, async (t) => { + const { connectionId, tableName, fieldName, rowPrimaryKey } = await setupS3WidgetTestEnvironment(); + + // Try to access without authentication token + const getFileResponse = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getFileResponse.status, 401); + + const uploadUrlResponse = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`) + .send({ filename: 'test.pdf', contentType: 'application/pdf' }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(uploadUrlResponse.status, 401); +}); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-secrets-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-secrets-e2e.test.ts index 4c580da7c..a5f5baadc 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-secrets-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-secrets-e2e.test.ts @@ -11,7 +11,10 @@ import { DatabaseModule } from '../../../src/shared/database/database.module.js' import { DatabaseService } from '../../../src/shared/database/database.service.js'; import { MockFactory } from '../../mock.factory.js'; import { getTestData } from '../../utils/get-test-data.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; @@ -23,521 +26,536 @@ let currentTest: string; // Helper to create a user with connection and optionally create secrets async function setupUserWithSecrets( - secrets: Array<{ slug: string; value: string; masterEncryption?: boolean; masterPassword?: string; expiresAt?: string }> = [], + secrets: Array<{ + slug: string; + value: string; + masterEncryption?: boolean; + masterPassword?: string; + expiresAt?: string; + }> = [], ): Promise<{ token: string; connectionId: string }> { - 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; - - for (const secret of secrets) { - await request(app.getHttpServer()) - .post('/secrets') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(secret); - } - - return { token, connectionId }; + 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; + + for (const secret of secrets) { + await request(app.getHttpServer()) + .post('/secrets') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(secret); + } + + return { token, connectionId }; } test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService], - }).compile(); - app = moduleFixture.createNestApplication(); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService], + }).compile(); + app = moduleFixture.createNestApplication(); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + await createInitialTestUser(app); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error('After tests error ' + e); + } }); currentTest = 'POST /secrets'; test.serial(`${currentTest} - should create a new secret`, async (t) => { - const { token } = await setupUserWithSecrets([]); - - const createDto = { - slug: 'test-api-key', - value: 'sk-test-1234567890', - masterEncryption: false, - }; - - const response = await request(app.getHttpServer()) - .post('/secrets') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(createDto); - - t.is(response.status, 201, response.text); - const responseBody = JSON.parse(response.text); - t.is(responseBody.slug, 'test-api-key'); - t.is(responseBody.masterEncryption, false); - t.truthy(responseBody.id); - t.truthy(responseBody.createdAt); - t.falsy(responseBody.value); + const { token } = await setupUserWithSecrets([]); + + const createDto = { + slug: 'test-api-key', + value: 'sk-test-1234567890', + masterEncryption: false, + }; + + const response = await request(app.getHttpServer()) + .post('/secrets') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(createDto); + + t.is(response.status, 201, response.text); + const responseBody = JSON.parse(response.text); + t.is(responseBody.slug, 'test-api-key'); + t.is(responseBody.masterEncryption, false); + t.truthy(responseBody.id); + t.truthy(responseBody.createdAt); + t.falsy(responseBody.value); }); test.serial(`${currentTest} - should return 409 for duplicate slug`, async (t) => { - // Create user with an existing secret - const { token } = await setupUserWithSecrets([{ slug: 'duplicate-test-key', value: 'sk-test-1234567890' }]); - - // Try to create another secret with the same slug - const createDto = { - slug: 'duplicate-test-key', - value: 'sk-another-key', - }; - - const response = await request(app.getHttpServer()) - .post('/secrets') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(createDto); - - t.is(response.status, 409, response.text); - const responseBody = JSON.parse(response.text); - t.truthy(responseBody.message); + // Create user with an existing secret + const { token } = await setupUserWithSecrets([{ slug: 'duplicate-test-key', value: 'sk-test-1234567890' }]); + + // Try to create another secret with the same slug + const createDto = { + slug: 'duplicate-test-key', + value: 'sk-another-key', + }; + + const response = await request(app.getHttpServer()) + .post('/secrets') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(createDto); + + t.is(response.status, 409, response.text); + const responseBody = JSON.parse(response.text); + t.truthy(responseBody.message); }); test.serial(`${currentTest} - should validate slug format`, async (t) => { - const { token } = await setupUserWithSecrets([]); - - const createDto = { - slug: 'invalid slug with spaces!', - value: 'sk-test-key', - }; - - const response = await request(app.getHttpServer()) - .post('/secrets') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(createDto); - - t.is(response.status, 400, response.text); - const responseBody = JSON.parse(response.text); - t.truthy(responseBody.message); + const { token } = await setupUserWithSecrets([]); + + const createDto = { + slug: 'invalid slug with spaces!', + value: 'sk-test-key', + }; + + const response = await request(app.getHttpServer()) + .post('/secrets') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(createDto); + + t.is(response.status, 400, response.text); + const responseBody = JSON.parse(response.text); + t.truthy(responseBody.message); }); currentTest = 'GET /secrets'; test.serial(`${currentTest} - should return list of company secrets`, async (t) => { - // Create user with at least one secret - const { token } = await setupUserWithSecrets([{ slug: 'list-test-secret', value: 'sk-list-test-value' }]); - - const response = await request(app.getHttpServer()) - .get('/secrets') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.truthy(responseBody.data); - t.true(Array.isArray(responseBody.data)); - t.truthy(responseBody.pagination); - t.is(responseBody.pagination.currentPage, 1); - t.true(responseBody.data.length > 0); - - const firstSecret = responseBody.data[0]; - t.falsy(firstSecret.value); - t.truthy(firstSecret.slug); + // Create user with at least one secret + const { token } = await setupUserWithSecrets([{ slug: 'list-test-secret', value: 'sk-list-test-value' }]); + + const response = await request(app.getHttpServer()) + .get('/secrets') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.truthy(responseBody.data); + t.true(Array.isArray(responseBody.data)); + t.truthy(responseBody.pagination); + t.is(responseBody.pagination.currentPage, 1); + t.true(responseBody.data.length > 0); + + const firstSecret = responseBody.data[0]; + t.falsy(firstSecret.value); + t.truthy(firstSecret.slug); }); test.serial(`${currentTest}?search=test - should filter secrets by slug`, async (t) => { - // Create user with secrets that include 'test' in the slug and one that doesn't - const { token } = await setupUserWithSecrets([ - { slug: 'test-search-key', value: 'value1' }, - { slug: 'another-test-key', value: 'value2' }, - { slug: 'unrelated-secret', value: 'value3' }, - ]); - - const response = await request(app.getHttpServer()) - .get('/secrets?search=test') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.truthy(responseBody.data); - t.true(responseBody.data.length >= 2); - t.true(responseBody.data.every((s: any) => s.slug.includes('test'))); + // Create user with secrets that include 'test' in the slug and one that doesn't + const { token } = await setupUserWithSecrets([ + { slug: 'test-search-key', value: 'value1' }, + { slug: 'another-test-key', value: 'value2' }, + { slug: 'unrelated-secret', value: 'value3' }, + ]); + + const response = await request(app.getHttpServer()) + .get('/secrets?search=test') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.truthy(responseBody.data); + t.true(responseBody.data.length >= 2); + t.true(responseBody.data.every((s: any) => s.slug.includes('test'))); }); currentTest = 'GET /secrets/:slug'; test.serial(`${currentTest} - should return secret metadata without value`, async (t) => { - // Create user with a secret to retrieve - const { token } = await setupUserWithSecrets([{ slug: 'get-test-api-key', value: 'sk-get-test-value' }]); - - const response = await request(app.getHttpServer()) - .get('/secrets/get-test-api-key') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.is(responseBody.slug, 'get-test-api-key'); - t.falsy(responseBody.value); + // Create user with a secret to retrieve + const { token } = await setupUserWithSecrets([{ slug: 'get-test-api-key', value: 'sk-get-test-value' }]); + + const response = await request(app.getHttpServer()) + .get('/secrets/get-test-api-key') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.is(responseBody.slug, 'get-test-api-key'); + t.falsy(responseBody.value); }); test.serial(`${currentTest} - should return 404 for non-existent secret`, async (t) => { - const { token } = await setupUserWithSecrets([]); + const { token } = await setupUserWithSecrets([]); - const response = await request(app.getHttpServer()) - .get('/secrets/non-existent-secret') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .get('/secrets/non-existent-secret') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 404, response.text); + t.is(response.status, 404, response.text); }); currentTest = 'POST /secrets'; test.serial(`${currentTest} - should create secret with master password`, async (t) => { - const { token } = await setupUserWithSecrets([]); - - const createDto = { - slug: 'protected-secret', - value: 'sensitive-data', - masterEncryption: true, - masterPassword: 'MasterPass123!', - }; - - const response = await request(app.getHttpServer()) - .post('/secrets') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(createDto); - - t.is(response.status, 201, response.text); - const responseBody = JSON.parse(response.text); - t.is(responseBody.slug, 'protected-secret'); - t.is(responseBody.masterEncryption, true); + const { token } = await setupUserWithSecrets([]); + + const createDto = { + slug: 'protected-secret', + value: 'sensitive-data', + masterEncryption: true, + masterPassword: 'MasterPass123!', + }; + + const response = await request(app.getHttpServer()) + .post('/secrets') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(createDto); + + t.is(response.status, 201, response.text); + const responseBody = JSON.parse(response.text); + t.is(responseBody.slug, 'protected-secret'); + t.is(responseBody.masterEncryption, true); }); currentTest = 'GET /secrets/:slug'; test.serial(`${currentTest} - should return protected secret metadata without master password`, async (t) => { - // Create user with a protected secret - const { token } = await setupUserWithSecrets([ - { slug: 'protected-secret-200', value: 'sensitive-data', masterEncryption: true, masterPassword: 'SecretPass123!' }, - ]); - - // Access without master password should return metadata (no value is returned anyway) - const response = await request(app.getHttpServer()) - .get('/secrets/protected-secret-200') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.is(responseBody.slug, 'protected-secret-200'); - t.falsy(responseBody.value); - t.is(responseBody.masterEncryption, true); + // Create user with a protected secret + const { token } = await setupUserWithSecrets([ + { slug: 'protected-secret-200', value: 'sensitive-data', masterEncryption: true, masterPassword: 'SecretPass123!' }, + ]); + + // Access without master password should return metadata (no value is returned anyway) + const response = await request(app.getHttpServer()) + .get('/secrets/protected-secret-200') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.is(responseBody.slug, 'protected-secret-200'); + t.falsy(responseBody.value); + t.is(responseBody.masterEncryption, true); }); -test.serial(`${currentTest} - should return protected secret metadata with master password (no value returned)`, async (t) => { - // Create user with a protected secret - const { token } = await setupUserWithSecrets([ - { slug: 'protected-secret-with-pwd', value: 'sensitive-data', masterEncryption: true, masterPassword: 'MasterPass123!' }, - ]); - - const response = await request(app.getHttpServer()) - .get('/secrets/protected-secret-with-pwd') - .set('Cookie', token) - .set('masterpwd', 'MasterPass123!') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.is(responseBody.slug, 'protected-secret-with-pwd'); - t.falsy(responseBody.value); -}); +test.serial( + `${currentTest} - should return protected secret metadata with master password (no value returned)`, + async (t) => { + // Create user with a protected secret + const { token } = await setupUserWithSecrets([ + { + slug: 'protected-secret-with-pwd', + value: 'sensitive-data', + masterEncryption: true, + masterPassword: 'MasterPass123!', + }, + ]); + + const response = await request(app.getHttpServer()) + .get('/secrets/protected-secret-with-pwd') + .set('Cookie', token) + .set('masterpwd', 'MasterPass123!') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.is(responseBody.slug, 'protected-secret-with-pwd'); + t.falsy(responseBody.value); + }, +); currentTest = 'PUT /secrets/:slug'; test.serial(`${currentTest} - should update secret value`, async (t) => { - // Create user with a secret to update - const { token } = await setupUserWithSecrets([{ slug: 'update-test-key', value: 'original-value' }]); - - const updateDto = { - value: 'updated-secret-value', - }; - - const response = await request(app.getHttpServer()) - .put('/secrets/update-test-key') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(updateDto); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.is(responseBody.slug, 'update-test-key'); - t.truthy(responseBody.updatedAt); + // Create user with a secret to update + const { token } = await setupUserWithSecrets([{ slug: 'update-test-key', value: 'original-value' }]); + + const updateDto = { + value: 'updated-secret-value', + }; + + const response = await request(app.getHttpServer()) + .put('/secrets/update-test-key') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(updateDto); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.is(responseBody.slug, 'update-test-key'); + t.truthy(responseBody.updatedAt); }); test.serial(`${currentTest} - should update expiration date`, async (t) => { - // Create user with a secret to update - const { token } = await setupUserWithSecrets([{ slug: 'update-expiry-key', value: 'original-value' }]); - - const futureDate = new Date(); - futureDate.setFullYear(futureDate.getFullYear() + 1); - - const updateDto = { - value: 'updated-secret-value', - expiresAt: futureDate.toISOString(), - }; - - const response = await request(app.getHttpServer()) - .put('/secrets/update-expiry-key') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(updateDto); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.truthy(responseBody.expiresAt); + // Create user with a secret to update + const { token } = await setupUserWithSecrets([{ slug: 'update-expiry-key', value: 'original-value' }]); + + const futureDate = new Date(); + futureDate.setFullYear(futureDate.getFullYear() + 1); + + const updateDto = { + value: 'updated-secret-value', + expiresAt: futureDate.toISOString(), + }; + + const response = await request(app.getHttpServer()) + .put('/secrets/update-expiry-key') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(updateDto); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.truthy(responseBody.expiresAt); }); test.serial(`${currentTest} - should return 404 for non-existent secret`, async (t) => { - const { token } = await setupUserWithSecrets([]); + const { token } = await setupUserWithSecrets([]); - const updateDto = { - value: 'new-value', - }; + const updateDto = { + value: 'new-value', + }; - const response = await request(app.getHttpServer()) - .put('/secrets/non-existent') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(updateDto); + const response = await request(app.getHttpServer()) + .put('/secrets/non-existent') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(updateDto); - t.is(response.status, 404, response.text); + t.is(response.status, 404, response.text); }); currentTest = 'GET /secrets/:slug/audit-log'; test.serial(`${currentTest} - should return audit log entries`, async (t) => { - // Create user with a secret - const { token } = await setupUserWithSecrets([{ slug: 'audit-log-test', value: 'audit-value' }]); - - // Access the secret multiple times to create audit log entries - for (let i = 0; i < 3; i++) { - await request(app.getHttpServer()) - .get('/secrets/audit-log-test') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - } - - const response = await request(app.getHttpServer()) - .get('/secrets/audit-log-test/audit-log') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.truthy(responseBody.data); - t.true(Array.isArray(responseBody.data)); - t.truthy(responseBody.pagination); - - // At least 1 entry from creation + 3 from access - t.true(responseBody.data.length >= 1); - - const logEntry = responseBody.data[0]; - t.truthy(logEntry.id); - t.truthy(logEntry.action); - t.truthy(logEntry.user); - t.truthy(logEntry.accessedAt); - t.is(logEntry.success, true); + // Create user with a secret + const { token } = await setupUserWithSecrets([{ slug: 'audit-log-test', value: 'audit-value' }]); + + // Access the secret multiple times to create audit log entries + for (let i = 0; i < 3; i++) { + await request(app.getHttpServer()) + .get('/secrets/audit-log-test') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + } + + const response = await request(app.getHttpServer()) + .get('/secrets/audit-log-test/audit-log') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.truthy(responseBody.data); + t.true(Array.isArray(responseBody.data)); + t.truthy(responseBody.pagination); + + // At least 1 entry from creation + 3 from access + t.true(responseBody.data.length >= 1); + + const logEntry = responseBody.data[0]; + t.truthy(logEntry.id); + t.truthy(logEntry.action); + t.truthy(logEntry.user); + t.truthy(logEntry.accessedAt); + t.is(logEntry.success, true); }); test.serial(`${currentTest}?page=1&limit=2 - should paginate audit log`, async (t) => { - // Create user with a secret - const { token } = await setupUserWithSecrets([{ slug: 'audit-paginate-test', value: 'audit-value' }]); - - // Access the secret multiple times to create audit log entries - for (let i = 0; i < 3; i++) { - await request(app.getHttpServer()) - .get('/secrets/audit-paginate-test') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - } - - const response = await request(app.getHttpServer()) - .get('/secrets/audit-paginate-test/audit-log?page=1&limit=2') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.is(responseBody.pagination.perPage, '2'); - t.true(responseBody.data.length <= 2); + // Create user with a secret + const { token } = await setupUserWithSecrets([{ slug: 'audit-paginate-test', value: 'audit-value' }]); + + // Access the secret multiple times to create audit log entries + for (let i = 0; i < 3; i++) { + await request(app.getHttpServer()) + .get('/secrets/audit-paginate-test') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + } + + const response = await request(app.getHttpServer()) + .get('/secrets/audit-paginate-test/audit-log?page=1&limit=2') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.is(responseBody.pagination.perPage, '2'); + t.true(responseBody.data.length <= 2); }); currentTest = 'POST /secrets'; test.serial(`${currentTest} - should create expired secret`, async (t) => { - const { token } = await setupUserWithSecrets([]); - - const pastDate = new Date(); - pastDate.setFullYear(pastDate.getFullYear() - 1); - - const createDto = { - slug: 'expired-secret', - value: 'expired-value', - expiresAt: pastDate.toISOString(), - }; - - const response = await request(app.getHttpServer()) - .post('/secrets') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(createDto); - - t.is(response.status, 201, response.text); + const { token } = await setupUserWithSecrets([]); + + const pastDate = new Date(); + pastDate.setFullYear(pastDate.getFullYear() - 1); + + const createDto = { + slug: 'expired-secret', + value: 'expired-value', + expiresAt: pastDate.toISOString(), + }; + + const response = await request(app.getHttpServer()) + .post('/secrets') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(createDto); + + t.is(response.status, 201, response.text); }); currentTest = 'GET /secrets/:slug'; test.serial(`${currentTest} - should return 410 for expired secret`, async (t) => { - // Create user with an expired secret - const pastDate = new Date(); - pastDate.setFullYear(pastDate.getFullYear() - 1); + // Create user with an expired secret + const pastDate = new Date(); + pastDate.setFullYear(pastDate.getFullYear() - 1); - const { token } = await setupUserWithSecrets([ - { slug: 'expired-secret-410', value: 'expired-value', expiresAt: pastDate.toISOString() }, - ]); + const { token } = await setupUserWithSecrets([ + { slug: 'expired-secret-410', value: 'expired-value', expiresAt: pastDate.toISOString() }, + ]); - const response = await request(app.getHttpServer()) - .get('/secrets/expired-secret-410') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .get('/secrets/expired-secret-410') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 410, response.text); + t.is(response.status, 410, response.text); }); currentTest = 'DELETE /secrets/:slug'; test.serial(`${currentTest} - should delete secret`, async (t) => { - // Create user with a secret to delete - const { token } = await setupUserWithSecrets([{ slug: 'delete-test-key', value: 'delete-value' }]); - - const response = await request(app.getHttpServer()) - .delete('/secrets/delete-test-key') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200, response.text); - const responseBody = JSON.parse(response.text); - t.is(responseBody.message, 'Secret deleted successfully'); - t.truthy(responseBody.deletedAt); + // Create user with a secret to delete + const { token } = await setupUserWithSecrets([{ slug: 'delete-test-key', value: 'delete-value' }]); + + const response = await request(app.getHttpServer()) + .delete('/secrets/delete-test-key') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 200, response.text); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, 'Secret deleted successfully'); + t.truthy(responseBody.deletedAt); }); currentTest = 'GET /secrets/:slug'; test.serial(`${currentTest} - should return 404 after deletion`, async (t) => { - // Create user with a secret, then delete it - const { token } = await setupUserWithSecrets([{ slug: 'delete-then-get', value: 'delete-value' }]); - - // Delete the secret - await request(app.getHttpServer()) - .delete('/secrets/delete-then-get') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // Try to get the deleted secret - const response = await request(app.getHttpServer()) - .get('/secrets/delete-then-get') - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 404, response.text); + // Create user with a secret, then delete it + const { token } = await setupUserWithSecrets([{ slug: 'delete-then-get', value: 'delete-value' }]); + + // Delete the secret + await request(app.getHttpServer()) + .delete('/secrets/delete-then-get') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + // Try to get the deleted secret + const response = await request(app.getHttpServer()) + .get('/secrets/delete-then-get') + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(response.status, 404, response.text); }); currentTest = 'DELETE /secrets/:slug'; test.serial(`${currentTest} - should return 404 for non-existent secret`, async (t) => { - const { token } = await setupUserWithSecrets([]); + const { token } = await setupUserWithSecrets([]); - const response = await request(app.getHttpServer()) - .delete('/secrets/non-existent') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .delete('/secrets/non-existent') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 404, response.text); + t.is(response.status, 404, response.text); }); currentTest = 'GET /secrets'; test.serial(`${currentTest} - unauthorized without token`, async (t) => { - const response = await request(app.getHttpServer()) - .get('/secrets') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .get('/secrets') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 401, response.text); + t.is(response.status, 401, response.text); }); currentTest = 'POST /secrets'; test.serial(`${currentTest} - unauthorized without token`, async (t) => { - const createDto = { - slug: 'test-secret', - value: 'value', - }; - - const response = await request(app.getHttpServer()) - .post('/secrets') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send(createDto); - - t.is(response.status, 401, response.text); + const createDto = { + slug: 'test-secret', + value: 'value', + }; + + const response = await request(app.getHttpServer()) + .post('/secrets') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send(createDto); + + t.is(response.status, 401, response.text); }); 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 c31fb7717..5cb389437 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 @@ -23,11 +23,14 @@ import { DatabaseService } from '../../../src/shared/database/database.service.j import { MockFactory } from '../../mock.factory.js'; 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 { + registerUserAndReturnUserInfo, + createInitialTestUser, +} 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'; -import os from "node:os"; +import os from 'node:os'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -40,4053 +43,4054 @@ const testTables: Array = []; let currentTest; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication() as any; - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication() as any; + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + await createInitialTestUser(app); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error('After tests error ' + e); + } }); currentTest = 'GET /connection/tables/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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 getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTablesRO = JSON.parse(getTablesResponse.text); - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); - - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); - t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); - t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); - t.is(getTablesRO[testTableIndex].table, testTableName); - t.is(getTablesRO[testTableIndex].permissions.visibility, true); - t.is(getTablesRO[testTableIndex].permissions.readonly, false); - t.is(getTablesRO[testTableIndex].permissions.add, true); - t.is(getTablesRO[testTableIndex].permissions.delete, true); - t.is(getTablesRO[testTableIndex].permissions.edit, true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTablesRO = JSON.parse(getTablesResponse.text); + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); + + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); + t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); + t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); + t.is(getTablesRO[testTableIndex].table, testTableName); + t.is(getTablesRO[testTableIndex].permissions.visibility, true); + t.is(getTablesRO[testTableIndex].permissions.readonly, false); + t.is(getTablesRO[testTableIndex].permissions.add, true); + t.is(getTablesRO[testTableIndex].permissions.delete, true); + t.is(getTablesRO[testTableIndex].permissions.edit, true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connectionId not passed in request`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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); - - createConnectionRO.id = ''; - const getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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); + + createConnectionRO.id = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connection id is incorrect`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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); - createConnectionRO.id = faker.string.uuid(); - const getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .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; - } + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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); + createConnectionRO.id = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = await createTestTable(connectionToTestDB); - - 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 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(Object.hasOwn(getTableRowsRO, 'large_dataset'), true); - t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[15], 'created_at'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[19], 'updated_at'), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = await createTestTable(connectionToTestDB); + + 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 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(Object.hasOwn(getTableRowsRO, 'large_dataset'), true); + t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[15], 'created_at'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[19], 'updated_at'), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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[0].id; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${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, 200); - t.is(typeof getTableRowsRO, 'object'); - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'created_at'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'updated_at'), true); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['id'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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[0].id; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${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, 200); + t.is(typeof getTableRowsRO, 'object'); + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'created_at'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'updated_at'), true); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'uuid'); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['id'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'uuid'); + + 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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'uuid'); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['id'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'uuid'); + + 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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=2`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'uuid'); - - 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; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'uuid'); + + 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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'uuid'); - - 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; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'uuid'); + + 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 + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - const ages = getTableRowsRO.rows.map((row) => row.age); - for (let i = 0; i < ages.length - 1; i++) { - t.true( - ages[i] >= ages[i + 1], - `Age at index ${i} (${ages[i]}) should be >= age at index ${i + 1} (${ages[i + 1]})`, - ); - } - - const highestAgeRows = getTableRowsRO.rows.filter((row) => row.age >= 90); - t.true(highestAgeRows.length >= 2, 'Should have at least 2 rows with age >= 90'); - t.true( - highestAgeRows.every((row) => row.name === testSearchedUserName), - 'High age rows should have the test user name', - ); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + + const ages = getTableRowsRO.rows.map((row) => row.age); + for (let i = 0; i < ages.length - 1; i++) { + t.true( + ages[i] >= ages[i + 1], + `Age at index ${i} (${ages[i]}) should be >= age at index ${i + 1} (${ages[i + 1]})`, + ); + } + + const highestAgeRows = getTableRowsRO.rows.filter((row) => row.age >= 90); + t.true(highestAgeRows.length >= 2, 'Should have at least 2 rows with age >= 90'); + t.true( + highestAgeRows.every((row) => row.name === testSearchedUserName), + 'High age rows should have the test user name', + ); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.ASC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 42); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - // Check that rows are sorted by age in ascending order - const ages = getTableRowsRO.rows.map((row) => row.age); - for (let i = 0; i < ages.length - 1; i++) { - t.true( - ages[i] <= ages[i + 1], - `Age at index ${i} (${ages[i]}) should be <= age at index ${i + 1} (${ages[i + 1]})`, - ); - } - - // Verify the youngest test user is near the beginning - const lowestAgeRow = getTableRowsRO.rows.find((row) => row.name === testSearchedUserName && row.age === 14); - t.truthy(lowestAgeRow, 'Should find the test user with age 14'); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.ASC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 42); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + + // Check that rows are sorted by age in ascending order + const ages = getTableRowsRO.rows.map((row) => row.age); + for (let i = 0; i < ages.length - 1; i++) { + t.true( + ages[i] <= ages[i + 1], + `Age at index ${i} (${ages[i]}) should be <= age at index ${i + 1} (${ages[i + 1]})`, + ); + } + + // Verify the youngest test user is near the beginning + const lowestAgeRow = getTableRowsRO.rows.find((row) => row.name === testSearchedUserName && row.age === 14); + t.truthy(lowestAgeRow, 'Should find the test user with age 14'); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 200); - t.is(typeof getTableRowsRO, 'object'); - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - // Check that rows are sorted by age in descending order - const ages = getTableRowsRO.rows.map((row) => row.age); - for (let i = 0; i < ages.length - 1; i++) { - t.true( - ages[i] >= ages[i + 1], - `Age at index ${i} (${ages[i]}) should be >= age at index ${i + 1} (${ages[i + 1]})`, - ); - } - - // Verify the oldest test user is near the beginning - const lowestAgeRow = getTableRowsRO.rows.find((row) => row.name === testSearchedUserName && row.age === 90); - t.truthy(lowestAgeRow, 'Should find the test user with age 90'); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 200); + t.is(typeof getTableRowsRO, 'object'); + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + + // Check that rows are sorted by age in descending order + const ages = getTableRowsRO.rows.map((row) => row.age); + for (let i = 0; i < ages.length - 1; i++) { + t.true( + ages[i] >= ages[i + 1], + `Age at index ${i} (${ages[i]}) should be >= age at index ${i + 1} (${ages[i + 1]})`, + ); + } + + // Verify the oldest test user is near the beginning + const lowestAgeRow = getTableRowsRO.rows.find((row) => row.name === testSearchedUserName && row.age === 90); + t.truthy(lowestAgeRow, 'Should find the test user with age 90'); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting age by ASC and with pagination page=1, perPage=2`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - const ages = getTableRowsRO.rows.map((row) => row.age); - for (let i = 0; i < ages.length - 1; i++) { - t.true( - ages[i] <= ages[i + 1], - `Age at index ${i} (${ages[i]}) should be <= age at index ${i + 1} (${ages[i + 1]})`, - ); - } - - const lowestAgeRow = getTableRowsRO.rows.find((row) => row.name === testSearchedUserName && row.age === 14); - t.truthy(lowestAgeRow, 'Should find the test user with age 14'); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting age by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + + const ages = getTableRowsRO.rows.map((row) => row.age); + for (let i = 0; i < ages.length - 1; i++) { + t.true( + ages[i] <= ages[i + 1], + `Age at index ${i} (${ages[i]}) should be <= age at index ${i + 1} (${ages[i + 1]})`, + ); + } + + const lowestAgeRow = getTableRowsRO.rows.find((row) => row.name === testSearchedUserName && row.age === 14); + t.truthy(lowestAgeRow, 'Should find the test user with age 14'); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - const ages = getTableRowsRO.rows.map((row) => row.age); - for (let i = 0; i < ages.length - 1; i++) { - t.true( - ages[i] >= ages[i + 1], - `Age at index ${i} (${ages[i]}) should be >= age at index ${i + 1} (${ages[i + 1]})`, - ); - } - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + + const ages = getTableRowsRO.rows.map((row) => row.age); + for (let i = 0; i < ages.length - 1; i++) { + t.true( + ages[i] >= ages[i + 1], + `Age at index ${i} (${ages[i]}) should be >= age at index ${i + 1} (${ages[i + 1]})`, + ); + } + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(getTableRowsResponse.status, 200); - t.is(typeof getTableRowsRO, 'object'); - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - const ages = getTableRowsRO.rows.map((row) => row.age); - for (let i = 0; i < ages.length - 1; i++) { - t.true( - ages[i] >= ages[i + 1], - `Age at index ${i} (${ages[i]}) should be >= age at index ${i + 1} (${ages[i + 1]})`, - ); - } - - const highestAgeRow = getTableRowsRO.rows.find((row) => row.name === testSearchedUserName && row.age === 95); - t.truthy(highestAgeRow, 'Should find the test user with age 95'); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(getTableRowsResponse.status, 200); + t.is(typeof getTableRowsRO, 'object'); + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + const ages = getTableRowsRO.rows.map((row) => row.age); + for (let i = 0; i < ages.length - 1; i++) { + t.true( + ages[i] >= ages[i + 1], + `Age at index ${i} (${ages[i]}) should be >= age at index ${i + 1} (${ages[i + 1]})`, + ); + } + + const highestAgeRow = getTableRowsRO.rows.find((row) => row.name === testSearchedUserName && row.age === 95); + t.truthy(highestAgeRow, 'Should find the test user with age 95'); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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'); - const _createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0].age, 14); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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'); + const _createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0].age, 14); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0].age, 14); - t.is(getTableRowsRO.rows[1].age, 90); - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0].age, 14); + t.is(getTableRowsRO.rows[1].age, 90); + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0].age, 95); - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0].age, 95); + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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 = '80'; - - const filters = { - [fieldname]: { gt: 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[0].age, 95); - t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); - t.is(getTableRowsRO.rows[1].age, 90); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 = '80'; + + const filters = { + [fieldname]: { gt: 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + + t.is(getTableRowsRO.rows[0][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[0].age, 95); + t.is(getTableRowsRO.rows[1][testTableColumnName], testSearchedUserName); + t.is(getTableRowsRO.rows[1].age, 90); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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.rows[0].age, 14); - - t.is(getTableRowsRO.pagination.currentPage, 1); - t.is(getTableRowsRO.pagination.perPage, 10); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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.rows[0].age, 14); + + t.is(getTableRowsRO.pagination.currentPage, 1); + t.is(getTableRowsRO.pagination.perPage, 10); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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 = '96'; - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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.rows[0].age, 14); - - t.is(getTableRowsRO.pagination.currentPage, 2); - t.is(getTableRowsRO.pagination.perPage, 2); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 = '96'; + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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.rows[0].age, 14); + + t.is(getTableRowsRO.pagination.currentPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } 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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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 fieldLtvalue = '96'; - - 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}`, - ) - .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; - } + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 fieldLtvalue = '96'; + + 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}`, + ) + .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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'age', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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 fieldLtvalue = '96'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get( - `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}`, - ) - .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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTablesRO, 'pagination'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'age', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 fieldLtvalue = '96'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}`, + ) + .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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTablesRO, 'pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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, 6); - - for (const element of getTableStructureRO.structure) { - t.is(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'column_default'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - t.is(Object.hasOwn(element, 'isExcluded'), true); - t.is(Object.hasOwn(element, 'isSearched'), true); - } - - t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - - for (const element of getTableStructureRO.primaryColumns) { - t.is(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - } - - for (const element of getTableStructureRO.foreignKeys) { - t.is(Object.hasOwn(element, 'referenced_column_name'), true); - t.is(Object.hasOwn(element, 'referenced_table_name'), true); - t.is(Object.hasOwn(element, 'constraint_name'), true); - t.is(Object.hasOwn(element, 'column_name'), true); - } + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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, 6); + + for (const element of getTableStructureRO.structure) { + t.is(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'column_default'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + t.is(Object.hasOwn(element, 'isExcluded'), true); + t.is(Object.hasOwn(element, 'isSearched'), true); + } + + t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); + + for (const element of getTableStructureRO.primaryColumns) { + t.is(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + } + + for (const element of getTableStructureRO.foreignKeys) { + t.is(Object.hasOwn(element, 'referenced_column_name'), true); + t.is(Object.hasOwn(element, 'referenced_table_name'), true); + t.is(Object.hasOwn(element, 'constraint_name'), true); + t.is(Object.hasOwn(element, 'column_name'), true); + } }); test.serial(`${currentTest} should throw an exception whe connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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); - 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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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); + 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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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); - - 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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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); + + 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) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 tableName = ''; - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 tableName = faker.lorem.words(1); - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - - const responseObject = JSON.parse(getTableStructure.text); - t.is(responseObject.message, Messages.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + + const responseObject = JSON.parse(getTableStructure.text); + t.is(responseObject.message, Messages.TABLE_NOT_FOUND); }); currentTest = 'POST /table/row/:slug'; test.serial(`${currentTest} should add row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const fakeId = faker.string.uuid(); - const row = { - "id": fakeId, - "age": 99, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const addRowInTableRO = JSON.parse(addRowInTableResponse.text); - t.is(addRowInTableResponse.status, 201); - - t.is(Object.hasOwn(addRowInTableRO, 'row'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 43); - - // check that rows adding was logged - - const getLogsResponse = await request(app.getHttpServer()) - .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getLogsResponse.status, 200); - const getLogsRO = JSON.parse(getLogsResponse.text); - t.is(Object.hasOwn(getLogsRO, 'logs'), true); - t.is(Object.hasOwn(getLogsRO, 'pagination'), true); - t.is(getLogsRO.logs.length > 0, true); - const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); - t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, 'id'), true); - t.is(getLogsRO.logs[addRowLogIndex].affected_primary_key.id, fakeId); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const fakeId = faker.string.uuid(); + const row = { + id: fakeId, + age: 99, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const addRowInTableRO = JSON.parse(addRowInTableResponse.text); + t.is(addRowInTableResponse.status, 201); + + t.is(Object.hasOwn(addRowInTableRO, 'row'), true); + t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); + t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 43); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getLogsResponse.status, 200); + const getLogsRO = JSON.parse(getLogsResponse.text); + t.is(Object.hasOwn(getLogsRO, 'logs'), true); + t.is(Object.hasOwn(getLogsRO, 'pagination'), true); + t.is(getLogsRO.logs.length > 0, true); + const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); + t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, 'id'), true); + t.is(getLogsRO.logs[addRowLogIndex].affected_primary_key.id, fakeId); }); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - id: faker.string.uuid(), - "age": 99, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - const fakeConnectionId = ''; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 404); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + id: faker.string.uuid(), + age: 99, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const fakeConnectionId = ''; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 404); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - id: faker.string.uuid(), - age: 99, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NAME_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + id: faker.string.uuid(), + age: 99, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NAME_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.PARAMETER_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.PARAMETER_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - id: faker.string.uuid(), - age: 99, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const { message } = JSON.parse(addRowInTableResponse.text); - t.is(addRowInTableResponse.status, 400); - t.is(message, Messages.TABLE_NOT_FOUND); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + id: faker.string.uuid(), + age: 99, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const { message } = JSON.parse(addRowInTableResponse.text); + t.is(addRowInTableResponse.status, 400); + t.is(message, Messages.TABLE_NOT_FOUND); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); currentTest = 'PUT /table/row/:slug'; test.serial(`${currentTest} should update row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - const foundIdForUpdate = insertedSearchedIds[0].id; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${foundIdForUpdate}&age=14`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 200); - const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); - - t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); - t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was updated - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - const updateRowIndex = rows.findIndex((element) => element.id === foundIdForUpdate); - t.is(rows.length, 42); - t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); - t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const foundIdForUpdate = insertedSearchedIds[0].id; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${foundIdForUpdate}&age=14`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 200); + const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); + + t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); + t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was updated + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + const updateRowIndex = rows.findIndex((element) => element.id === foundIdForUpdate); + t.is(rows.length, 42); + t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); + t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - const foundIdForUpdate = insertedSearchedIds[0].id; - createConnectionRO.id = ''; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${foundIdForUpdate}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 404); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const foundIdForUpdate = insertedSearchedIds[0].id; + createConnectionRO.id = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${foundIdForUpdate}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 404); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - const foundIdForUpdate = insertedSearchedIds[0].id; - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${foundIdForUpdate}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 403); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + const foundIdForUpdate = insertedSearchedIds[0].id; + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${foundIdForUpdate}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 403); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - const foundIdForUpdate = insertedSearchedIds[0].id; - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=&id=${foundIdForUpdate}`) - .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.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + const foundIdForUpdate = insertedSearchedIds[0].id; + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=&id=${foundIdForUpdate}`) + .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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - const foundIdForUpdate = insertedSearchedIds[0].id; - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const fakeTableName = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${foundIdForUpdate}`) - .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.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + const foundIdForUpdate = insertedSearchedIds[0].id; + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeTableName = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${foundIdForUpdate}`) + .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.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { - testTableName, - testTableColumnName, - testEntitiesSeedsCount, - testTableSecondColumnName, - insertedSearchedIds, - } = await createTestTable(connectionToTestDB); - const foundIdForUpdate = insertedSearchedIds[0].id; - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=${foundIdForUpdate}`) - .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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { + testTableName, + testTableColumnName, + testEntitiesSeedsCount, + testTableSecondColumnName, + insertedSearchedIds, + } = await createTestTable(connectionToTestDB); + const foundIdForUpdate = insertedSearchedIds[0].id; + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&IncorrectField=${foundIdForUpdate}`) + .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); + }, ); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${faker.string.uuid()}&age=14`) - .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.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${faker.string.uuid()}&age=14`) + .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.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const firstIdToUpdate = insertedSearchedIds[0].id; - const secondIdToUpdate = insertedSearchedIds[1].id; - const requestData = { - primaryKeys: [ - { id: firstIdToUpdate, age: 14 }, - { id: secondIdToUpdate, age: 90 }, - ], - newValues: { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/update/${createConnectionRO.id}?tableName=${testTableName}`) - .send(JSON.stringify(requestData)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); - - t.is(updateRowInTableResponse.status, 200); - t.is(updateRowInTableRO.success, true); - - // check that the rows were updated - const firstRowResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${firstIdToUpdate}&age=14`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const firstRow = JSON.parse(firstRowResponse.text); - t.is(firstRowResponse.status, 200); - t.is(firstRow.row[testTableColumnName], fakeName); - t.is(firstRow.row[testTableSecondColumnName], fakeMail); - - const secondRowResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${secondIdToUpdate}&age=90`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const secondRow = JSON.parse(secondRowResponse.text); - t.is(secondRowResponse.status, 200); - t.is(secondRow.row[testTableColumnName], fakeName); - t.is(secondRow.row[testTableSecondColumnName], fakeMail); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const firstIdToUpdate = insertedSearchedIds[0].id; + const secondIdToUpdate = insertedSearchedIds[1].id; + const requestData = { + primaryKeys: [ + { id: firstIdToUpdate, age: 14 }, + { id: secondIdToUpdate, age: 90 }, + ], + newValues: { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/update/${createConnectionRO.id}?tableName=${testTableName}`) + .send(JSON.stringify(requestData)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); + + t.is(updateRowInTableResponse.status, 200); + t.is(updateRowInTableRO.success, true); + + // check that the rows were updated + const firstRowResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${firstIdToUpdate}&age=14`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const firstRow = JSON.parse(firstRowResponse.text); + t.is(firstRowResponse.status, 200); + t.is(firstRow.row[testTableColumnName], fakeName); + t.is(firstRow.row[testTableSecondColumnName], fakeMail); + + const secondRowResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${secondIdToUpdate}&age=90`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const secondRow = JSON.parse(secondRowResponse.text); + t.is(secondRowResponse.status, 200); + t.is(secondRow.row[testTableColumnName], fakeName); + t.is(secondRow.row[testTableSecondColumnName], fakeMail); }); currentTest = 'DELETE /table/row/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0].id; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForDeletion}&age=14`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 200); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - - t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 41); - const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, true); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0].id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForDeletion}&age=14`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 200); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 41); + const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, true); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - 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 idForDeletion = insertedSearchedIds[0].id; - const connectionId = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 404); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + 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 idForDeletion = insertedSearchedIds[0].id; + const connectionId = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 404); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0].id; - const connectionId = faker.string.uuid(); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 403); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0].id; + const connectionId = faker.string.uuid(); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 403); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0].id; - const fakeTableName = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0].id; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0].id; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0].id; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0].id; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0].id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { - testTableName, - testTableColumnName, - testEntitiesSeedsCount, - testTableSecondColumnName, - insertedSearchedIds, - } = await createTestTable(connectionToTestDB); - - 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 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); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { + testTableName, + testTableColumnName, + testEntitiesSeedsCount, + testTableSecondColumnName, + insertedSearchedIds, + } = await createTestTable(connectionToTestDB); + + 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 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); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); + }, ); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${faker.string.uuid()}&age=14`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 400); - t.is(deleteRowInTableRO.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${faker.string.uuid()}&age=14`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 400); + t.is(deleteRowInTableRO.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = insertedSearchedIds[0].id; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}&age=14`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(foundRowInTableResponse.status, 200); - const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); - t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); - t.is(typeof foundRowInTableRO.row, 'object'); - t.is(typeof foundRowInTableRO.structure, 'object'); - t.is(typeof foundRowInTableRO.primaryColumns, 'object'); - t.is(typeof foundRowInTableRO.readonly_fields, 'object'); - t.is(typeof foundRowInTableRO.foreignKeys, 'object'); - t.is(foundRowInTableRO.row.id, idForSearch); - t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); - t.is(Object.keys(foundRowInTableRO.row).length, 6); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = insertedSearchedIds[0].id; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}&age=14`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(foundRowInTableResponse.status, 200); + const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); + t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); + t.is(typeof foundRowInTableRO.row, 'object'); + t.is(typeof foundRowInTableRO.structure, 'object'); + t.is(typeof foundRowInTableRO.primaryColumns, 'object'); + t.is(typeof foundRowInTableRO.readonly_fields, 'object'); + t.is(typeof foundRowInTableRO.foreignKeys, 'object'); + t.is(foundRowInTableRO.row.id, idForSearch); + t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); + t.is(Object.keys(foundRowInTableRO.row).length, 6); }); test.serial(`${currentTest} should throw an exception, when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = insertedSearchedIds[0].id; - createConnectionRO.id = ''; - 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, 404); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = insertedSearchedIds[0].id; + createConnectionRO.id = ''; + 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, 404); }); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { - testTableName, - testTableColumnName, - testEntitiesSeedsCount, - testTableSecondColumnName, - insertedSearchedIds, - } = await createTestTable(connectionToTestDB); - - 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 idForSearch = insertedSearchedIds[0].id; - 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); - }, + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { + testTableName, + testTableColumnName, + testEntitiesSeedsCount, + testTableSecondColumnName, + insertedSearchedIds, + } = await createTestTable(connectionToTestDB); + + 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 idForSearch = insertedSearchedIds[0].id; + 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); + }, ); test.serial(`${currentTest} should throw an exception, when tableName in not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = insertedSearchedIds[0].id; - const fakeTableName = ''; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = insertedSearchedIds[0].id; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception, when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = insertedSearchedIds[0].id; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const FoundRowRO = JSON.parse(foundRowInTableResponse.text); - t.is(foundRowInTableResponse.status, 400); - t.is(FoundRowRO.message, Messages.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = insertedSearchedIds[0].id; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const FoundRowRO = JSON.parse(foundRowInTableResponse.text); + t.is(foundRowInTableResponse.status, 400); + t.is(FoundRowRO.message, Messages.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception, when primary key is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { - testTableName, - testTableColumnName, - testEntitiesSeedsCount, - testTableSecondColumnName, - insertedSearchedIds, - } = await createTestTable(connectionToTestDB); - - 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 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); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { + testTableName, + testTableColumnName, + testEntitiesSeedsCount, + testTableSecondColumnName, + insertedSearchedIds, + } = await createTestTable(connectionToTestDB); + + 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 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); + }, ); test.serial( - `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = faker.string.uuid(); - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}&age=14`) - .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.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}&age=14`) + .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.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 primaryKeysForDeletion: Array> = [ - { - id: insertedSearchedIds[0].id, - age: 14, - }, - { - id: insertedSearchedIds[1].id, - age: 90, - }, - { - id: insertedSearchedIds[2].id, - age: 95, - }, - ]; - const deleteRowsInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) - .send(primaryKeysForDeletion) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowsInTableResponse.status, 200); - const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - // check that lines was deleted - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); - - for (const key of primaryKeysForDeletion) { - t.is( - rows.findIndex((row) => row.id === key.id), - -1, - ); - } - - // check that table deletion was logged - const tableLogsResponse = await request(app.getHttpServer()) - .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(tableLogsResponse.status, 200); - - const tableLogsRO = JSON.parse(tableLogsResponse.text); - t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); - const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); - for (const key of primaryKeysForDeletion) { - t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); - } + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 primaryKeysForDeletion: Array> = [ + { + id: insertedSearchedIds[0].id, + age: 14, + }, + { + id: insertedSearchedIds[1].id, + age: 90, + }, + { + id: insertedSearchedIds[2].id, + age: 95, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) + .send(primaryKeysForDeletion) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowsInTableResponse.status, 200); + const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + // check that lines was deleted + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); + + for (const key of primaryKeysForDeletion) { + t.is( + rows.findIndex((row) => row.id === key.id), + -1, + ); + } + + // check that table deletion was logged + const tableLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(tableLogsResponse.status, 200); + + const tableLogsRO = JSON.parse(tableLogsResponse.text); + t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); currentTest = 'DELETE /table/rows/:slug'; test.serial(`${currentTest} should delete rows in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 primaryKeysForDeletion = [ - { - id: insertedSearchedIds[0].id, - age: 14, - }, - { - id: insertedSearchedIds[1].id, - age: 90, - }, - { - id: insertedSearchedIds[2].id, - age: 95, - }, - ]; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) - .send(primaryKeysForDeletion) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const _deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 200); - - //checking that the line was 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'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 200); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 39); - for (const primaryKey of primaryKeysForDeletion) { - t.is( - rows.findIndex((row) => row.id === primaryKey.id), - -1, - ); - } - - // check that deletion of rows was logged - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - const deleteRowsLogs = getRowInTableRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); - t.is(deleteRowsLogs.length, primaryKeysForDeletion.length); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 primaryKeysForDeletion = [ + { + id: insertedSearchedIds[0].id, + age: 14, + }, + { + id: insertedSearchedIds[1].id, + age: 90, + }, + { + id: insertedSearchedIds[2].id, + age: 95, + }, + ]; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) + .send(primaryKeysForDeletion) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const _deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 200); + + //checking that the line was 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'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 200); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 39); + for (const primaryKey of primaryKeysForDeletion) { + t.is( + rows.findIndex((row) => row.id === primaryKey.id), + -1, + ); + } + + // check that deletion of rows was logged + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getRowInTableRO = JSON.parse(getTableLogs.text); + const deleteRowsLogs = getRowInTableRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.is(deleteRowsLogs.length, primaryKeysForDeletion.length); }); currentTest = 'POST /connection/test'; test.serial(`${currentTest} should test connection and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - 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 { message } = JSON.parse(testConnectionResponse.text); - t.is(message, 'Successfully connected'); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + 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 { message } = JSON.parse(testConnectionResponse.text); + t.is(message, 'Successfully connected'); }); test.serial( - `${currentTest} should test connection and return negative result when connection password is incorrect result`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - 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'); - - t.is(testConnectionResponse.status, 201); - const { result } = JSON.parse(testConnectionResponse.text); - t.is(result, false); - }, + `${currentTest} should test connection and return negative result when connection password is incorrect result`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + 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'); + + t.is(testConnectionResponse.status, 201); + const { result } = JSON.parse(testConnectionResponse.text); + t.is(result, false); + }, ); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 getTableCsvResponse = await request(app.getHttpServer()) - .post(`/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'text/csv') - .set('Accept', 'text/csv'); - - if (getTableCsvResponse.status !== 201) { - const getTableCsvResponseRO = JSON.parse(getTableCsvResponse.text); - console.info(getTableCsvResponseRO); - } - t.is(getTableCsvResponse.status, 201); - const fileName = `${testTableName}.csv`; - const downloadedFilePatch = join(os.tmpdir(), fileName); - - // 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); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'text/csv') + .set('Accept', 'text/csv'); + + if (getTableCsvResponse.status !== 201) { + const getTableCsvResponseRO = JSON.parse(getTableCsvResponse.text); + console.info(getTableCsvResponseRO); + } + t.is(getTableCsvResponse.status, 201); + const fileName = `${testTableName}.csv`; + const downloadedFilePatch = join(os.tmpdir(), fileName); + + // 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); }); test.serial(`${currentTest} should throw exception when csv export is disabled in table settings`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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, - undefined, - undefined, - undefined, - undefined, - false, - false, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'text/csv') - .set('Accept', 'text/csv'); - - t.is(getTableCsvResponse.status, 400); - const { message } = JSON.parse(getTableCsvResponse.text); - t.is(message, Messages.CSV_EXPORT_DISABLED); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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, + undefined, + undefined, + undefined, + undefined, + false, + false, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'text/csv') + .set('Accept', 'text/csv'); + + t.is(getTableCsvResponse.status, 400); + const { message } = JSON.parse(getTableCsvResponse.text); + t.is(message, Messages.CSV_EXPORT_DISABLED); }); test.serial( - `${currentTest} should return csv file with table data with search, with pagination, with sorting, + `${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 connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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'); - - if (getTableCsvResponse.status !== 201) { - console.info(getTableCsvResponse.text); - } - t.is(getTableCsvResponse.status, 201); - const fileName = `${testTableName}.csv`; - const tmpDir = os.tmpdir(); - const downloadedFilePatch = join(tmpDir, fileName); - - // 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); - }, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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'); + + if (getTableCsvResponse.status !== 201) { + console.info(getTableCsvResponse.text); + } + t.is(getTableCsvResponse.status, 201); + const fileName = `${testTableName}.csv`; + const tmpDir = os.tmpdir(); + const downloadedFilePatch = join(tmpDir, fileName); + + // 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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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'); - - if (getTableCsvResponse.status !== 201) { - console.info(getTableCsvResponse.text); - } - t.is(getTableCsvResponse.status, 201); - const fileName = `${testTableName}.csv`; - const downloadedFilePatch = join(os.tmpdir(), fileName); - - // 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); - - function changeIdFieldsValuesInCsvFile(filePatch: string) { - const fileContent = fs.readFileSync(filePatch).toString(); - const rows = fileContent.split('\n'); - const newRows = rows.map((row, index) => { - if (index === 0) { - return row; - } - const columns = row.split(','); - if (columns.length === 1) { - return row; - } - columns[0] = `5${index}`; - return columns.join(','); - }); - return newRows.join('\n'); - } - - const newFileContent = changeIdFieldsValuesInCsvFile(downloadedFilePatch); - fs.writeFileSync(downloadedFilePatch, newFileContent); - - const importCsvResponse = await request(app.getHttpServer()) - .post(`/table/csv/import/${createConnectionRO.id}?tableName=${testTableName}`) - .attach('file', downloadedFilePatch) - .set('Cookie', firstUserToken) - .set('Accept', 'application/json'); - - const _importCsvRO = JSON.parse(importCsvResponse.text); - t.is(importCsvResponse.status, 201); - - //checking that the lines was added - - 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'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 200); - t.is(getTableRowsRO.rows.length, testEntitiesSeedsCount + 2); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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'); + + if (getTableCsvResponse.status !== 201) { + console.info(getTableCsvResponse.text); + } + t.is(getTableCsvResponse.status, 201); + const fileName = `${testTableName}.csv`; + const downloadedFilePatch = join(os.tmpdir(), fileName); + + // 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); + + function changeIdFieldsValuesInCsvFile(filePatch: string) { + const fileContent = fs.readFileSync(filePatch).toString(); + const rows = fileContent.split('\n'); + const newRows = rows.map((row, index) => { + if (index === 0) { + return row; + } + const columns = row.split(','); + if (columns.length === 1) { + return row; + } + columns[0] = `5${index}`; + return columns.join(','); + }); + return newRows.join('\n'); + } + + const newFileContent = changeIdFieldsValuesInCsvFile(downloadedFilePatch); + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createConnectionRO.id}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + const _importCsvRO = JSON.parse(importCsvResponse.text); + t.is(importCsvResponse.status, 201); + + //checking that the lines was added + + 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'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 200); + t.is(getTableRowsRO.rows.length, testEntitiesSeedsCount + 2); }); test.serial(`${currentTest} should throw exception whe csv import is disabled`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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, - undefined, - undefined, - undefined, - undefined, - false, - true, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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'); - - if (getTableCsvResponse.status !== 201) { - console.info(getTableCsvResponse.text); - } - t.is(getTableCsvResponse.status, 201); - const fileName = `${testTableName}.csv`; - const downloadedFilePatch = join(os.tmpdir(), fileName); - - // 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); - - function changeIdFieldsValuesInCsvFile(filePatch: string) { - const fileContent = fs.readFileSync(filePatch).toString(); - const rows = fileContent.split('\n'); - const newRows = rows.map((row, index) => { - if (index === 0) { - return row; - } - const columns = row.split(','); - if (columns.length === 1) { - return row; - } - columns[0] = `5${index}`; - return columns.join(','); - }); - return newRows.join('\n'); - } - - const newFileContent = changeIdFieldsValuesInCsvFile(downloadedFilePatch); - fs.writeFileSync(downloadedFilePatch, newFileContent); - - const importCsvResponse = await request(app.getHttpServer()) - .post(`/table/csv/import/${createConnectionRO.id}?tableName=${testTableName}`) - .attach('file', downloadedFilePatch) - .set('Cookie', firstUserToken) - .set('Accept', 'application/json'); - - t.is(importCsvResponse.status, 400); - - const { message } = JSON.parse(importCsvResponse.text); - t.is(message, Messages.CSV_IMPORT_DISABLED); + const connectionToTestDB = getTestData(mockFactory).cassandraTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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, + undefined, + undefined, + undefined, + undefined, + false, + true, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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'); + + if (getTableCsvResponse.status !== 201) { + console.info(getTableCsvResponse.text); + } + t.is(getTableCsvResponse.status, 201); + const fileName = `${testTableName}.csv`; + const downloadedFilePatch = join(os.tmpdir(), fileName); + + // 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); + + function changeIdFieldsValuesInCsvFile(filePatch: string) { + const fileContent = fs.readFileSync(filePatch).toString(); + const rows = fileContent.split('\n'); + const newRows = rows.map((row, index) => { + if (index === 0) { + return row; + } + const columns = row.split(','); + if (columns.length === 1) { + return row; + } + columns[0] = `5${index}`; + return columns.join(','); + }); + return newRows.join('\n'); + } + + const newFileContent = changeIdFieldsValuesInCsvFile(downloadedFilePatch); + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createConnectionRO.id}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + t.is(importCsvResponse.status, 400); + + const { message } = JSON.parse(importCsvResponse.text); + t.is(message, Messages.CSV_IMPORT_DISABLED); }); 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 f25658df0..dcde0ab98 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 @@ -17,7 +17,10 @@ import { DatabaseService } from '../../../src/shared/database/database.service.j import { MockFactory } from '../../mock.factory.js'; 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 { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; @@ -40,3747 +43,3748 @@ const testTables: Array = []; let currentTest; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + await createInitialTestUser(app); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error('After tests error ' + e); + } }); currentTest = 'GET /connection/tables/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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 getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesResponse.status, 200); - const getTablesRO = JSON.parse(getTablesResponse.text); - - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); - - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); - t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); - t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); - t.is(getTablesRO[testTableIndex].table, testTableName); - t.is(getTablesRO[testTableIndex].permissions.visibility, true); - t.is(getTablesRO[testTableIndex].permissions.readonly, false); - t.is(getTablesRO[testTableIndex].permissions.add, true); - t.is(getTablesRO[testTableIndex].permissions.delete, true); - t.is(getTablesRO[testTableIndex].permissions.edit, true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesResponse.status, 200); + const getTablesRO = JSON.parse(getTablesResponse.text); + + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); + + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); + t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); + t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); + t.is(getTablesRO[testTableIndex].table, testTableName); + t.is(getTablesRO[testTableIndex].permissions.visibility, true); + t.is(getTablesRO[testTableIndex].permissions.readonly, false); + t.is(getTablesRO[testTableIndex].permissions.add, true); + t.is(getTablesRO[testTableIndex].permissions.delete, true); + t.is(getTablesRO[testTableIndex].permissions.edit, true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connectionId not passed in request`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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); - - createConnectionRO.id = ''; - const getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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); + + createConnectionRO.id = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connection id is incorrect`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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); - createConnectionRO.id = faker.string.uuid(); - const getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .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; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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); + createConnectionRO.id = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = await createTestTable(connectionToTestDB); - - 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 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'ID'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[15], 'CREATED_AT'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[19], 'UPDATED_AT'), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = await createTestTable(connectionToTestDB); + + 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 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'ID'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[15], 'CREATED_AT'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[19], 'UPDATED_AT'), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['ID'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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 = '25'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${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, 200); - t.is(typeof getTableRowsRO, 'object'); - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].ID, parseInt(searchedDescription, 10)); - t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'CREATED_AT'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'UPDATED_AT'), true); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['ID'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 = '25'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${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, 200); + t.is(typeof getTableRowsRO, 'object'); + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].ID, parseInt(searchedDescription, 10)); + t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'CREATED_AT'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'UPDATED_AT'), true); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['ID'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'ID'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'ID'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'INTEGER'); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['ID'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'ID'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'ID'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'INTEGER'); + + 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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['ID'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'ID'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'ID'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'INTEGER'); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['ID'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'ID'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'ID'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'INTEGER'); + + 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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=2`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.ASC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.ASC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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.CONNECTION_NOT_FOUND); + } 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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTablesRO, 'pagination'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTablesRO, 'pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'column_default'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - t.is(Object.hasOwn(element, 'isExcluded'), true); - t.is(Object.hasOwn(element, 'isSearched'), true); - } - - t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - - for (const element of getTableStructureRO.primaryColumns) { - t.is(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - } - - for (const element of getTableStructureRO.foreignKeys) { - t.is(Object.hasOwn(element, 'referenced_column_name'), true); - t.is(Object.hasOwn(element, 'referenced_table_name'), true); - t.is(Object.hasOwn(element, 'constraint_name'), true); - t.is(Object.hasOwn(element, 'column_name'), true); - } + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'column_default'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + t.is(Object.hasOwn(element, 'isExcluded'), true); + t.is(Object.hasOwn(element, 'isSearched'), true); + } + + t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); + + for (const element of getTableStructureRO.primaryColumns) { + t.is(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + } + + for (const element of getTableStructureRO.foreignKeys) { + t.is(Object.hasOwn(element, 'referenced_column_name'), true); + t.is(Object.hasOwn(element, 'referenced_table_name'), true); + t.is(Object.hasOwn(element, 'constraint_name'), true); + t.is(Object.hasOwn(element, 'column_name'), true); + } }); test.serial(`${currentTest} should throw an exception whe connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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); - 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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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); + 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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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); - - 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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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); + + 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) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 tableName = ''; - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 tableName = faker.lorem.words(1); - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NOT_FOUND); }); currentTest = 'POST /table/row/:slug'; test.serial(`${currentTest} should add row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const addRowInTableRO = JSON.parse(addRowInTableResponse.text); - console.log('🚀 ~ test ~ addRowInTableRO:', addRowInTableRO); - t.is(addRowInTableResponse.status, 201); - - t.is(Object.hasOwn(addRowInTableRO, 'row'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 43); - t.is(rows[42][testTableColumnName], row[testTableColumnName]); - 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()) - .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getLogsResponse.status, 200); - const getLogsRO = JSON.parse(getLogsResponse.text); - t.is(Object.hasOwn(getLogsRO, 'logs'), true); - t.is(Object.hasOwn(getLogsRO, 'pagination'), true); - t.is(getLogsRO.logs.length > 0, true); - const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); - t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, 'ID'), true); - t.is(getLogsRO.logs[addRowLogIndex].affected_primary_key.ID, 43); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const addRowInTableRO = JSON.parse(addRowInTableResponse.text); + console.log('🚀 ~ test ~ addRowInTableRO:', addRowInTableRO); + t.is(addRowInTableResponse.status, 201); + + t.is(Object.hasOwn(addRowInTableRO, 'row'), true); + t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); + t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 43); + t.is(rows[42][testTableColumnName], row[testTableColumnName]); + 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()) + .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getLogsResponse.status, 200); + const getLogsRO = JSON.parse(getLogsResponse.text); + t.is(Object.hasOwn(getLogsRO, 'logs'), true); + t.is(Object.hasOwn(getLogsRO, 'pagination'), true); + t.is(getLogsRO.logs.length > 0, true); + const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); + t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, 'ID'), true); + t.is(getLogsRO.logs[addRowLogIndex].affected_primary_key.ID, 43); }); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - const fakeConnectionId = ''; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 404); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const fakeConnectionId = ''; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 404); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NAME_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NAME_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.PARAMETER_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.PARAMETER_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NOT_FOUND); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); currentTest = 'PUT /table/row/:slug'; test.serial(`${currentTest} should update row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=1`) - .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, 200); - t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); - t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was updated - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - const updateRowIndex = rows.map((row) => row.ID).indexOf(1); - t.is(rows.length, 42); - t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); - t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=1`) + .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, 200); + t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); + t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was updated + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + const updateRowIndex = rows.map((row) => row.ID).indexOf(1); + t.is(rows.length, 42); + t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); + t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - createConnectionRO.id = ''; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 404); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + createConnectionRO.id = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 404); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 403); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 403); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=&ID=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.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=&ID=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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const fakeTableName = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=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.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeTableName = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=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.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - 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'); - - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + 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'); + + 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) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - 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'); - - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + 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'); + + t.is(updateRowInTableResponse.status, 400); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'DELETE /table/row/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = 1; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 200); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - - t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 41); - const deletedRowIndex = rows.map((row: Record) => row.ID).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, true); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 200); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 41); + const deletedRowIndex = rows.map((row: Record) => row.ID).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, true); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = 1; - const connectionId = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&ID=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 404); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = 1; + const connectionId = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&ID=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 404); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = 1; - const connectionId = faker.string.uuid(); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&ID=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 403); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = 1; + const connectionId = faker.string.uuid(); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&ID=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 403); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = 1; - const fakeTableName = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=${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.TABLE_NAME_MISSING); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = 1; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=${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.TABLE_NAME_MISSING); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = 1; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=${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.TABLE_NOT_FOUND); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=${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.TABLE_NOT_FOUND); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = 1; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); + }, ); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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, 400); - t.is(deleteRowInTableRO.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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, 400); + t.is(deleteRowInTableRO.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = 1; - 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, 200); - const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); - t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); - t.is(typeof foundRowInTableRO.row, 'object'); - t.is(typeof foundRowInTableRO.structure, 'object'); - t.is(typeof foundRowInTableRO.primaryColumns, 'object'); - t.is(typeof foundRowInTableRO.readonly_fields, 'object'); - t.is(typeof foundRowInTableRO.foreignKeys, 'object'); - t.is(foundRowInTableRO.row.ID, 1); - t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); - t.is(Object.keys(foundRowInTableRO.row).length, 5); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = 1; + 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, 200); + const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); + t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); + t.is(typeof foundRowInTableRO.row, 'object'); + t.is(typeof foundRowInTableRO.structure, 'object'); + t.is(typeof foundRowInTableRO.primaryColumns, 'object'); + t.is(typeof foundRowInTableRO.readonly_fields, 'object'); + t.is(typeof foundRowInTableRO.foreignKeys, 'object'); + t.is(foundRowInTableRO.row.ID, 1); + t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); + t.is(Object.keys(foundRowInTableRO.row).length, 5); }); test.serial(`${currentTest} should throw an exception, when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = 1; - createConnectionRO.id = ''; - 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, 404); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = 1; + createConnectionRO.id = ''; + 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, 404); }); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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); - }, + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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); + }, ); test.serial(`${currentTest} should throw an exception, when tableName in not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = 1; - const fakeTableName = ''; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=${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.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=${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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception, when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = 1; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=${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.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&ID=${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.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception, when primary key is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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); + }, ); test.serial( - `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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, 400); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 primaryKeysForDeletion: Array> = [ - { - ID: 1, - }, - { - ID: 10, - }, - { - ID: 32, - }, - ]; - const deleteRowsInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) - .send(primaryKeysForDeletion) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowsInTableResponse.status, 200); - const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - // check that lines was deleted - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); - - for (const key of primaryKeysForDeletion) { - t.is( - rows.findIndex((row) => row.ID === key.id), - -1, - ); - } - - // check that table deletaion was logged - const tableLogsResponse = await request(app.getHttpServer()) - .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(tableLogsResponse.status, 200); - - const tableLogsRO = JSON.parse(tableLogsResponse.text); - t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); - const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); - for (const key of primaryKeysForDeletion) { - t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); - } + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 primaryKeysForDeletion: Array> = [ + { + ID: 1, + }, + { + ID: 10, + }, + { + ID: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) + .send(primaryKeysForDeletion) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowsInTableResponse.status, 200); + const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + // check that lines was deleted + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); + + for (const key of primaryKeysForDeletion) { + t.is( + rows.findIndex((row) => row.ID === key.id), + -1, + ); + } + + // check that table deletaion was logged + const tableLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(tableLogsResponse.status, 200); + + const tableLogsRO = JSON.parse(tableLogsResponse.text); + t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); test.serial(`${currentTest} should test connection and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - 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 { message } = JSON.parse(testConnectionResponse.text); - t.is(message, 'Successfully connected'); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + 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 { message } = JSON.parse(testConnectionResponse.text); + t.is(message, 'Successfully connected'); }); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 getTableCsvResponse = await request(app.getHttpServer()) - .post(`/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}`) - .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(os.tmpdir(), fileName); - - // 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); + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}`) + .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(os.tmpdir(), fileName); + + // 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); }); test.serial( - `${currentTest} should return csv file with table data with search, with pagination, with sorting, + `${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 connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'ID', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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'); - - if (getTableCsvResponse.status !== 201) { - console.log(getTableCsvResponse.text); - } - t.is(getTableCsvResponse.status, 201); - const fileName = `${testTableName}.csv`; - const downloadedFilePatch = join(os.tmpdir(), fileName); - - // 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); - }, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'ID', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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'); + + if (getTableCsvResponse.status !== 201) { + console.log(getTableCsvResponse.text); + } + t.is(getTableCsvResponse.status, 201); + const fileName = `${testTableName}.csv`; + const downloadedFilePatch = join(os.tmpdir(), fileName); + + // 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); + }, ); 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 05408b6c3..0c9063f12 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 @@ -16,7 +16,10 @@ import { DatabaseService } from '../../../src/shared/database/database.service.j import { MockFactory } from '../../mock.factory.js'; 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 { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { ValidationError } from 'class-validator'; @@ -40,3847 +43,3848 @@ const testTables: Array = []; let currentTest; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication() as any; - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication() as any; + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + await createInitialTestUser(app); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error('After tests error ' + e); + } }); currentTest = 'GET /connection/tables/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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 getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTablesRO = JSON.parse(getTablesResponse.text); - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); - - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); - t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); - t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); - t.is(getTablesRO[testTableIndex].table, testTableName); - t.is(getTablesRO[testTableIndex].permissions.visibility, true); - t.is(getTablesRO[testTableIndex].permissions.readonly, false); - t.is(getTablesRO[testTableIndex].permissions.add, true); - t.is(getTablesRO[testTableIndex].permissions.delete, true); - t.is(getTablesRO[testTableIndex].permissions.edit, true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTablesRO = JSON.parse(getTablesResponse.text); + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); + + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); + t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); + t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); + t.is(getTablesRO[testTableIndex].table, testTableName); + t.is(getTablesRO[testTableIndex].permissions.visibility, true); + t.is(getTablesRO[testTableIndex].permissions.readonly, false); + t.is(getTablesRO[testTableIndex].permissions.add, true); + t.is(getTablesRO[testTableIndex].permissions.delete, true); + t.is(getTablesRO[testTableIndex].permissions.edit, true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connectionId not passed in request`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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); - - createConnectionRO.id = ''; - const getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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); + + createConnectionRO.id = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connection id is incorrect`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB); - - 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); - createConnectionRO.id = faker.string.uuid(); - const getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .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; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestDB); + + 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); + createConnectionRO.id = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = await createTestTable(connectionToTestDB); - - 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 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(Object.hasOwn(getTableRowsRO, 'large_dataset'), true); - t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(Object.hasOwn(getTableRowsRO.rows[0], '_id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[15], 'created_at'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[19], 'updated_at'), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = await createTestTable(connectionToTestDB); + + 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 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(Object.hasOwn(getTableRowsRO, 'large_dataset'), true); + t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(Object.hasOwn(getTableRowsRO.rows[0], '_id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[15], 'created_at'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[19], 'updated_at'), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['_id'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) - .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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'created_at'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'updated_at'), true); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['_id'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) + .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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'created_at'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'updated_at'), true); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['_id'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(Object.hasOwn(getTableRowsRO.rows[0], '_id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['_id'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(Object.hasOwn(getTableRowsRO.rows[0], '_id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['_id'], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(Object.hasOwn(getTableRowsRO.rows[0], '_id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + ['_id'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(Object.hasOwn(getTableRowsRO.rows[0], '_id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=2`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.ASC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.ASC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 + `${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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, insertedSearchedIds } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTablesRO, 'pagination'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestDB); + + 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createConnectionRO.id, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTablesRO, 'pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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, 6); - - for (const element of getTableStructureRO.structure) { - t.is(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'column_default'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - t.is(Object.hasOwn(element, 'isExcluded'), true); - t.is(Object.hasOwn(element, 'isSearched'), true); - } - - t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - - for (const element of getTableStructureRO.primaryColumns) { - t.is(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - } - - for (const element of getTableStructureRO.foreignKeys) { - t.is(Object.hasOwn(element, 'referenced_column_name'), true); - t.is(Object.hasOwn(element, 'referenced_table_name'), true); - t.is(Object.hasOwn(element, 'constraint_name'), true); - t.is(Object.hasOwn(element, 'column_name'), true); - } + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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, 6); + + for (const element of getTableStructureRO.structure) { + t.is(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'column_default'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + t.is(Object.hasOwn(element, 'isExcluded'), true); + t.is(Object.hasOwn(element, 'isSearched'), true); + } + + t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); + + for (const element of getTableStructureRO.primaryColumns) { + t.is(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + } + + for (const element of getTableStructureRO.foreignKeys) { + t.is(Object.hasOwn(element, 'referenced_column_name'), true); + t.is(Object.hasOwn(element, 'referenced_table_name'), true); + t.is(Object.hasOwn(element, 'constraint_name'), true); + t.is(Object.hasOwn(element, 'column_name'), true); + } }); test.serial(`${currentTest} should throw an exception whe connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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); - 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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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); + 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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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); - - 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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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); + + 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) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 tableName = ''; - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 tableName = faker.lorem.words(1); - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NOT_FOUND); }); currentTest = 'POST /table/row/:slug'; test.serial(`${currentTest} should add row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const addRowInTableRO = JSON.parse(addRowInTableResponse.text); - t.is(addRowInTableResponse.status, 201); - - t.is(Object.hasOwn(addRowInTableRO, 'row'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 43); - 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()) - .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getLogsResponse.status, 200); - const getLogsRO = JSON.parse(getLogsResponse.text); - t.is(Object.hasOwn(getLogsRO, 'logs'), true); - t.is(Object.hasOwn(getLogsRO, 'pagination'), true); - t.is(getLogsRO.logs.length > 0, true); - const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); - t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, '_id'), true); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const addRowInTableRO = JSON.parse(addRowInTableResponse.text); + t.is(addRowInTableResponse.status, 201); + + t.is(Object.hasOwn(addRowInTableRO, 'row'), true); + t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); + t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 43); + 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()) + .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getLogsResponse.status, 200); + const getLogsRO = JSON.parse(getLogsResponse.text); + t.is(Object.hasOwn(getLogsRO, 'logs'), true); + t.is(Object.hasOwn(getLogsRO, 'pagination'), true); + t.is(getLogsRO.logs.length > 0, true); + const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); + t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, '_id'), true); }); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - _id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - const fakeConnectionId = ''; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 404); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + _id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const fakeConnectionId = ''; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 404); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - _id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NAME_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + _id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NAME_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.PARAMETER_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.PARAMETER_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - _id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NOT_FOUND); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + _id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); currentTest = 'PUT /table/row/:slug'; test.serial(`${currentTest} should update row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - const foundIdForUpdate = insertedSearchedIds[0]._id; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${foundIdForUpdate}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 200); - const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); - - t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); - t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was updated - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - const updateRowIndex = rows.map((row) => row._id).indexOf(foundIdForUpdate); - t.is(rows.length, 42); - t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); - t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const foundIdForUpdate = insertedSearchedIds[0]._id; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${foundIdForUpdate}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 200); + const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); + + t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); + t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was updated + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + const updateRowIndex = rows.map((row) => row._id).indexOf(foundIdForUpdate); + t.is(rows.length, 42); + t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); + t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - createConnectionRO.id = ''; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 404); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + createConnectionRO.id = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 404); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 403); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 403); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=&_id=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.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=&_id=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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const fakeTableName = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=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.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeTableName = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=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.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const row = { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - 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'); - - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + 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'); + + 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) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - 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'); - - t.is(updateRowInTableResponse.status, 500); - const responseObject = JSON.parse(updateRowInTableResponse.text); - t.is(responseObject.originalMessage, `Invalid object id format`); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + 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'); + + t.is(updateRowInTableResponse.status, 500); + const responseObject = JSON.parse(updateRowInTableResponse.text); + t.is(responseObject.originalMessage, `Invalid object id format`); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const foundFirstIdForUpdate = insertedSearchedIds[0]._id; - const foundSecondIdForUpdate = insertedSearchedIds[1]._id; - const requestData = { - primaryKeys: [{ _id: foundFirstIdForUpdate }, { _id: foundSecondIdForUpdate }], - newValues: { - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/update/${createConnectionRO.id}?tableName=${testTableName}`) - .send(JSON.stringify(requestData)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); - - t.is(updateRowInTableResponse.status, 200); - t.is(updateRowInTableRO.success, true); - - // check that the rows were updated - const firstRowResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${foundFirstIdForUpdate}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const firstRow = JSON.parse(firstRowResponse.text); - t.is(firstRowResponse.status, 200); - t.is(firstRow.row[testTableColumnName], fakeName); - t.is(firstRow.row[testTableSecondColumnName], fakeMail); - - const secondRowResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${foundSecondIdForUpdate}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const secondRow = JSON.parse(secondRowResponse.text); - t.is(secondRowResponse.status, 200); - t.is(secondRow.row[testTableColumnName], fakeName); - t.is(secondRow.row[testTableSecondColumnName], fakeMail); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const foundFirstIdForUpdate = insertedSearchedIds[0]._id; + const foundSecondIdForUpdate = insertedSearchedIds[1]._id; + const requestData = { + primaryKeys: [{ _id: foundFirstIdForUpdate }, { _id: foundSecondIdForUpdate }], + newValues: { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/update/${createConnectionRO.id}?tableName=${testTableName}`) + .send(JSON.stringify(requestData)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); + + t.is(updateRowInTableResponse.status, 200); + t.is(updateRowInTableRO.success, true); + + // check that the rows were updated + const firstRowResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${foundFirstIdForUpdate}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const firstRow = JSON.parse(firstRowResponse.text); + t.is(firstRowResponse.status, 200); + t.is(firstRow.row[testTableColumnName], fakeName); + t.is(firstRow.row[testTableSecondColumnName], fakeMail); + + const secondRowResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${foundSecondIdForUpdate}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const secondRow = JSON.parse(secondRowResponse.text); + t.is(secondRowResponse.status, 200); + t.is(secondRow.row[testTableColumnName], fakeName); + t.is(secondRow.row[testTableSecondColumnName], fakeMail); }); currentTest = 'DELETE /table/row/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0]._id; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 200); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - - t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 41); - const deletedRowIndex = rows.map((row: Record) => row._id).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, true); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0]._id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 200); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 41); + const deletedRowIndex = rows.map((row: Record) => row._id).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, true); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0]._id; - const connectionId = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&_id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 404); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0]._id; + const connectionId = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&_id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 404); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0]._id; - const connectionId = faker.string.uuid(); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&_id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 403); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0]._id; + const connectionId = faker.string.uuid(); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&_id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 403); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0]._id; - const fakeTableName = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=${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.TABLE_NAME_MISSING); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0]._id; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=${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.TABLE_NAME_MISSING); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0]._id; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=${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.TABLE_NOT_FOUND); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0]._id; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=${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.TABLE_NOT_FOUND); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForDeletion = insertedSearchedIds[0]._id; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForDeletion = insertedSearchedIds[0]._id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { - testTableName, - testTableColumnName, - testEntitiesSeedsCount, - testTableSecondColumnName, - insertedSearchedIds, - } = await createTestTable(connectionToTestDB); - - 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 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); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { + testTableName, + testTableColumnName, + testEntitiesSeedsCount, + testTableSecondColumnName, + insertedSearchedIds, + } = await createTestTable(connectionToTestDB); + + 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 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); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); + }, ); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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, `Invalid object id format`); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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, `Invalid object id format`); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = insertedSearchedIds[0]._id; - 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, 200); - const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); - t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); - t.is(typeof foundRowInTableRO.row, 'object'); - t.is(typeof foundRowInTableRO.structure, 'object'); - t.is(typeof foundRowInTableRO.primaryColumns, 'object'); - t.is(typeof foundRowInTableRO.readonly_fields, 'object'); - t.is(typeof foundRowInTableRO.foreignKeys, 'object'); - t.is(foundRowInTableRO.row._id, idForSearch); - t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); - t.is(Object.keys(foundRowInTableRO.row).length, 6); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = insertedSearchedIds[0]._id; + 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, 200); + const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); + t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); + t.is(typeof foundRowInTableRO.row, 'object'); + t.is(typeof foundRowInTableRO.structure, 'object'); + t.is(typeof foundRowInTableRO.primaryColumns, 'object'); + t.is(typeof foundRowInTableRO.readonly_fields, 'object'); + t.is(typeof foundRowInTableRO.foreignKeys, 'object'); + t.is(foundRowInTableRO.row._id, idForSearch); + t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); + t.is(Object.keys(foundRowInTableRO.row).length, 6); }); test.serial(`${currentTest} should throw an exception, when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = 1; - createConnectionRO.id = ''; - 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, 404); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = 1; + createConnectionRO.id = ''; + 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, 404); }); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 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); - }, + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 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); + }, ); test.serial(`${currentTest} should throw an exception, when tableName in not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = 1; - const fakeTableName = ''; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=${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.TABLE_NAME_MISSING); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=${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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception, when tableName passed in request is incorrect`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 idForSearch = 1; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=${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.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&_id=${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.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception, when primary key is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { - testTableName, - testTableColumnName, - testEntitiesSeedsCount, - testTableSecondColumnName, - insertedSearchedIds, - } = await createTestTable(connectionToTestDB); - - 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 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); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { + testTableName, + testTableColumnName, + testEntitiesSeedsCount, + testTableSecondColumnName, + insertedSearchedIds, + } = await createTestTable(connectionToTestDB); + + 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 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); + }, ); test.serial( - `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { - testTableName, - testTableColumnName, - testEntitiesSeedsCount, - testTableSecondColumnName, - insertedSearchedIds, - } = await createTestTable(connectionToTestDB); - - 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 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, 400); - const findRowResponse = JSON.parse(foundRowInTableResponse.text); - t.is(findRowResponse.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { + testTableName, + testTableColumnName, + testEntitiesSeedsCount, + testTableSecondColumnName, + insertedSearchedIds, + } = await createTestTable(connectionToTestDB); + + 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 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, 400); + const findRowResponse = JSON.parse(foundRowInTableResponse.text); + t.is(findRowResponse.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 primaryKeysForDeletion: Array> = [ - { - _id: insertedSearchedIds[0]._id, - }, - { - _id: insertedSearchedIds[9]._id, - }, - { - _id: insertedSearchedIds[31]._id, - }, - ]; - const deleteRowsInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) - .send(primaryKeysForDeletion) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowsInTableResponse.status, 200); - const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - // check that lines was deleted - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); - - for (const key of primaryKeysForDeletion) { - t.is( - rows.findIndex((row) => row._id === key._id), - -1, - ); - } - - // check that table deletaion was logged - const tableLogsResponse = await request(app.getHttpServer()) - .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(tableLogsResponse.status, 200); - - const tableLogsRO = JSON.parse(tableLogsResponse.text); - t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); - const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); - for (const key of primaryKeysForDeletion) { - t.is(onlyDeleteLogs.findIndex((log) => log.received_data._id === key._id) >= 0, true); - } + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 primaryKeysForDeletion: Array> = [ + { + _id: insertedSearchedIds[0]._id, + }, + { + _id: insertedSearchedIds[9]._id, + }, + { + _id: insertedSearchedIds[31]._id, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) + .send(primaryKeysForDeletion) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowsInTableResponse.status, 200); + const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + // check that lines was deleted + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); + + for (const key of primaryKeysForDeletion) { + t.is( + rows.findIndex((row) => row._id === key._id), + -1, + ); + } + + // check that table deletaion was logged + const tableLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(tableLogsResponse.status, 200); + + const tableLogsRO = JSON.parse(tableLogsResponse.text); + t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data._id === key._id) >= 0, true); + } }); currentTest = 'DELETE /table/rows/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = - await createTestTable(connectionToTestDB); - - 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 primaryKeysForDeletion = [ - { - _id: insertedSearchedIds[0]._id, - }, - { - _id: insertedSearchedIds[9]._id, - }, - { - _id: insertedSearchedIds[31]._id, - }, - ]; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) - .send(primaryKeysForDeletion) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 200); - const _deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - - //checking that the line was 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'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 200); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 39); - for (const primaryKey of primaryKeysForDeletion) { - t.is( - rows.findIndex((row) => row._id === primaryKey._id), - -1, - ); - } + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName, insertedSearchedIds } = + await createTestTable(connectionToTestDB); + + 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 primaryKeysForDeletion = [ + { + _id: insertedSearchedIds[0]._id, + }, + { + _id: insertedSearchedIds[9]._id, + }, + { + _id: insertedSearchedIds[31]._id, + }, + ]; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) + .send(primaryKeysForDeletion) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 200); + const _deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + + //checking that the line was 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'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 200); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 39); + for (const primaryKey of primaryKeysForDeletion) { + t.is( + rows.findIndex((row) => row._id === primaryKey._id), + -1, + ); + } }); test.serial(`${currentTest} should test connection and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - 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 { message } = JSON.parse(testConnectionResponse.text); - t.is(message, 'Successfully connected'); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + 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 { message } = JSON.parse(testConnectionResponse.text); + t.is(message, 'Successfully connected'); }); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB); - - 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 getTableCsvResponse = await request(app.getHttpServer()) - .post(`/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}`) - .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(os.tmpdir(), fileName); - - // 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); + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB); + + 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 getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createConnectionRO.id}?tableName=${testTableName}`) + .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(os.tmpdir(), fileName); + + // 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); }); test.serial( - `${currentTest} should return csv file with table data with search, with pagination, with sorting, + `${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 connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const { - testTableName, - testTableColumnName, - testEntitiesSeedsCount, - testTableSecondColumnName, - insertedSearchedIds, - } = await createTestTable(connectionToTestDB); - - 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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - '_id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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'); - - if (getTableCsvResponse.status !== 201) { - console.log(getTableCsvResponse.text); - } - t.is(getTableCsvResponse.status, 201); - const fileName = `${testTableName}.csv`; - const downloadedFilePatch = join(os.tmpdir(), fileName); - - // 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); - }, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const { + testTableName, + testTableColumnName, + testEntitiesSeedsCount, + testTableSecondColumnName, + insertedSearchedIds, + } = await createTestTable(connectionToTestDB); + + 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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + '_id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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'); + + if (getTableCsvResponse.status !== 201) { + console.log(getTableCsvResponse.text); + } + t.is(getTableCsvResponse.status, 201); + const fileName = `${testTableName}.csv`; + const downloadedFilePatch = join(os.tmpdir(), fileName); + + // 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); + }, ); 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 e52ac5b97..b612b6d8f 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 @@ -18,7 +18,10 @@ import { MockFactory } from '../../mock.factory.js'; import { createTestTable } from '../../utils/create-test-table.js'; 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 { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -33,3630 +36,3631 @@ const testTables: Array = []; let currentTest; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + await createInitialTestUser(app); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - const { connectionToTestMSSQL } = getTestData(mockFactory); - await dropTestTables(testTables, connectionToTestMSSQL); - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + await dropTestTables(testTables, connectionToTestMSSQL); + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error('After tests error ' + e); + } }); currentTest = 'GET /connection/tables/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesResponse.status, 200); - const getTablesRO = JSON.parse(getTablesResponse.text); - - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); - - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); - t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); - t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); - t.is(getTablesRO[testTableIndex].table, testTableName); - t.is(getTablesRO[testTableIndex].permissions.visibility, true); - t.is(getTablesRO[testTableIndex].permissions.readonly, false); - t.is(getTablesRO[testTableIndex].permissions.add, true); - t.is(getTablesRO[testTableIndex].permissions.delete, true); - t.is(getTablesRO[testTableIndex].permissions.edit, true); - } catch (e) { - console.error(e); - throw e; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesResponse.status, 200); + const getTablesRO = JSON.parse(getTablesResponse.text); + + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); + + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); + t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); + t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); + t.is(getTablesRO[testTableIndex].table, testTableName); + t.is(getTablesRO[testTableIndex].permissions.visibility, true); + t.is(getTablesRO[testTableIndex].permissions.readonly, false); + t.is(getTablesRO[testTableIndex].permissions.add, true); + t.is(getTablesRO[testTableIndex].permissions.delete, true); + t.is(getTablesRO[testTableIndex].permissions.edit, true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connectionId not passed in request`, async (t) => { - try { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connection id is incorrect`, async (t) => { - try { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .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; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[15], 'created_at'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[19], 'updated_at'), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[15], 'created_at'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[19], 'updated_at'), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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 = '25'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) - .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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].id, parseInt(searchedDescription, 10)); - t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'created_at'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'updated_at'), true); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 = '25'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) + .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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].id, parseInt(searchedDescription, 10)); + t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'created_at'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'updated_at'), true); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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, 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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 3); - } catch (e) { - console.error(e); - throw e; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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, 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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=2`, - async (t) => { - try { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - 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; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + 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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - 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; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + 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 + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.ASC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.ASC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTablesRO, 'pagination'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTablesRO, 'pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'column_default'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - t.is(Object.hasOwn(element, 'isExcluded'), true); - t.is(Object.hasOwn(element, 'isSearched'), true); - } - - t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - - for (const element of getTableStructureRO.primaryColumns) { - t.is(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - } - - for (const element of getTableStructureRO.foreignKeys) { - t.is(Object.hasOwn(element, 'referenced_column_name'), true); - t.is(Object.hasOwn(element, 'referenced_table_name'), true); - t.is(Object.hasOwn(element, 'constraint_name'), true); - t.is(Object.hasOwn(element, 'column_name'), true); - } + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'column_default'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + t.is(Object.hasOwn(element, 'isExcluded'), true); + t.is(Object.hasOwn(element, 'isSearched'), true); + } + + t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); + + for (const element of getTableStructureRO.primaryColumns) { + t.is(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + } + + for (const element of getTableStructureRO.foreignKeys) { + t.is(Object.hasOwn(element, 'referenced_column_name'), true); + t.is(Object.hasOwn(element, 'referenced_table_name'), true); + t.is(Object.hasOwn(element, 'constraint_name'), true); + t.is(Object.hasOwn(element, 'column_name'), true); + } }); test.serial(`${currentTest} should throw an exception whe connection id not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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); }); test.serial(`${currentTest}should throw an exception when tableName not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const tableName = ''; - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NAME_MISSING); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const tableName = faker.lorem.words(1); - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NOT_FOUND); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NOT_FOUND); }); currentTest = 'POST /table/row/:slug'; test.serial(`${currentTest} should add row in table and return result`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const addRowInTableRO = JSON.parse(addRowInTableResponse.text); - t.is(addRowInTableResponse.status, 201); - - t.is(Object.hasOwn(addRowInTableRO, 'row'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 43); - t.is(rows[42][testTableColumnName], row[testTableColumnName]); - 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()) - .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getLogsResponse.status, 200); - const getLogsRO = JSON.parse(getLogsResponse.text); - t.is(Object.hasOwn(getLogsRO, 'logs'), true); - t.is(Object.hasOwn(getLogsRO, 'pagination'), true); - t.is(getLogsRO.logs.length > 0, true); - const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); - t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, 'id'), true); - t.is(getLogsRO.logs[addRowLogIndex].affected_primary_key.id, 43); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const addRowInTableRO = JSON.parse(addRowInTableResponse.text); + t.is(addRowInTableResponse.status, 201); + + t.is(Object.hasOwn(addRowInTableRO, 'row'), true); + t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); + t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 43); + t.is(rows[42][testTableColumnName], row[testTableColumnName]); + 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()) + .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getLogsResponse.status, 200); + const getLogsRO = JSON.parse(getLogsResponse.text); + t.is(Object.hasOwn(getLogsRO, 'logs'), true); + t.is(Object.hasOwn(getLogsRO, 'pagination'), true); + t.is(getLogsRO.logs.length > 0, true); + const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); + t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, 'id'), true); + t.is(getLogsRO.logs[addRowLogIndex].affected_primary_key.id, 43); }); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 = { - id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - const fakeConnectionId = ''; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 404); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 = { + id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const fakeConnectionId = ''; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 404); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name is not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 = { - id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NAME_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 = { + id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NAME_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.PARAMETER_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.PARAMETER_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 = { - id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NOT_FOUND); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 = { + id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); currentTest = 'PUT /table/row/:slug'; test.serial(`${currentTest} should update row in table and return result`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 200); - const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); - - t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); - t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was updated - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - const updateRowIndex = rows.map((row) => row.id).indexOf(1); - t.is(rows.length, 42); - t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); - t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 200); + const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); + + t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); + t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was updated + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + const updateRowIndex = rows.map((row) => row.id).indexOf(1); + t.is(rows.length, 42); + t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); + t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - createConnectionRO.id = ''; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 404); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + createConnectionRO.id = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 404); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 403); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 403); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=&id=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.TABLE_NAME_MISSING); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=&id=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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - const fakeTableName = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=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.TABLE_NOT_FOUND); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + const fakeTableName = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=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.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - 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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + 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); + }, ); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, - async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - 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'); - - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + 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'); + + t.is(updateRowInTableResponse.status, 400); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'DELETE /table/row/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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}&id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 200); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - - t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 41); - const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, true); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 200); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 41); + const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, true); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 connectionId = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 404); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 connectionId = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 404); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 connectionId = faker.string.uuid(); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 403); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 connectionId = faker.string.uuid(); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 403); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 fakeTableName = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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}&`) - .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); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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}&`) + .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); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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'); - - 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); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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'); + + 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); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); + }, ); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, - async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 400); - t.is(deleteRowInTableRO.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 400); + t.is(deleteRowInTableRO.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(foundRowInTableResponse.status, 200); - const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); - t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); - t.is(typeof foundRowInTableRO.row, 'object'); - t.is(typeof foundRowInTableRO.structure, 'object'); - t.is(typeof foundRowInTableRO.primaryColumns, 'object'); - t.is(typeof foundRowInTableRO.readonly_fields, 'object'); - t.is(typeof foundRowInTableRO.foreignKeys, 'object'); - t.is(foundRowInTableRO.row.id, 1); - t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); - t.is(Object.keys(foundRowInTableRO.row).length, 5); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(foundRowInTableResponse.status, 200); + const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); + t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); + t.is(typeof foundRowInTableRO.row, 'object'); + t.is(typeof foundRowInTableRO.structure, 'object'); + t.is(typeof foundRowInTableRO.primaryColumns, 'object'); + t.is(typeof foundRowInTableRO.readonly_fields, 'object'); + t.is(typeof foundRowInTableRO.foreignKeys, 'object'); + t.is(foundRowInTableRO.row.id, 1); + t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); + t.is(Object.keys(foundRowInTableRO.row).length, 5); }); test.serial(`${currentTest} should throw an exception, when connection id is not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 = ''; - 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, 404); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 = ''; + 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, 404); }); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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'); - - t.is(foundRowInTableResponse.status, 403); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); - }, + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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'); + + 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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 fakeTableName = ''; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception, when tableName passed in request is incorrect`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception, when primary key is not passed in request`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, - async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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'); - - t.is(foundRowInTableResponse.status, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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'); + + 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 { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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'); - - t.is(foundRowInTableResponse.status, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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'); + + t.is(foundRowInTableResponse.status, 400); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const primaryKeysForDeletion: Array> = [ - { - id: 1, - }, - { - id: 10, - }, - { - id: 32, - }, - ]; - const deleteRowsInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) - .send(primaryKeysForDeletion) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowsInTableResponse.status, 200); - const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - // check that lines was deleted - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); - - for (const key of primaryKeysForDeletion) { - t.is( - rows.findIndex((row) => row.id === key.id), - -1, - ); - } - - // check that table deletaion was logged - const tableLogsResponse = await request(app.getHttpServer()) - .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(tableLogsResponse.status, 200); - - const tableLogsRO = JSON.parse(tableLogsResponse.text); - t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); - const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); - for (const key of primaryKeysForDeletion) { - t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); - } + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const primaryKeysForDeletion: Array> = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) + .send(primaryKeysForDeletion) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowsInTableResponse.status, 200); + const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + // check that lines was deleted + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); + + for (const key of primaryKeysForDeletion) { + t.is( + rows.findIndex((row) => row.id === key.id), + -1, + ); + } + + // check that table deletaion was logged + const tableLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(tableLogsResponse.status, 200); + + const tableLogsRO = JSON.parse(tableLogsResponse.text); + t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); test.serial(`${currentTest} should test connection and return result`, async (t) => { - const { connectionToTestMSSQL } = getTestData(mockFactory); - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const testConnectionResponse = await request(app.getHttpServer()) - .post('/connection/test/') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(testConnectionResponse.status, 201); - const { message } = JSON.parse(testConnectionResponse.text); - t.is(message, 'Successfully connected'); + const { connectionToTestMSSQL } = getTestData(mockFactory); + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const testConnectionResponse = await request(app.getHttpServer()) + .post('/connection/test/') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(testConnectionResponse.status, 201); + const { message } = JSON.parse(testConnectionResponse.text); + t.is(message, 'Successfully connected'); }); 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 ada46590d..a15c58c8c 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 @@ -18,7 +18,10 @@ import { MockFactory } from '../../mock.factory.js'; import { createTestTableForMSSQLWithChema } from '../../utils/create-test-table.js'; 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 { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -33,3631 +36,3629 @@ const testTables: Array = []; let currentTest; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + await createInitialTestUser(app); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - await dropTestTables(testTables, connectionToTestMSSQL); - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + await dropTestTables(testTables, connectionToTestMSSQL); + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error('After tests error ' + e); + } }); currentTest = 'GET /connection/tables/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesResponse.status, 200); - const getTablesRO = JSON.parse(getTablesResponse.text); - - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); - - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); - t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); - t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); - t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); - t.is(getTablesRO[testTableIndex].table, testTableName); - t.is(getTablesRO[testTableIndex].permissions.visibility, true); - t.is(getTablesRO[testTableIndex].permissions.readonly, false); - t.is(getTablesRO[testTableIndex].permissions.add, true); - t.is(getTablesRO[testTableIndex].permissions.delete, true); - t.is(getTablesRO[testTableIndex].permissions.edit, true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesResponse.status, 200); + const getTablesRO = JSON.parse(getTablesResponse.text); + + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => t.table === testTableName); + + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'table'), true); + t.is(Object.hasOwn(getTablesRO[testTableIndex], 'permissions'), true); + t.is(typeof getTablesRO[testTableIndex].permissions, 'object'); + t.is(Object.keys(getTablesRO[testTableIndex].permissions).length, 5); + t.is(getTablesRO[testTableIndex].table, testTableName); + t.is(getTablesRO[testTableIndex].permissions.visibility, true); + t.is(getTablesRO[testTableIndex].permissions.readonly, false); + t.is(getTablesRO[testTableIndex].permissions.add, true); + t.is(getTablesRO[testTableIndex].permissions.delete, true); + t.is(getTablesRO[testTableIndex].permissions.edit, true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connectionId not passed in request`, async (t) => { - try { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an error when connection id is incorrect`, async (t) => { - try { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 getTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${createConnectionRO.id}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .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; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createConnectionRO.id}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[15], 'created_at'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[19], 'updated_at'), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[10], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[15], 'created_at'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[19], 'updated_at'), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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 = '25'; - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) - .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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); - t.is(getTableRowsRO.rows[0].id, parseInt(searchedDescription, 10)); - t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'created_at'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'updated_at'), true); - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 = '25'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) + .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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 5); + t.is(getTableRowsRO.rows[0].id, parseInt(searchedDescription, 10)); + t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], testTableSecondColumnName), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'created_at'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'updated_at'), true); + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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, 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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(getTableRowsRO.rows.length, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); - t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); - t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 3); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + t.is(getTableRowsRO.rows.length, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 5); + t.is(Object.hasOwn(getTableRowsRO.rows[0], 'id'), true); + t.is(Object.hasOwn(getTableRowsRO.rows[1], testTableColumnName), true); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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, 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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=2`, - async (t) => { - try { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - 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; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + 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 + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - undefined, - undefined, - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - 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; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + 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 + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 42, - QueryOrderingEnum.ASC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.ASC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination and with sorting + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.ASC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); - t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, '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(Object.hasOwn(getTableRowsRO.primaryColumns[0], 'column_name'), true); + t.is(Object.hasOwn(getTableRowsRO.primaryColumns[0], '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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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; - } + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - undefined, - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - undefined, - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${createConnectionRO.id}`) - .query({ tableName: testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); - - 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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTablesRO, 'pagination'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, + async (t) => { + try { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createConnectionRO.id}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + 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(Object.hasOwn(getTablesRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTablesRO, 'pagination'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'column_default'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - t.is(Object.hasOwn(element, 'isExcluded'), true); - t.is(Object.hasOwn(element, 'isSearched'), true); - } - - t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - - for (const element of getTableStructureRO.primaryColumns) { - t.is(Object.hasOwn(element, 'column_name'), true); - t.is(Object.hasOwn(element, 'data_type'), true); - } - - for (const element of getTableStructureRO.foreignKeys) { - t.is(Object.hasOwn(element, 'referenced_column_name'), true); - t.is(Object.hasOwn(element, 'referenced_table_name'), true); - t.is(Object.hasOwn(element, 'constraint_name'), true); - t.is(Object.hasOwn(element, 'column_name'), true); - } + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'column_default'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + t.is(Object.hasOwn(element, 'isExcluded'), true); + t.is(Object.hasOwn(element, 'isSearched'), true); + } + + t.is(Object.hasOwn(getTableStructureRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); + + for (const element of getTableStructureRO.primaryColumns) { + t.is(Object.hasOwn(element, 'column_name'), true); + t.is(Object.hasOwn(element, 'data_type'), true); + } + + for (const element of getTableStructureRO.foreignKeys) { + t.is(Object.hasOwn(element, 'referenced_column_name'), true); + t.is(Object.hasOwn(element, 'referenced_table_name'), true); + t.is(Object.hasOwn(element, 'constraint_name'), true); + t.is(Object.hasOwn(element, 'column_name'), true); + } }); test.serial(`${currentTest} should throw an exception whe connection id not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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); }); test.serial(`${currentTest}should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const tableName = ''; - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NAME_MISSING); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const tableName = faker.lorem.words(1); - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 400); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.TABLE_NOT_FOUND); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createConnectionRO.id}?tableName=${tableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 400); + const { message } = JSON.parse(getTableStructure.text); + t.is(message, Messages.TABLE_NOT_FOUND); }); currentTest = 'POST /table/row/:slug'; test.serial(`${currentTest} should add row in table and return result`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const addRowInTableRO = JSON.parse(addRowInTableResponse.text); - t.is(addRowInTableResponse.status, 201); - - t.is(Object.hasOwn(addRowInTableRO, 'row'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 43); - t.is(rows[42][testTableColumnName], row[testTableColumnName]); - 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()) - .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getLogsResponse.status, 200); - const getLogsRO = JSON.parse(getLogsResponse.text); - t.is(Object.hasOwn(getLogsRO, 'logs'), true); - t.is(Object.hasOwn(getLogsRO, 'pagination'), true); - t.is(getLogsRO.logs.length > 0, true); - const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); - t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); - t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, 'id'), true); - t.is(getLogsRO.logs[addRowLogIndex].affected_primary_key.id, 43); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const addRowInTableRO = JSON.parse(addRowInTableResponse.text); + t.is(addRowInTableResponse.status, 201); + + t.is(Object.hasOwn(addRowInTableRO, 'row'), true); + t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); + t.is(addRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(addRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 43); + t.is(rows[42][testTableColumnName], row[testTableColumnName]); + 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()) + .get(`/logs/${createConnectionRO.id}?page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getLogsResponse.status, 200); + const getLogsRO = JSON.parse(getLogsResponse.text); + t.is(Object.hasOwn(getLogsRO, 'logs'), true); + t.is(Object.hasOwn(getLogsRO, 'pagination'), true); + t.is(getLogsRO.logs.length > 0, true); + const addRowLogIndex = getLogsRO.logs.findIndex((log) => log.operationType === 'addRow'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex], 'affected_primary_key'), true); + t.is(typeof getLogsRO.logs[addRowLogIndex].affected_primary_key, 'object'); + t.is(Object.hasOwn(getLogsRO.logs[addRowLogIndex].affected_primary_key, 'id'), true); + t.is(getLogsRO.logs[addRowLogIndex].affected_primary_key.id, 43); }); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 = { - id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - const fakeConnectionId = ''; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 404); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 = { + id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const fakeConnectionId = ''; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${fakeConnectionId}?tableName=${testTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 404); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name is not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 = { - id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NAME_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 = { + id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NAME_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.PARAMETER_MISSING); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.PARAMETER_MISSING); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 = { - id: 999, - [testTableColumnName]: fakeName, - [testTableSecondColumnName]: fakeMail, - }; - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); - - t.is(message, Messages.TABLE_NOT_FOUND); - - //checking that the line wasn't added - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 = { + id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + + //checking that the line wasn't added + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 42); }); currentTest = 'PUT /table/row/:slug'; test.serial(`${currentTest} should update row in table and return result`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 200); - const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); - - t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); - t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); - t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); - - //checking that the line was updated - 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - const updateRowIndex = rows.map((row) => row.id).indexOf(1); - t.is(rows.length, 42); - t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); - t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 200); + const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); + + t.is(Object.hasOwn(updateRowInTableRO, 'row'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(updateRowInTableRO, 'readonly_fields'), true); + t.is(updateRowInTableRO.row[testTableColumnName], row[testTableColumnName]); + t.is(updateRowInTableRO.row[testTableSecondColumnName], row[testTableSecondColumnName]); + + //checking that the line was updated + 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + const updateRowIndex = rows.map((row) => row.id).indexOf(1); + t.is(rows.length, 42); + t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); + t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - createConnectionRO.id = ''; - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 404); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + createConnectionRO.id = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 404); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 403); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 403); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - createConnectionRO.id = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=&id=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.TABLE_NAME_MISSING); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + createConnectionRO.id = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=&id=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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - const fakeTableName = faker.string.uuid(); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=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.TABLE_NOT_FOUND); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + const fakeTableName = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=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.TABLE_NOT_FOUND); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - 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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + 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); + }, ); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, - async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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, - }; - - 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'); - - t.is(updateRowInTableResponse.status, 400); - const { message } = JSON.parse(updateRowInTableResponse.text); - t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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, + }; + + 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'); + + t.is(updateRowInTableResponse.status, 400); + const { message } = JSON.parse(updateRowInTableResponse.text); + t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'DELETE /table/row/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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}&id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 200); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - - t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 41); - const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, true); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 200); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, 41); + const deletedRowIndex = rows.map((row: Record) => row.id).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, true); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 connectionId = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 404); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 connectionId = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 404); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 connectionId = faker.string.uuid(); - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTableResponse.status, 403); - const { message } = JSON.parse(deleteRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 connectionId = faker.string.uuid(); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowInTableResponse.status, 403); + const { message } = JSON.parse(deleteRowInTableResponse.text); + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 fakeTableName = ''; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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}&`) - .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); - - //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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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}&`) + .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); + + //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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); }); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, - async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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'); - - 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); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - - 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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field name`, + async (t) => { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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'); + + 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); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + + 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); + }, ); test.serial( - `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, - async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 400); - t.is(deleteRowInTableRO.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 400); + t.is(deleteRowInTableRO.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(foundRowInTableResponse.status, 200); - const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); - t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); - t.is(typeof foundRowInTableRO.row, 'object'); - t.is(typeof foundRowInTableRO.structure, 'object'); - t.is(typeof foundRowInTableRO.primaryColumns, 'object'); - t.is(typeof foundRowInTableRO.readonly_fields, 'object'); - t.is(typeof foundRowInTableRO.foreignKeys, 'object'); - t.is(foundRowInTableRO.row.id, 1); - t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); - t.is(Object.keys(foundRowInTableRO.row).length, 5); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(foundRowInTableResponse.status, 200); + const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); + t.is(Object.hasOwn(foundRowInTableRO, 'row'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(foundRowInTableRO, 'readonly_fields'), true); + t.is(typeof foundRowInTableRO.row, 'object'); + t.is(typeof foundRowInTableRO.structure, 'object'); + t.is(typeof foundRowInTableRO.primaryColumns, 'object'); + t.is(typeof foundRowInTableRO.readonly_fields, 'object'); + t.is(typeof foundRowInTableRO.foreignKeys, 'object'); + t.is(foundRowInTableRO.row.id, 1); + t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); + t.is(Object.keys(foundRowInTableRO.row).length, 5); }); test.serial(`${currentTest} should throw an exception, when connection id is not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 = ''; - 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, 404); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 = ''; + 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, 404); }); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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'); - - t.is(foundRowInTableResponse.status, 403); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); - }, + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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'); + + 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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 fakeTableName = ''; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NAME_MISSING); }); test.serial(`${currentTest} should throw an exception, when tableName passed in request is incorrect`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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 fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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 fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${fakeTableName}&id=${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.TABLE_NOT_FOUND); }); test.skip(`${currentTest} should throw an exception, when primary key is not passed in request`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) - .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); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&`) + .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); }); -test.skip( - `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, - async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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'); - - t.is(foundRowInTableResponse.status, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.PRIMARY_KEY_INVALID); - }, -); +test.skip(`${currentTest} should throw an exception, when primary key passed in request has incorrect name`, async (t) => { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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'); + + 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 connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .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'); - - t.is(foundRowInTableResponse.status, 400); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .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'); + + t.is(foundRowInTableResponse.status, 400); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTableForMSSQLWithChema(connectionToTestMSSQL); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const primaryKeysForDeletion: Array> = [ - { - id: 1, - }, - { - id: 10, - }, - { - id: 32, - }, - ]; - const deleteRowsInTableResponse = await request(app.getHttpServer()) - .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) - .send(primaryKeysForDeletion) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowsInTableResponse.status, 200); - const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); - - //checking that the line was 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); - - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - // check that lines was deleted - - const { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); - - for (const key of primaryKeysForDeletion) { - t.is( - rows.findIndex((row) => row.id === key.id), - -1, - ); - } - - // check that table deletaion was logged - const tableLogsResponse = await request(app.getHttpServer()) - .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(tableLogsResponse.status, 200); - - const tableLogsRO = JSON.parse(tableLogsResponse.text); - t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); - const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); - for (const key of primaryKeysForDeletion) { - t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); - } + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTableForMSSQLWithChema(connectionToTestMSSQL); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const primaryKeysForDeletion: Array> = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createConnectionRO.id}?tableName=${testTableName}`) + .send(primaryKeysForDeletion) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteRowsInTableResponse.status, 200); + const _deleteRowInTableRO = JSON.parse(deleteRowsInTableResponse.text); + + //checking that the line was 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); + + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + // check that lines was deleted + + const { rows, primaryColumns, pagination } = getTableRowsRO; + + t.is(rows.length, testEntitiesSeedsCount - primaryKeysForDeletion.length); + + for (const key of primaryKeysForDeletion) { + t.is( + rows.findIndex((row) => row.id === key.id), + -1, + ); + } + + // check that table deletaion was logged + const tableLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createConnectionRO.id}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(tableLogsResponse.status, 200); + + const tableLogsRO = JSON.parse(tableLogsResponse.text); + t.is(tableLogsRO.logs.length, primaryKeysForDeletion.length + 1); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); test.serial(`${currentTest} should test connection and return result`, async (t) => { - const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const testConnectionResponse = await request(app.getHttpServer()) - .post('/connection/test/') - .send(connectionToTestMSSQL) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(testConnectionResponse.status, 201); - const { message } = JSON.parse(testConnectionResponse.text); - t.is(message, 'Successfully connected'); + const connectionToTestMSSQL = getTestData(mockFactory).connectionToTestMSSQLSchemaInDocker; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + const testConnectionResponse = await request(app.getHttpServer()) + .post('/connection/test/') + .send(connectionToTestMSSQL) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(testConnectionResponse.status, 201); + const { message } = JSON.parse(testConnectionResponse.text); + t.is(message, 'Successfully connected'); }); 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 0dd1e9538..b099895e0 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 @@ -18,7 +18,7 @@ import { MockFactory } from '../../mock.factory.js'; import { createTestTable } from '../../utils/create-test-table.js'; 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 { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -51,6 +51,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 6d410aaf5..5e87a4924 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 @@ -18,7 +18,7 @@ import { MockFactory } from '../../mock.factory.js'; import { createTestOracleTable } from '../../utils/create-test-table.js'; 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 { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -51,6 +51,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 5637eed24..5a14530d0 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 @@ -18,7 +18,7 @@ import { MockFactory } from '../../mock.factory.js'; import { createTestOracleTable } from '../../utils/create-test-table.js'; 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 { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -51,6 +51,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 4bffe7100..df67df64b 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 @@ -18,7 +18,7 @@ import { MockFactory } from '../../mock.factory.js'; import { createTestTable } from '../../utils/create-test-table.js'; 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 { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -52,6 +52,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 ab6071f06..b79092fb4 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 @@ -21,7 +21,7 @@ import { MockFactory } from '../../mock.factory.js'; import { createTestPostgresTableWithSchema } from '../../utils/create-test-table.js'; 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 { registerUserAndReturnUserInfo, createInitialTestUser } from '../../utils/register-user-and-return-user-info.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { TestUtils } from '../../utils/test.utils.js'; @@ -51,6 +51,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts index f06e529a2..3df567d5e 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts @@ -23,7 +23,7 @@ import { DatabaseService } from '../../../src/shared/database/database.service.j import { MockFactory } from '../../mock.factory.js'; 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 { registerUserAndReturnUserInfo, createInitialTestUser } 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 os from 'node:os'; @@ -57,6 +57,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 e23907561..49750d2e7 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 @@ -14,7 +14,10 @@ import { DatabaseModule } from '../../../src/shared/database/database.module.js' import { DatabaseService } from '../../../src/shared/database/database.service.js'; import { MockFactory } from '../../mock.factory.js'; import { getTestData } from '../../utils/get-test-data.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; import { TestUtils } from '../../utils/test.utils.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; @@ -45,6 +48,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 41bc9d36b..d958f3ed7 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-widgets-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-widgets-e2e.test.ts @@ -1,35 +1,37 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { faker } from "@faker-js/faker"; -import { INestApplication, ValidationPipe } from "@nestjs/common"; -import { Test } from "@nestjs/testing"; -import test from "ava"; -import { ValidationError } from "class-validator"; -import cookieParser from "cookie-parser"; -import request from "supertest"; -import { ApplicationModule } from "../../../src/app.module.js"; -import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; -import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; -import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; -import { Messages } from "../../../src/exceptions/text/messages.js"; -import { Cacher } from "../../../src/helpers/cache/cacher.js"; -import { DatabaseModule } from "../../../src/shared/database/database.module.js"; -import { DatabaseService } from "../../../src/shared/database/database.service.js"; -import { MockFactory } from "../../mock.factory.js"; -import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; -import { getTestData } from "../../utils/get-test-data.js"; -import { registerUserAndReturnUserInfo } from "../../utils/register-user-and-return-user-info.js"; -import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; -import { TestUtils } from "../../utils/test.utils.js"; +import { faker } from '@faker-js/faker'; +import { INestApplication, ValidationPipe } from '@nestjs/common'; +import { Test } from '@nestjs/testing'; +import test from 'ava'; +import { ValidationError } from 'class-validator'; +import cookieParser from 'cookie-parser'; +import request from 'supertest'; +import { ApplicationModule } from '../../../src/app.module.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; +import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; +import { Messages } from '../../../src/exceptions/text/messages.js'; +import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { DatabaseModule } from '../../../src/shared/database/database.module.js'; +import { DatabaseService } from '../../../src/shared/database/database.service.js'; +import { MockFactory } from '../../mock.factory.js'; +import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; +import { getTestData } from '../../utils/get-test-data.js'; +import { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; +import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; +import { TestUtils } from '../../utils/test.utils.js'; const mockFactory = new MockFactory(); let app: INestApplication; let _testUtils: TestUtils; let currentTest; -const tableNameForWidgets = "connection"; +const tableNameForWidgets = 'connection'; -const _uuidRegex: RegExp = - /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const _uuidRegex: RegExp = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i; test.before(async () => { setSaasEnvVariable(); @@ -50,6 +52,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); @@ -58,343 +61,306 @@ test.after(async () => { await Cacher.clearAllCache(); await app.close(); } catch (e) { - console.error("After tests error " + e); + console.error('After tests error ' + e); } }); -currentTest = "GET /widgets/:slug"; +currentTest = 'GET /widgets/:slug'; -test.serial( - `${currentTest} should return empty array, table widgets not created`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should return empty array, table widgets not created`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const connectionId = JSON.parse(createdConnection.text).id; + const connectionId = JSON.parse(createdConnection.text).id; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, "object"); - t.is(getTableWidgetsRO.length, 0); - }, -); + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); -test.serial( - `${currentTest} should return array of table widgets for table`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(typeof getTableWidgetsRO, 'object'); + t.is(getTableWidgetsRO.length, 0); +}); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Cookie", token) - .set("Content-Type", "application/json") - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, "object"); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${tableNameForWidgets}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is( - getTableStructureRO.table_widgets[0].field_name, - newTableWidgets[0].field_name, - ); - t.is( - getTableStructureRO.table_widgets[1].widget_type, - newTableWidgets[1].widget_type, - ); - t.is( - compareTableWidgetsArrays( - getTableStructureRO.table_widgets, - newTableWidgets, - ), - true, - ); - }, -); +test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); -test.serial( - `${currentTest} should throw exception when connection id not passed in request`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Cookie", token) - .set("Content-Type", "application/json") - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const emptyConnectionId = ""; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${emptyConnectionId}?tableName=${tableNameForWidgets}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - t.is(getTableWidgets.status, 404); - }, -); + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); -test.serial( - `${currentTest} should throw exception when connection id passed in request is incorrect`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const fakeConnectionId = faker.string.uuid(); - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${fakeConnectionId}?tableName=${tableNameForWidgets}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - - t.is(getTableWidgets.status, 403); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - }, -); + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, 'object'); + t.is(getTableWidgetsRO.length, 2); -test.serial( - `${currentTest} should throw exception when tableName passed in request is incorrect`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get(`/table/structure/${connectionId}?tableName=${tableNameForWidgets}`) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); + t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); + t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); +}); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); +test.serial(`${currentTest} should throw exception when connection id not passed in request`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Cookie', token) + .set('Content-Type', 'application/json') + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 400); + const emptyConnectionId = ''; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${emptyConnectionId}?tableName=${tableNameForWidgets}`) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + t.is(getTableWidgets.status, 404); +}); - t.is(getTableWidgetsRO.message, Messages.TABLE_NOT_FOUND); - }, -); +test.serial(`${currentTest} should throw exception when connection id passed in request is incorrect`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); -test.serial( - `${currentTest} should throw exception when tableName not passed in request`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + const fakeConnectionId = faker.string.uuid(); + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${fakeConnectionId}?tableName=${tableNameForWidgets}`) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + + t.is(getTableWidgets.status, 403); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); +}); + +test.serial(`${currentTest} should throw exception when tableName passed in request is incorrect`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - const fakeTableName = ""; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 400); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); - t.is(getTableWidgetsRO.message, Messages.TABLE_NAME_MISSING); - }, -); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 400); + + t.is(getTableWidgetsRO.message, Messages.TABLE_NOT_FOUND); +}); + +test.serial(`${currentTest} should throw exception when tableName not passed in request`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const fakeTableName = ''; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 400); -currentTest = "POST /widget/:slug"; + t.is(getTableWidgetsRO.message, Messages.TABLE_NAME_MISSING); +}); + +currentTest = 'POST /widget/:slug'; test.serial(`${currentTest} should return created table widgets`, async (t) => { const { token } = await registerUserAndReturnUserInfo(app); const newConnection = getTestData(mockFactory).newEncryptedConnection; const createdConnection = await request(app.getHttpServer()) - .post("/connection") + .post('/connection') .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidget = - mockFactory.generateCreateWidgetDTOForConnectionTable(); + const newTableWidget = mockFactory.generateCreateWidgetDTOForConnectionTable(); const createTableWidgetResponse = await request(app.getHttpServer()) .post(`/widget/${connectionId}?tableName=connection`) .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); t.is(createTableWidgetResponse.status, 201); const getTableWidgets = await request(app.getHttpServer()) .get(`/widgets/${connectionId}?tableName=connection`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); t.is(getTableWidgets.status, 200); const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, "object"); + t.is(typeof getTableWidgetsRO, 'object'); t.is(getTableWidgetsRO.length, 2); t.is(getTableWidgetsRO[0].widget_type, newTableWidget.widget_type); @@ -405,188 +371,173 @@ test.serial(`${currentTest} hould return updated table widgets`, async (t) => { const { token } = await registerUserAndReturnUserInfo(app); const newConnection = getTestData(mockFactory).newEncryptedConnection; const createdConnection = await request(app.getHttpServer()) - .post("/connection") + .post('/connection') .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .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 newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); const createTableWidgetResponse = await request(app.getHttpServer()) .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); t.is(createTableWidgetResponse.status, 201); - const updatedTableWidgets = - mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); + const updatedTableWidgets = mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); const updateTableWidgetResponse = await request(app.getHttpServer()) .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) .send({ widgets: updatedTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); t.is(updateTableWidgetResponse.status, 201); const getTableWidgets = await request(app.getHttpServer()) .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); t.is(getTableWidgets.status, 200); const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, "object"); + t.is(typeof getTableWidgetsRO, 'object'); t.is(getTableWidgetsRO.length, 2); t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); t.is(compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), true); }); -test.serial( - `${currentTest} should return updated table widgets when old widget updated and new added`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const connectionId = JSON.parse(createdConnection.text).id; - newTableWidgets.shift(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - const updatedTableWidgets = - mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); - const updateTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: updatedTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); - - t.is(updateTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set("Content-Type", "application/json") - .set("masterpwd", "ahalaimahalai") - .set("Cookie", token) - .set("Accept", "application/json"); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, "object"); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); - - t.is( - compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), - true, - ); - }, -); +test.serial(`${currentTest} should return updated table widgets when old widget updated and new added`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const connectionId = JSON.parse(createdConnection.text).id; + newTableWidgets.shift(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + const updatedTableWidgets = mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); + const updateTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: updatedTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); -test.serial( - `${currentTest} should return table widgets without deleted widget`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + t.is(updateTableWidgetResponse.status, 201); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set('Content-Type', 'application/json') + .set('masterpwd', 'ahalaimahalai') + .set('Cookie', token) + .set('Accept', 'application/json'); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, 'object'); + t.is(getTableWidgetsRO.length, 2); - const copyWidgets = [...newTableWidgets]; - copyWidgets.splice(1, 1); + t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); - const updateTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: copyWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); - t.is(updateTableWidgetRO.length, 1); - - t.is(updateTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, "object"); - t.is(getTableWidgetsRO.length, 1); - }, -); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), true); +}); + +test.serial(`${currentTest} should return table widgets without deleted widget`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const copyWidgets = [...newTableWidgets]; + copyWidgets.splice(1, 1); + + const updateTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: copyWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); + t.is(updateTableWidgetRO.length, 1); + + t.is(updateTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, 'object'); + t.is(getTableWidgetsRO.length, 1); +}); test.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") + .post('/connection') .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .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 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"); + .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); @@ -598,148 +549,128 @@ test.serial( const { token } = await registerUserAndReturnUserInfo(app); const newConnection = getTestData(mockFactory).newEncryptedConnection; const createdConnection = await request(app.getHttpServer()) - .post("/connection") + .post('/connection') .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .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 newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); const copyWidgets = [...newTableWidgets]; copyWidgets[0].field_name = faker.lorem.words(1); const createTableWidgetResponse = await request(app.getHttpServer()) .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); t.is(createTableWidgetResponse.status, 400); - t.is( - createTableWidgetRO.message, - Messages.EXCLUDED_OR_NOT_EXISTS(copyWidgets[0].field_name), - ); + t.is(createTableWidgetRO.message, Messages.EXCLUDED_OR_NOT_EXISTS(copyWidgets[0].field_name)); }, ); -test.serial( - `${currentTest} should throw exception when connection id not passed in request`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - const _connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const emptyId = ""; - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${emptyId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - t.is(createTableWidgetResponse.status, 404); - }, -); +test.serial(`${currentTest} should throw exception when connection id not passed in request`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const _connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const emptyId = ''; + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${emptyId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + t.is(createTableWidgetResponse.status, 404); +}); -test.serial( - `${currentTest} should throw exception when connection id passed in request is incorrect`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const _connectionId = JSON.parse(createdConnection.text).id; - const fakeConnectionId = faker.string.uuid(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${fakeConnectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - }, -); +test.serial(`${currentTest} should throw exception when connection id passed in request is incorrect`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const _connectionId = JSON.parse(createdConnection.text).id; + const fakeConnectionId = faker.string.uuid(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${fakeConnectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); +}); -test.serial( - `${currentTest} should throw exception when tableName passed in request is incorrect`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw exception when tableName passed in request is incorrect`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${fakeTableName}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.TABLE_NOT_FOUND); - }, -); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${fakeTableName}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is(createTableWidgetRO.message, Messages.TABLE_NOT_FOUND); +}); -test.serial( - `${currentTest} should throw exception when tableName not passed in request`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post("/connection") - .send(newConnection) - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw exception when tableName not passed in request`, async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post('/connection') + .send(newConnection) + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const fakeTableName = ""; - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${fakeTableName}`) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", token) - .set("masterpwd", "ahalaimahalai") - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.TABLE_NAME_MISSING); - }, -); + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const fakeTableName = ''; + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${fakeTableName}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', token) + .set('masterpwd', 'ahalaimahalai') + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is(createTableWidgetRO.message, Messages.TABLE_NAME_MISSING); +}); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts index 70ae5546e..f070b3497 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts @@ -1,39 +1,38 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable security/detect-object-injection */ -import { faker } from "@faker-js/faker"; -import { INestApplication, ValidationPipe } from "@nestjs/common"; -import { Test } from "@nestjs/testing"; -import test from "ava"; -import { ValidationError } from "class-validator"; -import cookieParser from "cookie-parser"; -import request from "supertest"; -import { ApplicationModule } from "../../../src/app.module.js"; -import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { faker } from '@faker-js/faker'; +import { INestApplication, ValidationPipe } from '@nestjs/common'; +import { Test } from '@nestjs/testing'; +import test from 'ava'; +import { ValidationError } from 'class-validator'; +import cookieParser from 'cookie-parser'; +import request from 'supertest'; +import { ApplicationModule } from '../../../src/app.module.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; +import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; +import { Messages } from '../../../src/exceptions/text/messages.js'; +import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { Constants } from '../../../src/helpers/constants/constants.js'; +import { DatabaseModule } from '../../../src/shared/database/database.module.js'; +import { DatabaseService } from '../../../src/shared/database/database.service.js'; +import { MockFactory } from '../../mock.factory.js'; +import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; import { - AccessLevelEnum, - QueryOrderingEnum, -} from "../../../src/enums/index.js"; -import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; -import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; -import { Messages } from "../../../src/exceptions/text/messages.js"; -import { Cacher } from "../../../src/helpers/cache/cacher.js"; -import { Constants } from "../../../src/helpers/constants/constants.js"; -import { DatabaseModule } from "../../../src/shared/database/database.module.js"; -import { DatabaseService } from "../../../src/shared/database/database.service.js"; -import { MockFactory } from "../../mock.factory.js"; -import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; -import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; -import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; -import { TestUtils } from "../../utils/test.utils.js"; -import { createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection } from "../../utils/user-with-different-permissions-utils.js"; + inviteUserInCompanyAndAcceptInvitation, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; +import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; +import { TestUtils } from '../../utils/test.utils.js'; +import { createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection } from '../../utils/user-with-different-permissions-utils.js'; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const newConnectionToPostgres = - mockFactory.generateConnectionToTestPostgresDBInDocker(); +const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); test.before(async () => { setSaasEnvVariable(); @@ -54,6 +53,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); @@ -62,84 +62,77 @@ test.after(async () => { await Cacher.clearAllCache(); await app.close(); } catch (e) { - console.error("After tests error " + e); + console.error('After tests error ' + e); } }); // Connection controller -currentTest = "GET /connections/"; +currentTest = 'GET /connections/'; -test.serial( - `${currentTest} should return connections, where second user have access`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const findAll = await request(app.getHttpServer()) - .get("/connections") - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - t.is(result.length, 1); - t.is(Object.hasOwn(result[0], "connection"), true); - t.is(Object.hasOwn(result[0], "accessLevel"), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - t.is(Object.hasOwn(result[0], "accessLevel"), true); - t.is(Object.hasOwn(result[0].connection, "host"), true); - t.is(Object.hasOwn(result[0].connection, "host"), true); - t.is(typeof result[0].connection.port, "number"); - t.is(Object.hasOwn(result[0].connection, "port"), true); - t.is(Object.hasOwn(result[0].connection, "username"), true); - t.is(Object.hasOwn(result[0].connection, "database"), true); - t.is(Object.hasOwn(result[0].connection, "sid"), true); - t.is(Object.hasOwn(result[0].connection, "createdAt"), true); - t.is(Object.hasOwn(result[0].connection, "updatedAt"), true); - t.is(Object.hasOwn(result[0].connection, "password"), false); - t.is(Object.hasOwn(result[0].connection, "groups"), false); - t.is(Object.hasOwn(result[0].connection, "author"), false); - } catch (error) { - console.error(error); - throw error; - } - }, -); +test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const findAll = await request(app.getHttpServer()) + .get('/connections') + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + t.is(result.length, 1); + t.is(Object.hasOwn(result[0], 'connection'), true); + t.is(Object.hasOwn(result[0], 'accessLevel'), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + t.is(Object.hasOwn(result[0], 'accessLevel'), true); + t.is(Object.hasOwn(result[0].connection, 'host'), true); + t.is(Object.hasOwn(result[0].connection, 'host'), true); + t.is(typeof result[0].connection.port, 'number'); + t.is(Object.hasOwn(result[0].connection, 'port'), true); + t.is(Object.hasOwn(result[0].connection, 'username'), true); + t.is(Object.hasOwn(result[0].connection, 'database'), true); + t.is(Object.hasOwn(result[0].connection, 'sid'), true); + t.is(Object.hasOwn(result[0].connection, 'createdAt'), true); + t.is(Object.hasOwn(result[0].connection, 'updatedAt'), true); + t.is(Object.hasOwn(result[0].connection, 'password'), false); + t.is(Object.hasOwn(result[0].connection, 'groups'), false); + t.is(Object.hasOwn(result[0].connection, 'author'), false); + } catch (error) { + console.error(error); + throw error; + } +}); -currentTest = "GET /connection/one/:slug"; +currentTest = 'GET /connection/one/:slug'; test.serial(`${currentTest} should return a found connection`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const searchedConnectionId = testData.connections.firstId; const findOneResponce = await request(app.getHttpServer()) .get(`/connection/one/${searchedConnectionId}`) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); t.is(findOneResponce.status, 200); const result = findOneResponce.body.connection; t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, "postgres"); + t.is(result.type, 'postgres'); t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, "number"); + t.is(typeof result.port, 'number'); t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, "postgres"); + t.is(result.username, 'postgres'); t.is(result.database, newConnectionToPostgres.database); t.is(result.sid, null); - t.is(Object.hasOwn(result, "createdAt"), true); - t.is(Object.hasOwn(result, "updatedAt"), true); - t.is(Object.hasOwn(result, "password"), false); - t.is(Object.hasOwn(result, "groups"), false); - t.is(Object.hasOwn(result, "author"), false); + t.is(Object.hasOwn(result, 'createdAt'), true); + t.is(Object.hasOwn(result, 'updatedAt'), true); + t.is(Object.hasOwn(result, 'password'), false); + t.is(Object.hasOwn(result, 'groups'), false); + t.is(Object.hasOwn(result, 'author'), false); } catch (error) { console.error(error); throw error; @@ -150,16 +143,13 @@ test.serial( `${currentTest} should throw an exception, when you do not have permission in this connection`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const searchedConnectionId = testData.connections.secondId; const findOneResponce = await request(app.getHttpServer()) .get(`/connection/one/${searchedConnectionId}`) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); t.is(findOneResponce.status, 200); const findOneRO = JSON.parse(findOneResponce.text); const connectionKeys: Array = Object.keys(findOneRO.connection); @@ -173,35 +163,34 @@ test.serial( }, ); -currentTest = "PUT /connection"; +currentTest = 'PUT /connection'; test.serial(`${currentTest} should return updated connection`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const updateConnection = mockFactory.generateUpdateConnectionDto(); const updateConnectionResponse = await request(app.getHttpServer()) .put(`/connection/${testData.connections.firstId}`) .send(updateConnection) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(updateConnectionResponse.status, 200); const result = updateConnectionResponse.body.connection; - t.is(result.title, "Updated Test Connection"); - t.is(result.type, "postgres"); - t.is(result.host, "testing_nestjs"); - t.is(typeof result.port, "number"); + t.is(result.title, 'Updated Test Connection'); + t.is(result.type, 'postgres'); + t.is(result.host, 'testing_nestjs'); + t.is(typeof result.port, 'number'); t.is(result.port, 5432); - t.is(result.username, "admin"); - t.is(result.database, "testing_nestjs"); + t.is(result.username, 'admin'); + t.is(result.database, 'testing_nestjs'); t.is(result.sid, null); - t.is(Object.hasOwn(result, "createdAt"), true); - t.is(Object.hasOwn(result, "updatedAt"), true); - t.is(Object.hasOwn(result, "password"), false); - t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, 'createdAt'), true); + t.is(Object.hasOwn(result, 'updatedAt'), true); + t.is(Object.hasOwn(result, 'password'), false); + t.is(Object.hasOwn(result, 'groups'), false); } catch (error) { console.error(error); throw error; @@ -212,23 +201,17 @@ test.serial( `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const updateConnection = mockFactory.generateUpdateConnectionDto(); const updateConnectionResponse = await request(app.getHttpServer()) .put(`/connection/${testData.connections.secondId}`) .send(updateConnection) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(updateConnectionResponse.status, 403); - t.is( - JSON.parse(updateConnectionResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); + t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (error) { console.error(error); throw error; @@ -236,27 +219,26 @@ test.serial( }, ); -currentTest = "DELETE /connection/:slug"; +currentTest = 'DELETE /connection/:slug'; test.serial(`${currentTest} should return delete result`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const response = await request(app.getHttpServer()) .put(`/connection/delete/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const result = response.body; //deleted connection not found in database const findOneResponce = await request(app.getHttpServer()) .get(`/connection/one/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(findOneResponce.status, 400); const { message } = JSON.parse(findOneResponce.text); @@ -264,20 +246,20 @@ test.serial(`${currentTest} should return delete result`, async (t) => { t.is(response.status, 200); - t.is(Object.hasOwn(result, "id"), false); + t.is(Object.hasOwn(result, 'id'), false); t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, "postgres"); + t.is(result.type, 'postgres'); t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, "number"); + t.is(typeof result.port, 'number'); t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, "postgres"); + t.is(result.username, 'postgres'); t.is(result.database, newConnectionToPostgres.database); t.is(result.sid, null); - t.is(Object.hasOwn(result, "createdAt"), true); - t.is(Object.hasOwn(result, "updatedAt"), true); - t.is(Object.hasOwn(result, "password"), false); - t.is(Object.hasOwn(result, "groups"), false); - t.is(Object.hasOwn(result, "author"), false); + t.is(Object.hasOwn(result, 'createdAt'), true); + t.is(Object.hasOwn(result, 'updatedAt'), true); + t.is(Object.hasOwn(result, 'password'), false); + t.is(Object.hasOwn(result, 'groups'), false); + t.is(Object.hasOwn(result, 'author'), false); } catch (error) { console.error(error); throw error; @@ -288,25 +270,22 @@ test.serial( `${currentTest} should throw an exception, when you try to delete connection without permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const response = await request(app.getHttpServer()) .put(`/connection/delete/${testData.connections.secondId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 403); t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); //connection wasn't deleted const findOneResponce = await request(app.getHttpServer()) .get(`/connection/one/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(findOneResponce.status, 200); } catch (error) { @@ -316,26 +295,25 @@ test.serial( }, ); -currentTest = "POST /connection/group/:slug"; +currentTest = 'POST /connection/group/:slug'; test.serial(`${currentTest} should return a created group`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createGroupResponse.status, 201); const result = JSON.parse(createGroupResponse.text); t.is(result.title, newGroup1.title); - t.is(Object.hasOwn(result, "users"), true); - t.is(typeof result.users, "object"); + t.is(Object.hasOwn(result, 'users'), true); + t.is(typeof result.users, 'object'); t.is(result.users.length, 1); t.is(result.users[0].email, testData.users.simpleUserEmail.toLowerCase()); t.is(result.users[0].isActive, true); @@ -349,23 +327,17 @@ test.serial( `${currentTest} should throw an exception when you try add group in connection without permission in it`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.secondId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createGroupResponse.status, 403); - t.is( - JSON.parse(createGroupResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); + t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (error) { console.error(error); throw error; @@ -373,108 +345,99 @@ test.serial( }, ); -currentTest = "PUT /connection/group/delete/:slug"; +currentTest = 'PUT /connection/group/delete/:slug'; -test.serial( - `${currentTest} should return connection without deleted group result`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const newGroup1 = mockFactory.generateCreateGroupDto1(); +test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - // create group in connection - let result = createGroupResponse.body; + // create group in connection + let result = createGroupResponse.body; - t.is(createGroupResponse.status, 201); + t.is(createGroupResponse.status, 201); - t.is(Object.hasOwn(result, "id"), true); - t.is(result.title, newGroup1.title); + t.is(Object.hasOwn(result, 'id'), true); + t.is(result.title, newGroup1.title); - const createGroupRO = JSON.parse(createGroupResponse.text); + const createGroupRO = JSON.parse(createGroupResponse.text); - let response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + let response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - //after deleting group - result = response.body; - t.is(response.status, 200); - t.is(Object.hasOwn(result, "title"), true); - t.is(result.title, createGroupRO.title); - t.is(result.isMain, false); - // check that group was deleted + //after deleting group + result = response.body; + t.is(response.status, 200); + t.is(Object.hasOwn(result, 'title'), true); + t.is(result.title, createGroupRO.title); + t.is(result.isMain, false); + // check that group was deleted - response = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + response = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 200); - result = JSON.parse(response.text); - t.is(result.length, 1); - const _groupId = result[0].group.id; + t.is(response.status, 200); + result = JSON.parse(response.text); + t.is(result.length, 1); + const _groupId = result[0].group.id; - t.is(Object.hasOwn(result[0].group, "title"), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); + t.is(Object.hasOwn(result[0].group, 'title'), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); - const index = result.findIndex((el: any) => { - return el.group.title === "Admin"; - }); + const index = result.findIndex((el: any) => { + return el.group.title === 'Admin'; + }); - t.is(index >= 0, true); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(index >= 0, true); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should throw an exception, when you try delete group in connection without permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.secondId}`) - .set("Cookie", testData.users.adminUserToken) + .set('Cookie', testData.users.adminUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); // create group in connection const result = createGroupResponse.body; t.is(createGroupResponse.status, 201); - t.is(Object.hasOwn(result, "id"), true); + t.is(Object.hasOwn(result, 'id'), true); t.is(result.title, newGroup1.title); const createGroupRO = JSON.parse(createGroupResponse.text); const response = await request(app.getHttpServer()) .put(`/connection/group/delete/${testData.connections.secondId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send({ groupId: createGroupRO.id }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 403); t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); @@ -485,37 +448,36 @@ test.serial( }, ); -currentTest = "GET /connection/groups/:slug"; +currentTest = 'GET /connection/groups/:slug'; test.serial(`${currentTest} return should groups in connection`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createGroupResponse.status, 201); const response = await request(app.getHttpServer()) .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 200); const result = JSON.parse(response.text); const _groupId = result[0].group.id; - t.is(Object.hasOwn(result[1].group, "title"), true); + t.is(Object.hasOwn(result[1].group, 'title'), true); t.is(result[0].accessLevel, AccessLevelEnum.edit); - const index = result.findIndex((el: any) => el.group.title === "Admin"); + const index = result.findIndex((el: any) => el.group.title === 'Admin'); t.is(index >= 0, true); } catch (error) { @@ -528,26 +490,23 @@ test.serial( `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.secondId}`) - .set("Cookie", testData.users.adminUserToken) + .set('Cookie', testData.users.adminUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createGroupResponse.status, 201); const response = await request(app.getHttpServer()) .get(`/connection/groups/${testData.connections.secondId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 200); const result = JSON.parse(response.text); @@ -559,185 +518,158 @@ test.serial( }, ); -currentTest = "GET /connection/permissions"; - -test.serial( - `${currentTest} should return permissions object for current group in current connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; +currentTest = 'GET /connection/permissions'; - const response = await request(app.getHttpServer()) - .get( - `/connection/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const result = JSON.parse(response.text); - t.is(response.status, 200); +test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - t.is(Object.hasOwn(result, "connection"), true); - t.is(Object.hasOwn(result, "group"), true); - t.is(Object.hasOwn(result, "tables"), true); - t.is(typeof result.connection, "object"); - t.is(typeof result.group, "object"); - t.is(result.connection.connectionId, testData.connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.edit); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, "object"); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; - const { tables } = result; - const tableIndex = tables.findIndex( - (table) => table.tableName === testData.firstTableInfo.testTableName, - ); - t.is(tables.length > 0, true); - t.is(typeof tables[0], "object"); - t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); - t.is(tables[tableIndex].accessLevel.visibility, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, false); - t.is(tables[tableIndex].accessLevel.delete, false); - t.is(tables[tableIndex].accessLevel.edit, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, false); - t.is(tables[tableIndex].accessLevel.visibility, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.edit, false); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const response = await request(app.getHttpServer()) + .get(`/connection/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const result = JSON.parse(response.text); + t.is(response.status, 200); -currentTest = "GET /connection/user/permissions"; + t.is(Object.hasOwn(result, 'connection'), true); + t.is(Object.hasOwn(result, 'group'), true); + t.is(Object.hasOwn(result, 'tables'), true); + t.is(typeof result.connection, 'object'); + t.is(typeof result.group, 'object'); + t.is(result.connection.connectionId, testData.connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.edit); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, 'object'); + + const { tables } = result; + const tableIndex = tables.findIndex((table) => table.tableName === testData.firstTableInfo.testTableName); + t.is(tables.length > 0, true); + t.is(typeof tables[0], 'object'); + t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); + t.is(tables[tableIndex].accessLevel.visibility, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, false); + t.is(tables[tableIndex].accessLevel.delete, false); + t.is(tables[tableIndex].accessLevel.edit, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, false); + t.is(tables[tableIndex].accessLevel.visibility, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.edit, false); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should return permissions object for current group in current connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +currentTest = 'GET /connection/user/permissions'; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; +test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const response = await request(app.getHttpServer()) - .get( - `/connection/user/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; - t.is(response.status, 200); - const result = JSON.parse(response.text); + const response = await request(app.getHttpServer()) + .get(`/connection/user/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(Object.hasOwn(result, "connection"), true); - t.is(Object.hasOwn(result, "group"), true); - t.is(Object.hasOwn(result, "tables"), true); - t.is(typeof result.connection, "object"); - t.is(typeof result.group, "object"); - t.is(result.connection.connectionId, testData.connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.edit); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, "object"); + t.is(response.status, 200); + const result = JSON.parse(response.text); - const { tables } = result; - const tableIndex = tables.findIndex( - (table) => table.tableName === testData.firstTableInfo.testTableName, - ); - t.is(tables.length > 0, true); - t.is(typeof tables[0], "object"); - t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); - t.is(tables[tableIndex].accessLevel.visibility, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, true); - t.is(tables[tableIndex].accessLevel.delete, true); - t.is(tables[tableIndex].accessLevel.edit, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, true); - t.is(tables[tableIndex].accessLevel.visibility, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.edit, true); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(Object.hasOwn(result, 'connection'), true); + t.is(Object.hasOwn(result, 'group'), true); + t.is(Object.hasOwn(result, 'tables'), true); + t.is(typeof result.connection, 'object'); + t.is(typeof result.group, 'object'); + t.is(result.connection.connectionId, testData.connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.edit); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, 'object'); + + const { tables } = result; + const tableIndex = tables.findIndex((table) => table.tableName === testData.firstTableInfo.testTableName); + t.is(tables.length > 0, true); + t.is(typeof tables[0], 'object'); + t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); + t.is(tables[tableIndex].accessLevel.visibility, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, true); + t.is(tables[tableIndex].accessLevel.delete, true); + t.is(tables[tableIndex].accessLevel.edit, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, true); + t.is(tables[tableIndex].accessLevel.visibility, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.edit, true); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should return permissions object for current group in current connection for current user`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const getGroupsResponse = await request(app.getHttpServer()) .get(`/connection/groups/${testData.connections.secondId}`) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); const groupId = getGroupsRO[0].group.id; const response = await request(app.getHttpServer()) - .get( - `/connection/user/permissions?connectionId=${testData.connections.secondId}&groupId=${groupId}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/connection/user/permissions?connectionId=${testData.connections.secondId}&groupId=${groupId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 200); const result = JSON.parse(response.text); - t.is(Object.hasOwn(result, "connection"), true); - t.is(Object.hasOwn(result, "group"), true); - t.is(Object.hasOwn(result, "tables"), true); - t.is(typeof result.connection, "object"); - t.is(typeof result.group, "object"); + t.is(Object.hasOwn(result, 'connection'), true); + t.is(Object.hasOwn(result, 'group'), true); + t.is(Object.hasOwn(result, 'tables'), true); + t.is(typeof result.connection, 'object'); + t.is(typeof result.group, 'object'); t.is(result.connection.connectionId, testData.connections.secondId); t.is(result.group.groupId, groupId); t.is(result.connection.accessLevel, AccessLevelEnum.none); t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, "object"); + t.is(typeof result.tables, 'object'); const { tables } = result; - const tableIndex = tables.findIndex( - (table) => table.tableName === testData.secondTableInfo.testTableName, - ); + const tableIndex = tables.findIndex((table) => table.tableName === testData.secondTableInfo.testTableName); t.is(tables.length > 0, true); - t.is(typeof tables[0], "object"); - t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is(typeof tables[0], 'object'); + t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); t.is(tables[tableIndex].accessLevel.visibility, false); t.is(tables[tableIndex].accessLevel.readonly, false); t.is(tables[tableIndex].accessLevel.add, false); @@ -752,51 +684,44 @@ test.serial( ); //****************************** GROUP CONTROLLER -currentTest = "GET /groups/"; +currentTest = 'GET /groups/'; -test.serial( - `${currentTest} should return found groups with current user`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should return found groups with current user`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], "group"), true); - t.is(Object.hasOwn(groups[0], "accessLevel"), true); - - t.is(Object.hasOwn(groups[0].group, "title"), true); - t.is(Object.hasOwn(groups[0].group, "isMain"), true); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], 'group'), true); + t.is(Object.hasOwn(groups[0], 'accessLevel'), true); + + t.is(Object.hasOwn(groups[0].group, 'title'), true); + t.is(Object.hasOwn(groups[0].group, 'isMain'), true); + } catch (error) { + console.error(error); + throw error; + } +}); -currentTest = "GET /group/users/:slug"; +currentTest = 'GET /group/users/:slug'; test.serial(`${currentTest} it should return users in group`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const getGroupsResponse = await request(app.getHttpServer()) .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); @@ -804,16 +729,16 @@ test.serial(`${currentTest} it should return users in group`, async (t) => { const response = await request(app.getHttpServer()) .get(`/group/users/${groupId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getUsersRO = JSON.parse(response.text); t.is(getUsersRO.length, 2); t.is(getUsersRO[0].id === getUsersRO[1].id, false); - t.is(Object.hasOwn(getUsersRO[0], "createdAt"), true); - t.is(Object.hasOwn(getUsersRO[0], "password"), false); - t.is(Object.hasOwn(getUsersRO[0], "isActive"), true); - t.is(Object.hasOwn(getUsersRO[0], "email"), true); + t.is(Object.hasOwn(getUsersRO[0], 'createdAt'), true); + t.is(Object.hasOwn(getUsersRO[0], 'password'), false); + t.is(Object.hasOwn(getUsersRO[0], 'isActive'), true); + t.is(Object.hasOwn(getUsersRO[0], 'email'), true); } catch (error) { console.error(error); throw error; @@ -824,16 +749,13 @@ test.serial( `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const getGroupsResponse = await request(app.getHttpServer()) .get(`/connection/groups/${testData.connections.secondId}`) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); @@ -841,9 +763,9 @@ test.serial( const response = await request(app.getHttpServer()) .get(`/group/users/${groupId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getUsersRO = JSON.parse(response.text); t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (error) { @@ -853,17 +775,16 @@ test.serial( }, ); -currentTest = "PUT /group/user"; +currentTest = 'PUT /group/user'; test.serial(`${currentTest} should return group with added user`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const getGroupsResponse = await request(app.getHttpServer()) .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); @@ -880,17 +801,17 @@ test.serial(`${currentTest} should return group with added user`, async (t) => { const email = thirdTestUser.email; const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", testData.users.simpleUserToken) + .put('/group/user') + .set('Cookie', testData.users.simpleUserToken) .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; - t.is(Object.hasOwn(addUserInGroupRO, "title"), true); - t.is(Object.hasOwn(addUserInGroupRO, "isMain"), true); - t.is(Object.hasOwn(addUserInGroupRO, "users"), true); + t.is(Object.hasOwn(addUserInGroupRO, 'title'), true); + t.is(Object.hasOwn(addUserInGroupRO, 'isMain'), true); + t.is(Object.hasOwn(addUserInGroupRO, 'users'), true); const { users } = addUserInGroupRO; t.is(users.length, 3); t.is(users[0].id === users[1].id, false); @@ -902,458 +823,389 @@ test.serial(`${currentTest} should return group with added user`, async (t) => { } }); -test.serial( - `${currentTest} should throw exception, when user email not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", testData.users.simpleUserToken) - .send({ groupId }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const groupId = getGroupsRO[0].group.id; + const addUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', testData.users.simpleUserToken) + .send({ groupId }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should throw exception, when group id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", testData.users.simpleUserToken) - .send({ email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', testData.users.simpleUserToken) + .send({ email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should throw exception, when group id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", testData.users.simpleUserToken) - .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); -currentTest = "DELETE /group/:slug"; + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', testData.users.simpleUserToken) + .send({ groupId, email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should delete result after group deletion`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +currentTest = 'DELETE /group/:slug'; - const newGroup1 = mockFactory.generateCreateGroupDto1(); +test.serial(`${currentTest} should delete result after group deletion`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const newGroup1 = mockFactory.generateCreateGroupDto1(); - t.is(getGroupsResponse.status, 200); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const groupId = JSON.parse(createGroupResponse.text).id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.title, newGroup1.title); - t.is(deleteGroupRO.isMain, false); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(getGroupsResponse.status, 200); -test.serial( - `${currentTest} should throw an exception when you try delete admin group`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const groupId = JSON.parse(createGroupResponse.text).id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.title, newGroup1.title); + t.is(deleteGroupRO.isMain, false); + } catch (error) { + console.error(error); + throw error; + } +}); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); -test.serial( - `${currentTest} should throw an exception when group id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); + } catch (error) { + console.error(error); + throw error; + } +}); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(deleteGroupResponse.status, 404); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); -test.serial( - `${currentTest} should throw an exception when group id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(deleteGroupResponse.status, 404); + } catch (error) { + console.error(error); + throw error; + } +}); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - t.is(getGroupsResponse.status, 200); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(getGroupsResponse.status, 200); -currentTest = "PUT /group/user/delete"; + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should return group without deleted user`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +currentTest = 'PUT /group/user/delete'; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should return group without deleted user`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const groupId = getGroupsRO[0].group.id; + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); + const groupId = getGroupsRO[0].group.id; - const email = thirdTestUser.email; - - const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", testData.users.simpleUserToken) - .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(addUserInGroupResponse.status, 200); - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user/delete") - .set("Cookie", testData.users.simpleUserToken) - .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - - t.is(Object.hasOwn(deleteUserInGroupRO, "title"), true); - t.is(Object.hasOwn(deleteUserInGroupRO, "isMain"), true); - t.is(Object.hasOwn(deleteUserInGroupRO, "users"), true); - const { users } = deleteUserInGroupRO; - t.is(users.length, 2); - t.is(users[0].id === users[1].id, false); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); -test.serial( - `${currentTest} should throw exception, when user email not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const email = thirdTestUser.email; - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', testData.users.simpleUserToken) + .send({ groupId, email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addUserInGroupResponse.status, 200); - const groupId = getGroupsRO[0].group.id; + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user/delete') + .set('Cookie', testData.users.simpleUserToken) + .send({ groupId, email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + + t.is(Object.hasOwn(deleteUserInGroupRO, 'title'), true); + t.is(Object.hasOwn(deleteUserInGroupRO, 'isMain'), true); + t.is(Object.hasOwn(deleteUserInGroupRO, 'users'), true); + const { users } = deleteUserInGroupRO; + t.is(users.length, 2); + t.is(users[0].id === users[1].id, false); + } catch (error) { + console.error(error); + throw error; + } +}); - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); +test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const _email = thirdTestUser.email; + const groupId = getGroupsRO[0].group.id; - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user/delete") - .set("Cookie", testData.users.simpleUserToken) - .send({ groupId }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); -test.serial( - `${currentTest} should throw exception, when group id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const _email = thirdTestUser.email; - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user/delete') + .set('Cookie', testData.users.simpleUserToken) + .send({ groupId }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (error) { + console.error(error); + throw error; + } +}); - const _groupId = getGroupsRO[0].group.id; +test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const email = thirdTestUser.email; + const _groupId = getGroupsRO[0].group.id; - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user/delete") - .set("Cookie", testData.users.simpleUserToken) - .send({ email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); -test.serial( - `${currentTest} should throw exception, when group id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const email = thirdTestUser.email; - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user/delete') + .set('Cookie', testData.users.simpleUserToken) + .send({ email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (error) { + console.error(error); + throw error; + } +}); - let groupId = getGroupsRO[0].group.id; - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); +test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const email = thirdTestUser.email; - - groupId = faker.string.uuid(); - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user/delete") - .set("Cookie", testData.users.simpleUserToken) - .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + let groupId = getGroupsRO[0].group.id; + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + groupId = faker.string.uuid(); + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user/delete') + .set('Cookie', testData.users.simpleUserToken) + .send({ groupId, email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } +}); //****************************** PERMISSION CONTROLLER -currentTest = "PUT permissions/:slug"; +currentTest = 'PUT permissions/:slug'; test.serial( `${currentTest} should return created complex permissions object when you create permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -1380,32 +1232,17 @@ test.serial( ], }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createOrUpdatePermissionRO = JSON.parse( - createOrUpdatePermissionResponse.text, - ); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); t.is(createOrUpdatePermissionResponse.status, 200); - t.is( - JSON.stringify(createOrUpdatePermissionRO.connection), - JSON.stringify(permissions.connection), - ); - t.is( - JSON.stringify(createOrUpdatePermissionRO.group), - JSON.stringify(permissions.group), - ); - t.is( - JSON.stringify(createOrUpdatePermissionRO.tables), - JSON.stringify(permissions.tables), - ); + t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); + t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); + t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); } catch (error) { console.error(error); throw error; @@ -1417,17 +1254,14 @@ test.serial( `${currentTest} should return updated complex permissions object when you update permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -1455,30 +1289,17 @@ test.serial( }; let createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - let createOrUpdatePermissionRO = JSON.parse( - createOrUpdatePermissionResponse.text, - ); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + let createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); JSON.stringify(createOrUpdatePermissionRO); t.is(createOrUpdatePermissionResponse.status, 200); - t.is( - JSON.stringify(createOrUpdatePermissionRO.connection), - JSON.stringify(permissions.connection), - ); - t.is( - JSON.stringify(createOrUpdatePermissionRO.group), - JSON.stringify(permissions.group), - ); - t.is( - JSON.stringify(createOrUpdatePermissionRO.tables), - JSON.stringify(permissions.tables), - ); + t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); + t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); + t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); //************************ WHEN YOU UPDATE PERMISSIONS @@ -1506,30 +1327,17 @@ test.serial( }; createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - createOrUpdatePermissionRO = JSON.parse( - createOrUpdatePermissionResponse.text, - ); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); JSON.stringify(createOrUpdatePermissionRO); t.is(createOrUpdatePermissionResponse.status, 200); - t.is( - JSON.stringify(createOrUpdatePermissionRO.connection), - JSON.stringify(permissions.connection), - ); - t.is( - JSON.stringify(createOrUpdatePermissionRO.group), - JSON.stringify(permissions.group), - ); - t.is( - JSON.stringify(createOrUpdatePermissionRO.tables), - JSON.stringify(permissions.tables), - ); + t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); + t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); + t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); } catch (error) { console.error(error); throw error; @@ -1537,243 +1345,195 @@ test.serial( }, ); -test.serial( - `${currentTest} should throw an exception, when you try change admin group`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: testData.groups.firstAdminGroupId, - accessLevel: AccessLevelEnum.none, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: testData.groups.firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${testData.groups.firstAdminGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createOrUpdatePermissionRO = JSON.parse( - createOrUpdatePermissionResponse.text, - ); - t.is(createOrUpdatePermissionResponse.status, 400); - t.is( - createOrUpdatePermissionRO.message, - Messages.CANNOT_CHANGE_ADMIN_GROUP, - ); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${testData.groups.firstAdminGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); + t.is(createOrUpdatePermissionResponse.status, 400); + t.is(createOrUpdatePermissionRO.message, Messages.CANNOT_CHANGE_ADMIN_GROUP); + } catch (error) { + console.error(error); + throw error; + } +}); //****************************** TABLE CONTROLLER -currentTest = "GET /connection/tables/:slug"; +currentTest = 'GET /connection/tables/:slug'; -test.serial( - `${currentTest} should return all tables in connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const newGroup1 = mockFactory.generateCreateGroupDto1(); +test.serial(`${currentTest} should return all tables in connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; + }, + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (tableItem) => - tableItem.table === testData.firstTableInfo.testTableName, - ); - t.is( - getTablesInConnectionRO[tableIndex].table, - testData.firstTableInfo.testTableName, - ); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); - const { - visibility, - readonly, - add, - delete: del, - edit, - } = getTablesInConnectionRO[tableIndex].permissions; - t.is(visibility, true); - t.is(readonly, false); - t.is(del, true); - t.is(edit, true); - t.is(add, true); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (tableItem) => tableItem.table === testData.firstTableInfo.testTableName, + ); + t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); + const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[tableIndex].permissions; + t.is(visibility, true); + t.is(readonly, false); + t.is(del, true); + t.is(edit, true); + t.is(add, true); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should throw an exception, when connection id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); + const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; + }, + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesInConnection.status, 404); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 404); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should throw an exception, when connection id passed in request is incorrect`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); // create group without visibility table permission const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -1788,7 +1548,7 @@ test.serial( }, tables: [ { - tableName: "users", + tableName: 'users', accessLevel: { visibility: false, readonly: true, @@ -1800,24 +1560,20 @@ test.serial( ], }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createOrUpdatePermissionResponse.status, 200); const fakeConnectionId = faker.string.uuid(); const getTablesInConnection = await request(app.getHttpServer()) .get(`/connection/tables/${fakeConnectionId}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getTablesInConnection.status, 400); const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); @@ -1828,20 +1584,19 @@ test.serial( }, ); -currentTest = "GET /table/rows/:slug"; +currentTest = 'GET /table/rows/:slug'; test.serial(`${currentTest} should return found rows from table`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -1869,36 +1624,25 @@ test.serial(`${currentTest} should return found rows from table`, async (t) => { }; const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createOrUpdatePermissionResponse.status, 200); const getTablesInConnection = await request(app.getHttpServer()) - .get( - `/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getTablesInConnection.status, 200); const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - const { - rows, - primaryColumns, - pagination, - sortable_by, - structure, - foreignKeys, - } = getTablesInConnectionRO; + const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTablesInConnectionRO; t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, "id"); - t.is(primaryColumns[0].data_type, "integer"); + t.is(primaryColumns[0].column_name, 'id'); + t.is(primaryColumns[0].data_type, 'integer'); t.is(sortable_by.length, 0); t.is(structure.length, 5); t.is(foreignKeys.length, 0); @@ -1908,234 +1652,199 @@ test.serial(`${currentTest} should return found rows from table`, async (t) => { } }); -test.serial( - `${currentTest} should throw an exception when connection id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; +test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${testData.firstTableInfo.testTableName}`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesInConnection.status, 404); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 404); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; + }, + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const fakeId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get( - `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesInConnection.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const fakeId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; + }, + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesInConnection = await request(app.getHttpServer()) - .get( - `/table/rows/${testData.connections.firstId}?tableName=${fakeTableName}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/table/rows/${testData.connections.firstId}?tableName=${fakeTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } +}); -currentTest = "GET /table/structure/:slug"; +currentTest = 'GET /table/structure/:slug'; test.serial(`${currentTest} should return table structure`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); // create group without visibility table permission const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -2163,35 +1872,25 @@ test.serial(`${currentTest} should return table structure`, async (t) => { }; const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createOrUpdatePermissionResponse.status, 200); const getTablesStructure = await request(app.getHttpServer()) - .get( - `/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getTablesStructure.status, 200); const getTableStructureRO = JSON.parse(getTablesStructure.text); - const { - structure, - primaryColumns, - foreignKeys, - readonly_fields, - table_widgets, - } = getTableStructureRO; + const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; t.is(structure.length, 5); t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, "id"); - t.is(primaryColumns[0].data_type, "integer"); + t.is(primaryColumns[0].column_name, 'id'); + t.is(primaryColumns[0].data_type, 'integer'); t.is(readonly_fields.length, 0); t.is(table_widgets.length, 0); t.is(foreignKeys.length, 0); @@ -2201,305 +1900,563 @@ test.serial(`${currentTest} should return table structure`, async (t) => { } }); -test.serial( - `${currentTest} should throw an exception when connection id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const getTablesStructure = await request(app.getHttpServer()) - .get( - `/table/structure/?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesStructure.status, 404); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/?tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesStructure.status, 404); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?tableName=users`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } +}); + +test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${testData.connections.firstId}?tableName=`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (error) { + console.error(error); + throw error; + } +}); + +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; + }, + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=users`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${testData.connections.firstId}?tableName=${fakeTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should throw an exception when table name not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +currentTest = 'POST /table/row/:slug'; - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; +test.serial(`${currentTest} should return added row`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); + t.is(addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], randomName); + t.is(addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], randomEmail); + t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); + t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); + t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); + } catch (error) { + console.error(error); + throw error; + } +}); + +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}`) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } +}); + +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; + }, + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=`) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}`) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } +}); + +currentTest = 'PUT /table/row/:slug'; + +test.serial(`${currentTest} should return updated row`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; + }, + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesStructure = await request(app.getHttpServer()) - .get( - `/table/structure/${testData.connections.firstId}?tableName=${fakeTableName}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(createOrUpdatePermissionResponse.status, 200); -currentTest = "POST /table/row/:slug"; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); -test.serial(`${currentTest} should return added row`, async (t) => { + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 200); + t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); + t.is(addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], randomName); + t.is(addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], randomEmail); + t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); + t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); + t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); + } catch (error) { + console.error(error); + throw error; + } +}); + +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); // create group without visibility table permission const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -2527,13 +2484,11 @@ test.serial(`${currentTest} should return added row`, async (t) => { }; const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createOrUpdatePermissionResponse.status, 200); const randomName = faker.person.firstName(); @@ -2541,223 +2496,169 @@ test.serial(`${currentTest} should return added row`, async (t) => { const created_at = new Date(); const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .put(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, created_at: created_at, updated_at: updated_at, }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); - t.is( - addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], - randomName, - ); - t.is( - addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], - randomEmail, - ); - t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); - t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); - t.is(Object.hasOwn(addRowInTableRO, "structure"), true); - t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); - t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); - t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (error) { console.error(error); throw error; } }); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; + }, + ], + }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +currentTest = 'DELETE /table/row/:slug'; - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; +test.serial(`${currentTest} should return delete result`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; - - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); + }, + ], + }; - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}`, - ) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); -currentTest = "PUT /table/row/:slug"; + const deleteRowInTable = await request(app.getHttpServer()) + .delete(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(deleteRowInTable.status, 200); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial(`${currentTest} should return updated row`, async (t) => { +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); // create group without visibility table permission const newGroup1 = mockFactory.generateCreateGroupDto1(); const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -2785,238 +2686,168 @@ test.serial(`${currentTest} should return updated row`, async (t) => { }; const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createOrUpdatePermissionResponse.status, 200); - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`, - ) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 200); - t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); - t.is( - addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], - randomName, - ); - t.is( - addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], - randomEmail, - ); - t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); - t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); - t.is(Object.hasOwn(addRowInTableRO, "structure"), true); - t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); - t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); - t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); } catch (error) { console.error(error); throw error; } }); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + const newGroup1 = mockFactory.generateCreateGroupDto1(); - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } +}); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, - ) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); +currentTest = 'GET /table/row/:slug'; -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} `, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, }, - ], - }; - - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); + }, + ], + }; - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`, - ) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createOrUpdatePermissionResponse.status, 200); -currentTest = "DELETE /table/row/:slug"; + const getRowInTable = await request(app.getHttpServer()) + .get(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=5`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 5); + t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); + t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); + t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial(`${currentTest} should return delete result`, async (t) => { +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -3044,188 +2875,40 @@ test.serial(`${currentTest} should return delete result`, async (t) => { }; const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createOrUpdatePermissionResponse.status, 200); - const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(deleteRowInTable.status, 200); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=5`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (error) { console.error(error); throw error; } }); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (error) { - console.error(error); - throw error; - } - }, -); - -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); - -currentTest = "GET /table/row/:slug"; - -test.serial(`${currentTest} `, async (t) => { +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) + .set('Cookie', testData.users.simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const createGroupRO = JSON.parse(createGroupResponse.text); const newGroupId = createGroupRO.id; @@ -3253,251 +2936,81 @@ test.serial(`${currentTest} `, async (t) => { }; const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createOrUpdatePermissionResponse.status, 200); - const getRowInTable = await request(app.getHttpServer()) - .get( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=5`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 5); - t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); - t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); - t.is(Object.hasOwn(getRowInTableRO, "structure"), true); - t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); - t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); - t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=5`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); } catch (error) { console.error(error); throw error; } }); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get( - `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=5`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); - -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set("Cookie", testData.users.simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get( - `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=5`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, -); - //****************************** TABLE LOGS CONTROLLER -currentTest = "GET /logs/:slug"; - -test.serial( - `${currentTest} should return all found logs in connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +currentTest = 'GET /logs/:slug'; - 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); +test.serial(`${currentTest} should return all found logs in connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${testData.connections.firstId}`) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const getRowInTableRO = JSON.parse(getTableLogs.text); + 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); - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); - t.is( - Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), - true, - ); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${testData.connections.firstId}`) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const { connections, firstTableInfo, @@ -3511,55 +3024,49 @@ test.serial( const created_at = new Date(); const updated_at = new Date(); - const updateConnection = - mockFactory.generateConnectionToTestPostgresDBInDocker(); + const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnectionResponse = await request(app.getHttpServer()) .put(`/connection/${connections.firstId}`) .send(updateConnection) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(updateConnectionResponse.status, 200); - const newConnectionProperties = - mockFactory.generateConnectionPropertiesUserExcluded( - firstTableInfo.testTableName, - false, - ); + const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded( + firstTableInfo.testTableName, + false, + ); - const createConnectionPropertiesResponse = await request( - app.getHttpServer(), - ) + const createConnectionPropertiesResponse = await request(app.getHttpServer()) .post(`/connection/properties/${connections.firstId}`) .send(newConnectionProperties) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createConnectionPropertiesResponse.status, 201); const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) + .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) .send({ [firstTableInfo.testTableColumnName]: randomName, [firstTableInfo.testTableSecondColumnName]: randomEmail, created_at: created_at, updated_at: updated_at, }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(addRowInTable.status, 201); const getTableLogs = await request(app.getHttpServer()) .get(`/logs/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getRowInTableRO = JSON.parse(getTableLogs.text); t.is(getRowInTableRO.logs.length, 0); @@ -3572,162 +3079,144 @@ test.serial( //****************************** TABLE SETTINGS CONTROLLER -currentTest = "GET /settings/"; +currentTest = 'GET /settings/'; -test.serial( - `${currentTest} should return empty table settings when it was not created`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); +test.serial(`${currentTest} should return empty table settings when it was not created`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const getTableSettings = await request(app.getHttpServer()) + .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=users`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + } catch (error) { + console.error(error); + throw error; + } +}); - const getTableSettings = await request(app.getHttpServer()) - .get( - `/settings/?connectionId=${testData.connections.firstId}&tableName=users`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); - } catch (error) { - console.error(error); - throw error; - } - }, -); +test.serial(`${currentTest} should return table settings when it was created`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); -test.serial( - `${currentTest} should return table settings when it was created`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${testData.connections.firstId}`) - .query({ tableName: testData.firstTableInfo.testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ['id'], + [testData.firstTableInfo.testTableSecondColumnName], - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); - t.is(createTableSettingsResponse.status, 201); + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + 'id', + ); - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(getTableSettingsRO.hasOwnProperty('id'), true); - t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(JSON.stringify(getTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(getTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(getTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(getTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${testData.connections.firstId}`) + .query({ tableName: testData.firstTableInfo.testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(getTableSettingsRO.hasOwnProperty('id'), true); + t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); + t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); + t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); + t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); + t.is(JSON.stringify(getTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); + t.is(JSON.stringify(getTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); + t.is(JSON.stringify(getTableSettingsRO.autocomplete_columns), JSON.stringify([])); + t.is(getTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${testData.connections.firstId}`) - .query({ tableName: testData.firstTableInfo.testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ['id'], + [testData.firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${testData.connections.firstId}`) + .query({ tableName: testData.firstTableInfo.testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); const createTableSettingsResponse = await request(app.getHttpServer()) .post( `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, ) .send(createTableSettingsDTO) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); const getTableSettings = await request(app.getHttpServer()) .get( `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getTableSettingsRO = JSON.parse(getTableSettings.text); t.is(getTableSettings.status, 403); t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); @@ -3738,124 +3227,112 @@ test.serial( }, ); -currentTest = "POST /settings/"; +currentTest = 'POST /settings/'; -test.serial( - `${currentTest} should return created table settings`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${testData.connections.firstId}`) - .query({ tableName: testData.firstTableInfo.testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); +test.serial(`${currentTest} should return created table settings`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ['id'], + [testData.firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createTableSettingsResponse.status, 201); + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + 'id', + ); - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.hasOwnProperty('id'), true); - t.is(createTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(createTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(createTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(createTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(createTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(JSON.stringify(createTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(createTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(createTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(createTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${testData.connections.firstId}`) + .query({ tableName: testData.firstTableInfo.testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); + t.is(createTableSettingsRO.hasOwnProperty('id'), true); + t.is(createTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is(createTableSettingsRO.display_name, createTableSettingsDTO.display_name); + t.is(JSON.stringify(createTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); + t.is(JSON.stringify(createTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); + t.is(JSON.stringify(createTableSettingsRO.identification_fields), JSON.stringify([])); + t.is(JSON.stringify(createTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); + t.is(JSON.stringify(createTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); + t.is(JSON.stringify(createTableSettingsRO.autocomplete_columns), JSON.stringify([])); + t.is(createTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${testData.connections.firstId}`) - .query({ tableName: testData.firstTableInfo.testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ['id'], + [testData.firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + 'id', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${testData.connections.firstId}`) + .query({ tableName: testData.firstTableInfo.testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); const createTableSettingsResponse = await request(app.getHttpServer()) .post( `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, ) .send(createTableSettingsDTO) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 403); - const createTableSettingsRO = JSON.parse( - createTableSettingsResponse.text, - ); + const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (error) { console.error(error); @@ -3864,205 +3341,137 @@ test.serial( }, ); -currentTest = "PUT /settings/"; - -test.serial( - `${currentTest} should return updated table settings`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ); - - const createPersonalTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings/personal/${testData.connections.firstId}`) - .query({ tableName: testData.firstTableInfo.testTableName }) - .send(createPersonalTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createPersonalTableSettingsResponse.status, 200); +currentTest = 'PUT /settings/'; - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createTableSettingsResponse.status, 201); +test.serial(`${currentTest} should return updated table settings`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ['id'], + [testData.firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); - const updateTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + 'id', + ); - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put( - `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .send(updateTableSettingsDTO) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const updateTableSettingsRO = JSON.parse( - updateTableSettingsResponse.text, - ); - t.is(updateTableSettingsResponse.status, 200); - - t.is(updateTableSettingsRO.hasOwnProperty('id'), true); - t.is(updateTableSettingsRO.table_name, updateTableSettingsDTO.table_name); - t.is(updateTableSettingsRO.display_name, updateTableSettingsDTO.display_name); - t.is(JSON.stringify(updateTableSettingsRO.search_fields), JSON.stringify(updateTableSettingsDTO.search_fields)); - t.is(JSON.stringify(updateTableSettingsRO.excluded_fields), JSON.stringify(updateTableSettingsDTO.excluded_fields)); - // t.is(JSON.stringify(updateTableSettingsRO.identification_fields)).toBe(JSON.stringify([])); - t.is(JSON.stringify(updateTableSettingsRO.readonly_fields), JSON.stringify(updateTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(updateTableSettingsRO.sortable_by), JSON.stringify(updateTableSettingsDTO.sortable_by)); - // t.is(JSON.stringify(updateTableSettingsRO.autocomplete_columns)).toBe(JSON.stringify([])); - t.is(updateTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } -}); + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${testData.connections.firstId}`) + .query({ tableName: testData.firstTableInfo.testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createPersonalTableSettingsResponse.status, 200); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ['id'], + [testData.firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); -test.serial(`${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.secondId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .send(updateTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) + .send(updateTableSettingsDTO) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const updateTableSettingsRO = JSON.parse(updateTableSettingsResponse.text); + t.is(updateTableSettingsResponse.status, 200); + + t.is(updateTableSettingsRO.hasOwnProperty('id'), true); + t.is(updateTableSettingsRO.table_name, updateTableSettingsDTO.table_name); + t.is(updateTableSettingsRO.display_name, updateTableSettingsDTO.display_name); + t.is(JSON.stringify(updateTableSettingsRO.search_fields), JSON.stringify(updateTableSettingsDTO.search_fields)); + t.is(JSON.stringify(updateTableSettingsRO.excluded_fields), JSON.stringify(updateTableSettingsDTO.excluded_fields)); + // t.is(JSON.stringify(updateTableSettingsRO.identification_fields)).toBe(JSON.stringify([])); + t.is(JSON.stringify(updateTableSettingsRO.readonly_fields), JSON.stringify(updateTableSettingsDTO.readonly_fields)); + t.is(JSON.stringify(updateTableSettingsRO.sortable_by), JSON.stringify(updateTableSettingsDTO.sortable_by)); + // t.is(JSON.stringify(updateTableSettingsRO.autocomplete_columns)).toBe(JSON.stringify([])); + t.is(updateTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } }); -currentTest = "DELETE /settings/"; - test.serial( - `${currentTest} should return array without deleted table settings`, + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.secondId, + testData.secondTableInfo.testTableName, + ['id'], + [testData.secondTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); const createTableSettingsResponse = await request(app.getHttpServer()) .post( - `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, ) .send(createTableSettingsDTO) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createTableSettingsResponse.status, 201); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete( - `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); - t.is(deleteTableSettingsResponse.status, 200); + const updateTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.secondTableInfo.testTableName, + ['id'], + [testData.secondTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); - const getTableSettings = await request(app.getHttpServer()) - .get( - `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + .send(updateTableSettingsDTO) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(updateTableSettingsResponse.status, 403); + t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (error) { console.error(error); throw error; @@ -4070,35 +3479,82 @@ test.serial( }, ); +currentTest = 'DELETE /settings/'; + +test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ['id'], + [testData.firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteTableSettingsResponse.status, 200); + + const getTableSettings = await request(app.getHttpServer()) + .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + } catch (error) { + console.error(error); + throw error; + } +}); + test.serial( `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.secondId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.secondId, + testData.secondTableInfo.testTableName, + ['id'], + [testData.secondTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); const createTableSettingsResponse = await request(app.getHttpServer()) .post( `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, ) .send(createTableSettingsDTO) - .set("Cookie", testData.users.adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); @@ -4106,12 +3562,10 @@ test.serial( .delete( `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteTableSettingsRO = JSON.parse( - deleteTableSettingsResponse.text, - ); + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); t.is(deleteTableSettingsResponse.status, 403); t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (error) { @@ -4123,23 +3577,20 @@ test.serial( //****************************** TABLE WIDGETS CONTROLLER -currentTest = "GET /widgets/:slug"; +currentTest = 'GET /widgets/:slug'; test.skip(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const getTableWidgets = await request(app.getHttpServer()) - .get( - `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Cookie", testData.users.simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getTableWidgetsRO = JSON.parse(getTableWidgets.text); t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, "object"); + t.is(typeof getTableWidgetsRO, 'object'); t.is(getTableWidgetsRO.length, 0); } catch (error) { console.error(error); @@ -4147,132 +3598,95 @@ test.skip(`${currentTest} should return empty widgets array when widgets not cre } }); -test.serial( - `${currentTest} should return array of table widgets for table`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post( - `/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(typeof createTableWidgetRO, "object"); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get( - `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, "object"); - t.is(getTableWidgetsRO.length, 2); - getTableWidgetsRO.sort((a, b) => - a.field_name.localeCompare(b.field_name), - ); - newTableWidgets.sort((a, b) => a.field_name.localeCompare(b.field_name)); - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); +test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); - const getTableStructureResponse = await request(app.getHttpServer()) - .get( - `/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); - getTableStructureRO.table_widgets.sort((a, b) => - a.field_name.localeCompare(b.field_name), - ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(typeof createTableWidgetRO, 'object'); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is( - getTableStructureRO.table_widgets[0].field_name, - newTableWidgets[0].field_name, - ); - t.is( - getTableStructureRO.table_widgets[1].widget_type, - newTableWidgets[1].widget_type, - ); - t.is( - compareTableWidgetsArrays( - getTableStructureRO.table_widgets, - newTableWidgets, - ), - true, - ); - } catch (error) { - console.error(error); - throw error; - } - }, -); + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, 'object'); + t.is(getTableWidgetsRO.length, 2); + getTableWidgetsRO.sort((a, b) => a.field_name.localeCompare(b.field_name)); + newTableWidgets.sort((a, b) => a.field_name.localeCompare(b.field_name)); + + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); + + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get(`/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); + getTableStructureRO.table_widgets.sort((a, b) => a.field_name.localeCompare(b.field_name)); + + t.is(getTableStructureRO.table_widgets.length, 2); + t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); + t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); + t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.secondTableInfo.testTableSecondColumnName, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.secondTableInfo.testTableSecondColumnName, + ); const createTableWidgetResponse = await request(app.getHttpServer()) - .post( - `/widget/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`, - ) + .post(`/widget/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`) .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.adminUserToken) - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.adminUserToken) + .set('Accept', 'application/json'); const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, "object"); + t.is(typeof createTableWidgetRO, 'object'); t.is(createTableWidgetRO.length, 2); t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); const getTableWidgets = await request(app.getHttpServer()) - .get( - `/widgets/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`, - ) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); + .get(`/widgets/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); const getTableWidgetsRO = JSON.parse(getTableWidgets.text); t.is(getTableWidgets.status, 403); t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); @@ -4283,75 +3697,58 @@ test.serial( }, ); -currentTest = "POST /widget/:slug"; +currentTest = 'POST /widget/:slug'; -test.serial( - `${currentTest} should return table settings with created table widget field`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post( - `/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, "object"); +test.serial(`${currentTest} should return table settings with created table widget field`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, 'object'); - const getTableWidgets = await request(app.getHttpServer()) - .get( - `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, "object"); - t.is(getTableWidgetsRO.length, 2); + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, 'object'); + t.is(getTableWidgetsRO.length, 2); - t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( - app, - ); - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); const createTableWidgetResponse = await request(app.getHttpServer()) - .post( - `/widget/${testData.connections.secondId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .post(`/widget/${testData.connections.secondId}?tableName=${testData.firstTableInfo.testTableName}`) .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", testData.users.simpleUserToken) - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); t.is(createTableWidgetResponse.status, 403); t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); 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 83d8bb4a5..9833cbdea 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 @@ -14,7 +14,10 @@ import { ValidationException } from '../../../src/exceptions/custom-exceptions/v import { Cacher } from '../../../src/helpers/cache/cacher.js'; import { DatabaseModule } from '../../../src/shared/database/database.module.js'; import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { + registerUserAndReturnUserInfo, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; import { TestUtils } from '../../utils/test.utils.js'; @@ -41,6 +44,7 @@ test.beforeEach(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 d8709c33e..88188c67e 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts @@ -1,39 +1,38 @@ /* eslint-disable security/detect-object-injection */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { faker } from "@faker-js/faker"; -import { INestApplication, ValidationPipe } from "@nestjs/common"; -import { Test } from "@nestjs/testing"; -import test from "ava"; -import { ValidationError } from "class-validator"; -import cookieParser from "cookie-parser"; -import request from "supertest"; -import { ApplicationModule } from "../../../src/app.module.js"; -import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { faker } from '@faker-js/faker'; +import { INestApplication, ValidationPipe } from '@nestjs/common'; +import { Test } from '@nestjs/testing'; +import test from 'ava'; +import { ValidationError } from 'class-validator'; +import cookieParser from 'cookie-parser'; +import request from 'supertest'; +import { ApplicationModule } from '../../../src/app.module.js'; +import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; +import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; +import { Messages } from '../../../src/exceptions/text/messages.js'; +import { Cacher } from '../../../src/helpers/cache/cacher.js'; +import { Constants } from '../../../src/helpers/constants/constants.js'; +import { DatabaseModule } from '../../../src/shared/database/database.module.js'; +import { DatabaseService } from '../../../src/shared/database/database.service.js'; +import { MockFactory } from '../../mock.factory.js'; +import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; import { - AccessLevelEnum, - QueryOrderingEnum, -} from "../../../src/enums/index.js"; -import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; -import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; -import { Messages } from "../../../src/exceptions/text/messages.js"; -import { Cacher } from "../../../src/helpers/cache/cacher.js"; -import { Constants } from "../../../src/helpers/constants/constants.js"; -import { DatabaseModule } from "../../../src/shared/database/database.module.js"; -import { DatabaseService } from "../../../src/shared/database/database.service.js"; -import { MockFactory } from "../../mock.factory.js"; -import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; -import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; -import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; -import { TestUtils } from "../../utils/test.utils.js"; -import { createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions } from "../../utils/user-with-different-permissions-utils.js"; + inviteUserInCompanyAndAcceptInvitation, + createInitialTestUser, +} from '../../utils/register-user-and-return-user-info.js'; +import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; +import { TestUtils } from '../../utils/test.utils.js'; +import { createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions } from '../../utils/user-with-different-permissions-utils.js'; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const newConnectionToPostgres = - mockFactory.generateConnectionToTestPostgresDBInDocker(); +const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnection = mockFactory.generateUpdateConnectionDto(); const newGroup1 = mockFactory.generateCreateGroupDto1(); const tablePermissions = { @@ -63,6 +62,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); @@ -71,7 +71,7 @@ test.after(async () => { await Cacher.clearAllCache(); await app.close(); } catch (e) { - console.error("After tests error " + e); + console.error('After tests error ' + e); } }); @@ -79,64 +79,55 @@ test.after(async () => { //****************************** CONNECTION CONTROLLER -currentTest = "GET /connections/"; +currentTest = 'GET /connections/'; -test.serial( - `${currentTest} should return connections, where second user have access`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const findAll = await request(app.getHttpServer()) - .get("/connections") - .set("Content-Type", "application/json") - .set("Cookie", simpleUserToken) - .set("Accept", "application/json"); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - t.is(result.length, 1); - t.is(Object.hasOwn(result[0], "connection"), true); - t.is(Object.hasOwn(result[0], "accessLevel"), true); - - t.is(Object.hasOwn(result[0], "accessLevel"), true); - t.is(Object.hasOwn(result[0].connection, "host"), true); - t.is(Object.hasOwn(result[0].connection, "host"), true); - t.is(typeof result[0].connection.port, "number"); - t.is(Object.hasOwn(result[0].connection, "port"), true); - t.is(Object.hasOwn(result[0].connection, "username"), true); - t.is(Object.hasOwn(result[0].connection, "database"), true); - t.is(Object.hasOwn(result[0].connection, "sid"), true); - t.is(Object.hasOwn(result[0].connection, "createdAt"), true); - t.is(Object.hasOwn(result[0].connection, "updatedAt"), true); - t.is(Object.hasOwn(result[0].connection, "password"), false); - t.is(Object.hasOwn(result[0].connection, "groups"), false); - t.is(Object.hasOwn(result[0].connection, "author"), false); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const findAll = await request(app.getHttpServer()) + .get('/connections') + .set('Content-Type', 'application/json') + .set('Cookie', simpleUserToken) + .set('Accept', 'application/json'); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + t.is(result.length, 1); + t.is(Object.hasOwn(result[0], 'connection'), true); + t.is(Object.hasOwn(result[0], 'accessLevel'), true); + + t.is(Object.hasOwn(result[0], 'accessLevel'), true); + t.is(Object.hasOwn(result[0].connection, 'host'), true); + t.is(Object.hasOwn(result[0].connection, 'host'), true); + t.is(typeof result[0].connection.port, 'number'); + t.is(Object.hasOwn(result[0].connection, 'port'), true); + t.is(Object.hasOwn(result[0].connection, 'username'), true); + t.is(Object.hasOwn(result[0].connection, 'database'), true); + t.is(Object.hasOwn(result[0].connection, 'sid'), true); + t.is(Object.hasOwn(result[0].connection, 'createdAt'), true); + t.is(Object.hasOwn(result[0].connection, 'updatedAt'), true); + t.is(Object.hasOwn(result[0].connection, 'password'), false); + t.is(Object.hasOwn(result[0].connection, 'groups'), false); + t.is(Object.hasOwn(result[0].connection, 'author'), false); + } catch (e) { + console.error(e); + } +}); -currentTest = "GET /connection/one/:slug"; +currentTest = 'GET /connection/one/:slug'; test.serial(`${currentTest} should return a found connection`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -149,26 +140,26 @@ test.serial(`${currentTest} should return a found connection`, async (t) => { const searchedConnectionId = connections.firstId; const findOneResponce = await request(app.getHttpServer()) .get(`/connection/one/${searchedConnectionId}`) - .set("Content-Type", "application/json") - .set("Cookie", simpleUserToken) - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', simpleUserToken) + .set('Accept', 'application/json'); t.is(findOneResponce.status, 200); const result = findOneResponce.body.connection; t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, "postgres"); + t.is(result.type, 'postgres'); t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, "number"); + t.is(typeof result.port, 'number'); t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, "postgres"); + t.is(result.username, 'postgres'); t.is(result.database, newConnectionToPostgres.database); t.is(result.sid, null); - t.is(Object.hasOwn(result, "createdAt"), true); - t.is(Object.hasOwn(result, "updatedAt"), true); - t.is(Object.hasOwn(result, "password"), false); - t.is(Object.hasOwn(result, "groups"), false); - t.is(Object.hasOwn(result, "author"), false); + t.is(Object.hasOwn(result, 'createdAt'), true); + t.is(Object.hasOwn(result, 'updatedAt'), true); + t.is(Object.hasOwn(result, 'password'), false); + t.is(Object.hasOwn(result, 'groups'), false); + t.is(Object.hasOwn(result, 'author'), false); } catch (e) { console.error(e); } @@ -178,10 +169,7 @@ test.serial( `${currentTest} should throw an exception, when you do not have permission in this connection`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -195,65 +183,53 @@ test.serial( const findOneResponce = await request(app.getHttpServer()) .get(`/connection/one/${searchedConnectionId}`) - .set("Content-Type", "application/json") - .set("Cookie", simpleUserToken) - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', simpleUserToken) + .set('Accept', 'application/json'); // todo add checking connection object properties t.is(findOneResponce.status, 200); const findOneRO = JSON.parse(findOneResponce.text); - t.is(Object.hasOwn(findOneRO, "host"), false); + t.is(Object.hasOwn(findOneRO, 'host'), false); } catch (e) { console.error(e); } }, ); -currentTest = "PUT /connection"; +currentTest = 'PUT /connection'; -test.serial( - `${currentTest} should throw exception you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; +test.serial(`${currentTest} should throw exception you do not have permission`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(updateConnectionResponse.status, 403); - t.is( - JSON.parse(updateConnectionResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); - } catch (e) { - console.error(e); - } - }, -); + t.is(updateConnectionResponse.status, 403); + t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -265,71 +241,59 @@ test.serial( const updateConnectionResponse = await request(app.getHttpServer()) .put(`/connection/${connections.secondId}`) .send(updateConnection) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(updateConnectionResponse.status, 403); - t.is( - JSON.parse(updateConnectionResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); + t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); } }, ); -currentTest = "DELETE /connection/:slug"; - -test.serial( - `${currentTest} should throw an exception do not have permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; +currentTest = 'DELETE /connection/:slug'; - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); +test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; - //deleted connection found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //deleted connection found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); - } catch (e) { - console.error(e); - } - }, -); + t.is(findOneResponce.status, 200); + t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should throw an exception, when you try to delete connection without permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -341,18 +305,18 @@ test.serial( const response = await request(app.getHttpServer()) .put(`/connection/delete/${connections.secondId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 403); t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); //connection wasn't deleted const findOneResponce = await request(app.getHttpServer()) .get(`/connection/one/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(findOneResponce.status, 200); } catch (e) { @@ -361,51 +325,39 @@ test.serial( }, ); -currentTest = "POST /connection/group/:slug"; +currentTest = 'POST /connection/group/:slug'; -test.serial( - `${currentTest} should throw an exception don not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; +test.serial(`${currentTest} should throw an exception don not have permission`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(createGroupResponse.status, 403); - t.is( - JSON.parse(createGroupResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); - } catch (e) { - console.error(e); - } - }, -); + t.is(createGroupResponse.status, 403); + t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should throw an exception when you try add group in connection without permission in it`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -416,84 +368,72 @@ test.serial( } = testData; const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${connections.secondId}`) - .set("Cookie", simpleUserToken) + .set('Cookie', simpleUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createGroupResponse.status, 403); - t.is( - JSON.parse(createGroupResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); + t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); } }, ); -currentTest = "PUT /connection/group/:slug"; +currentTest = 'PUT /connection/group/:slug'; -test.serial( - `${currentTest} should return connection without deleted group result`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; +test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set("Cookie", adminUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set('Cookie', adminUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - // create group in connection - let result = createGroupResponse.body; - t.is(createGroupResponse.status, 201); + // create group in connection + let result = createGroupResponse.body; + t.is(createGroupResponse.status, 201); - t.is(Object.hasOwn(result, "id"), true); - t.is(result.title, newGroup1.title); + t.is(Object.hasOwn(result, 'id'), true); + t.is(result.title, newGroup1.title); - const createGroupRO = JSON.parse(createGroupResponse.text); + const createGroupRO = JSON.parse(createGroupResponse.text); - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - //after deleting group - result = response.body; + //after deleting group + result = response.body; - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should throw an exception, when you try delete group in connection without permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -504,27 +444,27 @@ test.serial( } = testData; const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${connections.secondId}`) - .set("Cookie", adminUserToken) + .set('Cookie', adminUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); // create group in connection const result = createGroupResponse.body; t.is(createGroupResponse.status, 201); - t.is(Object.hasOwn(result, "id"), true); + t.is(Object.hasOwn(result, 'id'), true); t.is(result.title, newGroup1.title); const createGroupRO = JSON.parse(createGroupResponse.text); const response = await request(app.getHttpServer()) .put(`/connection/group/delete/${connections.secondId}`) - .set("Cookie", simpleUserToken) + .set('Cookie', simpleUserToken) .send({ groupId: createGroupRO.id }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 403); t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); @@ -534,14 +474,11 @@ test.serial( }, ); -currentTest = "GET /connection/groups/:slug"; +currentTest = 'GET /connection/groups/:slug'; test.serial(`${currentTest} should groups in connection`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -555,28 +492,28 @@ test.serial(`${currentTest} should groups in connection`, async (t) => { const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${connections.firstId}`) - .set("Cookie", adminUserToken) + .set('Cookie', adminUserToken) .send(newRandomGroup2) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createGroupResponse.status, 201); const response = await request(app.getHttpServer()) .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 200); const result = JSON.parse(response.text); const _groupId = result[0].group.id; - t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(Object.hasOwn(result[0].group, 'title'), true); t.is(result[0].accessLevel, AccessLevelEnum.edit); const index = result.findIndex((el: any) => { - return el.group.title === "Admin"; + return el.group.title === 'Admin'; }); t.is(index >= 0, false); @@ -589,10 +526,7 @@ test.serial( `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -603,18 +537,18 @@ test.serial( } = testData; const createGroupResponse = await request(app.getHttpServer()) .post(`/connection/group/${connections.secondId}`) - .set("Cookie", adminUserToken) + .set('Cookie', adminUserToken) .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createGroupResponse.status, 201); const response = await request(app.getHttpServer()) .get(`/connection/groups/${connections.secondId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(response.status, 200); const result = JSON.parse(response.text); @@ -625,16 +559,124 @@ test.serial( }, ); -currentTest = "GET /connection/permissions"; +currentTest = 'GET /connection/permissions'; + +test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, 'connection'), true); + t.is(Object.hasOwn(result, 'group'), true); + t.is(Object.hasOwn(result, 'tables'), true); + t.is(typeof result.connection, 'object'); + t.is(typeof result.group, 'object'); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, 'object'); + + const { tables } = result; + const tableIndex = tables.findIndex((table: any) => table.tableName === firstTableInfo.testTableName); + t.is(tables.length > 0, true); + t.is(typeof tables[tableIndex], 'object'); + t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); + t.is(tables[tableIndex].accessLevel.visibility, tablePermissions.visibility); + t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); + t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + } +}); + +currentTest = 'GET /connection/user/permissions'; + +test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, 'connection'), true); + t.is(Object.hasOwn(result, 'group'), true); + t.is(Object.hasOwn(result, 'tables'), true); + t.is(typeof result.connection, 'object'); + t.is(typeof result.group, 'object'); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, 'object'); + + const { tables } = result; + const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); + t.is(tables.length > 0, true); + t.is(typeof tables[foundTableIndex], 'object'); + t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); + t.is(tables[foundTableIndex].accessLevel.visibility, tablePermissions.visibility); + t.is(tables[foundTableIndex].accessLevel.readonly, tablePermissions.readonly); + t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + } +}); test.serial( - `${currentTest} should return permissions object for current group in current connection`, + `${currentTest} should return permissions object for current group in current connection for current user`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -643,242 +685,89 @@ test.serial( secondTableInfo, users: { adminUserToken, simpleUserToken }, } = testData; + const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/connection/groups/${connections.secondId}`) + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; const response = await request(app.getHttpServer()) - .get( - `/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const result = JSON.parse(response.text); + .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(response.status, 200); + const result = JSON.parse(response.text); - t.is(Object.hasOwn(result, "connection"), true); - t.is(Object.hasOwn(result, "group"), true); - t.is(Object.hasOwn(result, "tables"), true); - t.is(typeof result.connection, "object"); - t.is(typeof result.group, "object"); - t.is(result.connection.connectionId, connections.firstId); + t.is(Object.hasOwn(result, 'connection'), true); + t.is(Object.hasOwn(result, 'group'), true); + t.is(Object.hasOwn(result, 'tables'), true); + t.is(typeof result.connection, 'object'); + t.is(typeof result.group, 'object'); + t.is(result.connection.connectionId, connections.secondId); t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, "object"); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, 'object'); const { tables } = result; - const tableIndex = tables.findIndex( - (table: any) => table.tableName === firstTableInfo.testTableName, - ); + const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); t.is(tables.length > 0, true); - t.is(typeof tables[tableIndex], "object"); - t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); - t.is( - tables[tableIndex].accessLevel.visibility, - tablePermissions.visibility, - ); - t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); + t.is(typeof tables[0], 'object'); + t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); + t.is(tables[foundTableIndex].accessLevel.visibility, false); + t.is(tables[foundTableIndex].accessLevel.readonly, false); + t.is(tables[foundTableIndex].accessLevel.add, false); + t.is(tables[foundTableIndex].accessLevel.delete, false); + t.is(tables[foundTableIndex].accessLevel.edit, false); + t.is(tables[foundTableIndex].accessLevel.edit, false); } catch (e) { console.error(e); } }, ); -currentTest = "GET /connection/user/permissions"; +//****************************** GROUP CONTROLLER ******************************// -test.serial( - `${currentTest} should return permissions object for current group in current connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get( - `/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, "connection"), true); - t.is(Object.hasOwn(result, "group"), true); - t.is(Object.hasOwn(result, "tables"), true); - t.is(typeof result.connection, "object"); - t.is(typeof result.group, "object"); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, "object"); - - const { tables } = result; - const foundTableIndex = tables.findIndex( - (table) => table.tableName === firstTableInfo.testTableName, - ); - t.is(tables.length > 0, true); - t.is(typeof tables[foundTableIndex], "object"); - t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); - t.is( - tables[foundTableIndex].accessLevel.visibility, - tablePermissions.visibility, - ); - t.is( - tables[foundTableIndex].accessLevel.readonly, - tablePermissions.readonly, - ); - t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - } - }, -); - -test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get( - `/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, "connection"), true); - t.is(Object.hasOwn(result, "group"), true); - t.is(Object.hasOwn(result, "tables"), true); - t.is(typeof result.connection, "object"); - t.is(typeof result.group, "object"); - t.is(result.connection.connectionId, connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, "object"); - - const { tables } = result; - const foundTableIndex = tables.findIndex( - (table) => table.tableName === firstTableInfo.testTableName, - ); - t.is(tables.length > 0, true); - t.is(typeof tables[0], "object"); - t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); - t.is(tables[foundTableIndex].accessLevel.visibility, false); - t.is(tables[foundTableIndex].accessLevel.readonly, false); - t.is(tables[foundTableIndex].accessLevel.add, false); - t.is(tables[foundTableIndex].accessLevel.delete, false); - t.is(tables[foundTableIndex].accessLevel.edit, false); - t.is(tables[foundTableIndex].accessLevel.edit, false); - } catch (e) { - console.error(e); - } - }, -); - -//****************************** GROUP CONTROLLER ******************************// - -currentTest = "GET /groups/"; +currentTest = 'GET /groups/'; -test.serial( - `${currentTest} should return found groups with current user`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - users: { simpleUserToken }, - } = testData; +test.serial(`${currentTest} should return found groups with current user`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + users: { simpleUserToken }, + } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], "group"), true); - t.is(Object.hasOwn(groups[0], "accessLevel"), true); - - t.is(Object.hasOwn(groups[0].group, "title"), true); - t.is(Object.hasOwn(groups[0].group, "isMain"), true); - } catch (e) { - console.error(e); - } - }, -); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], 'group'), true); + t.is(Object.hasOwn(groups[0], 'accessLevel'), true); + + t.is(Object.hasOwn(groups[0].group, 'title'), true); + t.is(Object.hasOwn(groups[0].group, 'isMain'), true); + } catch (e) { + console.error(e); + } +}); -currentTest = "GET /group/users/:slug"; +currentTest = 'GET /group/users/:slug'; test.serial(`${currentTest} it should return users in group`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -889,9 +778,9 @@ test.serial(`${currentTest} it should return users in group`, async (t) => { } = testData; const getGroupsResponse = await request(app.getHttpServer()) .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { @@ -900,16 +789,16 @@ test.serial(`${currentTest} it should return users in group`, async (t) => { const groupId = getGroupsRO[nonAdminGroupIndex].group.id; const response = await request(app.getHttpServer()) .get(`/group/users/${groupId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getUsersRO = JSON.parse(response.text); t.is(getUsersRO.length, 2); t.is(getUsersRO[0].id === getUsersRO[1].id, false); - t.is(Object.hasOwn(getUsersRO[0], "createdAt"), true); - t.is(Object.hasOwn(getUsersRO[0], "password"), false); - t.is(Object.hasOwn(getUsersRO[0], "isActive"), true); - t.is(Object.hasOwn(getUsersRO[0], "email"), true); + t.is(Object.hasOwn(getUsersRO[0], 'createdAt'), true); + t.is(Object.hasOwn(getUsersRO[0], 'password'), false); + t.is(Object.hasOwn(getUsersRO[0], 'isActive'), true); + t.is(Object.hasOwn(getUsersRO[0], 'email'), true); } catch (e) { console.error(e); } @@ -919,10 +808,7 @@ test.serial( `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -933,9 +819,9 @@ test.serial( } = testData; const getGroupsResponse = await request(app.getHttpServer()) .get(`/connection/groups/${connections.secondId}`) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); @@ -943,9 +829,9 @@ test.serial( const response = await request(app.getHttpServer()) .get(`/group/users/${groupId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getUsersRO = JSON.parse(response.text); t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { @@ -954,14 +840,11 @@ test.serial( }, ); -currentTest = "PUT /group/user"; +currentTest = 'PUT /group/user'; test.serial(`${currentTest} should return group with added user`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -973,9 +856,9 @@ test.serial(`${currentTest} should return group with added user`, async (t) => { const getGroupsResponse = await request(app.getHttpServer()) .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); @@ -984,16 +867,16 @@ test.serial(`${currentTest} should return group with added user`, async (t) => { const email = faker.internet.email(); const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", simpleUserToken) + .put('/group/user') + .set('Cookie', simpleUserToken) .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; - t.is(Object.hasOwn(addUserInGroupRO, "title"), true); - t.is(Object.hasOwn(addUserInGroupRO, "isMain"), true); - t.is(Object.hasOwn(addUserInGroupRO, "users"), true); + t.is(Object.hasOwn(addUserInGroupRO, 'title'), true); + t.is(Object.hasOwn(addUserInGroupRO, 'isMain'), true); + t.is(Object.hasOwn(addUserInGroupRO, 'users'), true); const { users } = addUserInGroupRO; t.is(users.length, 3); t.is(users[0].id === users[1].id, false); @@ -1004,589 +887,486 @@ test.serial(`${currentTest} should return group with added user`, async (t) => { } }); -test.serial( - `${currentTest} should throw exception, when user email not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", simpleUserToken) - .send({ groupId }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (e) { - console.error(e); - } - }, -); + const groupId = getGroupsRO[0].group.id; + const addUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', simpleUserToken) + .send({ groupId }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should throw exception, when group id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", simpleUserToken) - .send({ email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - } - }, -); + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', simpleUserToken) + .send({ email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should throw exception, when group id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", simpleUserToken) - .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } - }, -); + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); -currentTest = "DELETE /group/:slug"; + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', simpleUserToken) + .send({ groupId, email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should delete result after group deletion`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +currentTest = 'DELETE /group/:slug'; - t.is(getGroupsResponse.status, 200); +test.serial(`${currentTest} should delete result after group deletion`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.isMain, false); - } catch (e) { - console.error(e); - } - }, -); + t.is(getGroupsResponse.status, 200); -test.serial( - `${currentTest} should throw an exception when you try delete admin group`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.isMain, false); + } catch (e) { + console.error(e); + } +}); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); +test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const adminGroupIndex = getGroupsRO.findIndex( - (group) => group.group.isMain, - ); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[adminGroupIndex].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); - } catch (e) { - console.error(e); - } - }, -); + const adminGroupIndex = getGroupsRO.findIndex((group) => group.group.isMain); -test.serial( - `${currentTest} should throw an exception when group id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const groupId = getGroupsRO[adminGroupIndex].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); + } catch (e) { + console.error(e); + } +}); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); +test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const _groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(deleteGroupResponse.status, 404); - } catch (e) { - console.error(e); - } - }, -); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); -test.serial( - `${currentTest} should throw an exception when group id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const _groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(deleteGroupResponse.status, 404); + } catch (e) { + console.error(e); + } +}); - t.is(getGroupsResponse.status, 200); +test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } - }, -); + t.is(getGroupsResponse.status, 200); -currentTest = "PUT /group/user/delete"; + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should return group without deleted user`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); +currentTest = 'PUT /group/user/delete'; - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); +test.serial(`${currentTest} should return group without deleted user`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const groupId = getGroupsRO[0].group.id; + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - adminUserToken, - undefined, - app, - undefined, - ); + const groupId = getGroupsRO[0].group.id; - const email = thirdTestUser.email; - - const addUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user") - .set("Cookie", testData.users.simpleUserToken) - .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(addUserInGroupResponse.status, 200); - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user/delete") - .set("Cookie", simpleUserToken) - .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - - t.is(Object.hasOwn(deleteUserInGroupRO, "title"), true); - t.is(Object.hasOwn(deleteUserInGroupRO, "isMain"), true); - t.is(Object.hasOwn(deleteUserInGroupRO, "users"), true); - const { users } = deleteUserInGroupRO; - t.is(users.length, 2); - t.is(users[0].id === users[1].id, false); - } catch (e) { - console.error(e); - } - }, -); + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); -test.serial( - `${currentTest} should throw exception, when user email not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const email = thirdTestUser.email; - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', testData.users.simpleUserToken) + .send({ groupId, email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addUserInGroupResponse.status, 200); - const groupId = getGroupsRO[0].group.id; + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user/delete') + .set('Cookie', simpleUserToken) + .send({ groupId, email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + + t.is(Object.hasOwn(deleteUserInGroupRO, 'title'), true); + t.is(Object.hasOwn(deleteUserInGroupRO, 'isMain'), true); + t.is(Object.hasOwn(deleteUserInGroupRO, 'users'), true); + const { users } = deleteUserInGroupRO; + t.is(users.length, 2); + t.is(users[0].id === users[1].id, false); + } catch (e) { + console.error(e); + } +}); - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - adminUserToken, - undefined, - app, - undefined, - ); +test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const _email = thirdTestUser.email; + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user/delete") - .set("Cookie", simpleUserToken) - .send({ groupId }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (e) { - console.error(e); - } - }, -); + const groupId = getGroupsRO[0].group.id; -test.serial( - `${currentTest} should throw exception, when group id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + const _email = thirdTestUser.email; - const _groupId = getGroupsRO[0].group.id; + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user/delete') + .set('Cookie', simpleUserToken) + .send({ groupId }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (e) { + console.error(e); + } +}); - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - adminUserToken, - undefined, - app, - undefined, - ); +test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const email = thirdTestUser.email; + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user/delete") - .set("Cookie", simpleUserToken) - .send({ email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - } - }, -); + const _groupId = getGroupsRO[0].group.id; -test.serial( - `${currentTest} should throw exception, when group id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); + const email = thirdTestUser.email; - let groupId = getGroupsRO[0].group.id; + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user/delete') + .set('Cookie', simpleUserToken) + .send({ email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + } +}); - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - adminUserToken, - undefined, - app, - undefined, - ); +test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const email = thirdTestUser.email; - - groupId = faker.string.uuid(); - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put("/group/user/delete") - .set("Cookie", simpleUserToken) - .send({ groupId, email }) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } - }, -); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + let groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); + + const email = thirdTestUser.email; + + groupId = faker.string.uuid(); + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put('/group/user/delete') + .set('Cookie', simpleUserToken) + .send({ groupId, email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } +}); //****************************** PERMISSION CONTROLLER TESTS ******************************// -currentTest = "PUT permissions/:slug"; +currentTest = 'PUT permissions/:slug'; -test.serial( - `${currentTest} should throw an exception do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set("Cookie", adminUserToken) - .send(newGroup1) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createGroupRO = JSON.parse(createGroupResponse.text); - t.is(createGroupResponse.status, 201); - const newGroupId = createGroupRO.id; +test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set('Cookie', adminUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createGroupRO = JSON.parse(createGroupResponse.text); + t.is(createGroupResponse.status, 201); + const newGroupId = createGroupRO.id; - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, }, - ], - }; - - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put( - `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, - ) - .send({ permissions }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createOrUpdatePermissionRO = JSON.parse( - createOrUpdatePermissionResponse.text, - ); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) + .send({ permissions }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should return updated complex permissions object when you update permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -1597,205 +1377,166 @@ test.serial( const getGroupsResponse = await request(app.getHttpServer()) .get(`/connection/groups/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getGroupsResponse.status, 200); const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: groupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) - .send({ permissions }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const _createOrUpdatePermissionRO = JSON.parse( - createOrUpdatePermissionResponse.text, - ); - t.is(createOrUpdatePermissionResponse.status, 403); - } catch (e) { - console.error(e); - } - }, -); - -test.serial( - `${currentTest} should throw an exception, when you try change admin group`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups: { firstAdminGroupId }, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - + const groupId = getGroupsRO[0].group.id; + const permissions = { connection: { + accessLevel: AccessLevelEnum.none, connectionId: connections.firstId, - accessLevel: AccessLevelEnum.edit, }, group: { - groupId: firstAdminGroupId, - accessLevel: AccessLevelEnum.none, + accessLevel: AccessLevelEnum.readonly, + groupId: groupId, }, tables: [ { - tableName: firstTableInfo.testTableName, accessLevel: { - visibility: true, + add: false, + delete: false, + edit: true, readonly: false, - add: true, - delete: true, - edit: false, + visibility: true, }, + tableName: firstTableInfo.testTableName, }, ], }; - const createOrUpdatePermissionResponse = await request( - app.getHttpServer(), - ) - .put(`/permissions/${firstAdminGroupId}`) + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) .send({ permissions }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const createOrUpdatePermissionRO = JSON.parse( - createOrUpdatePermissionResponse.text, - ); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const _createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); } }, ); +test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups: { firstAdminGroupId }, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put(`/permissions/${firstAdminGroupId}`) + .send({ permissions }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); + //****************************** TABLE CONTROLLER TESTS ******************************// -currentTest = "GET /connection/tables/:slug"; +currentTest = 'GET /connection/tables/:slug'; -test.serial( - `${currentTest} should return all tables in connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (table: any) => - table.tableName === testData.firstTableInfo.testTableName, - ); - t.is( - getTablesInConnectionRO[tableIndex].table, - testData.firstTableInfo.testTableName, - ); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); - const { - visibility, - readonly, - add, - delete: del, - edit, - } = getTablesInConnectionRO[0].permissions; - t.is(visibility, tablePermissions.visibility); - t.is(readonly, tablePermissions.readonly); - t.is(del, tablePermissions.delete); - t.is(edit, tablePermissions.edit); - t.is(add, tablePermissions.add); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should return all tables in connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (table: any) => table.tableName === testData.firstTableInfo.testTableName, + ); + t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); + const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[0].permissions; + t.is(visibility, tablePermissions.visibility); + t.is(readonly, tablePermissions.readonly); + t.is(del, tablePermissions.delete); + t.is(edit, tablePermissions.edit); + t.is(add, tablePermissions.add); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should throw an exception, when connection id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesInConnection.status, 404); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 404); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should throw an exception, when connection id passed in request is incorrect`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -1807,9 +1548,9 @@ test.serial( const fakeConnectionId = faker.string.uuid(); const getTablesInConnection = await request(app.getHttpServer()) .get(`/connection/tables/${fakeConnectionId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getTablesInConnection.status, 400); const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); @@ -1819,14 +1560,11 @@ test.serial( }, ); -currentTest = "GET /table/rows/:slug"; +currentTest = 'GET /table/rows/:slug'; test.serial(`${currentTest} should return found rows from table`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -1836,26 +1574,17 @@ test.serial(`${currentTest} should return found rows from table`, async (t) => { users: { adminUserToken, simpleUserToken }, } = testData; const getTableRows = await request(app.getHttpServer()) - .get( - `/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(getTableRows.status, 200); const getTableRowsRO = JSON.parse(getTableRows.text); - const { - rows, - primaryColumns, - pagination, - sortable_by, - structure, - foreignKeys, - } = getTableRowsRO; + const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTableRowsRO; t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, "id"); - t.is(primaryColumns[0].data_type, "integer"); + t.is(primaryColumns[0].column_name, 'id'); + t.is(primaryColumns[0].data_type, 'integer'); t.is(sortable_by.length, 0); t.is(structure.length, 5); t.is(foreignKeys.length, 0); @@ -1864,106 +1593,189 @@ test.serial(`${currentTest} should return found rows from table`, async (t) => { } }); -test.serial( - `${currentTest} should throw an exception when connection id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesRows.status, 404); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesRows.status, 404); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrec`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeId = faker.string.uuid(); - const getTableRows = await request(app.getHttpServer()) - .get( - `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTableRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTableRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrec`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeId = faker.string.uuid(); + const getTableRows = await request(app.getHttpServer()) + .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTableRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); + +currentTest = 'GET /table/structure/:slug'; + +test.serial(`${currentTest} should return table structure`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTableStructureRO = JSON.parse(getTablesStructure.text); + + t.is(getTablesStructure.status, 200); + const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, 'id'); + t.is(primaryColumns[0].data_type, 'integer'); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + } +}); + +test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesStructure.status, 404); + } catch (e) { + console.error(e); + } +}); + +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); -currentTest = "GET /table/structure/:slug"; +test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (e) { + console.error(e); + } +}); -test.serial(`${currentTest} should return table structure`, async (t) => { +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -1972,170 +1784,25 @@ test.serial(`${currentTest} should return table structure`, async (t) => { secondTableInfo, users: { adminUserToken, simpleUserToken }, } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; const getTablesStructure = await request(app.getHttpServer()) - .get( - `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - - const getTableStructureRO = JSON.parse(getTablesStructure.text); - - t.is(getTablesStructure.status, 200); - const { - structure, - primaryColumns, - foreignKeys, - readonly_fields, - table_widgets, - } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, "id"); - t.is(primaryColumns[0].data_type, "integer"); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); + .get(`/table/structure/${connections.firstId}?tableName=${fakeTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); } }); -test.serial( - `${currentTest} should throw an exception when connection id not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesStructure.status, 404); - } catch (e) { - console.error(e); - } - }, -); - -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get( - `/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -test.serial( - `${currentTest} should throw an exception when table name not passed in request`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (e) { - console.error(e); - } - }, -); - -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; - const getTablesStructure = await request(app.getHttpServer()) - .get( - `/table/structure/${connections.firstId}?tableName=${fakeTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = "POST /table/row/:slug"; +currentTest = 'POST /table/row/:slug'; test.serial(`${currentTest} should return added row`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2151,172 +1818,107 @@ test.serial(`${currentTest} should return added row`, async (t) => { const created_at = new Date(); const updated_at = new Date(); const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) + .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) .send({ [firstTableInfo.testTableColumnName]: randomName, [firstTableInfo.testTableSecondColumnName]: randomEmail, created_at: created_at, updated_at: updated_at, }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const addRowInTableRO = JSON.parse(addRowInTable.text); t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); - t.is( - addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], - randomEmail, - ); - t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); - t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); - t.is(Object.hasOwn(addRowInTableRO, "structure"), true); - t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); - t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); - t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + t.is(addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], randomEmail); + t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); + t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); + t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); } catch (e) { console.error(e); } }); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, - ) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); -currentTest = "PUT /table/row/:slug"; +currentTest = 'PUT /table/row/:slug'; test.serial( `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`, - ) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 403); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2325,67 +1927,24 @@ test.serial( secondTableInfo, users: { adminUserToken, simpleUserToken }, } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, - ) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; const randomName = faker.person.firstName(); const randomEmail = faker.internet.email(); const created_at = new Date(); const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, - ) + const updateRowInTable = await request(app.getHttpServer()) + .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) .send({ name: randomName, email: randomEmail, created_at: created_at, updated_at: updated_at, }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 403); t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); @@ -2393,14 +1952,79 @@ test.serial( }, ); -currentTest = "DELETE /table/row/:slug"; +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); + +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); + +currentTest = 'DELETE /table/row/:slug'; test.serial(`${currentTest} should return delete result`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2410,12 +2034,10 @@ test.serial(`${currentTest} should return delete result`, async (t) => { users: { adminUserToken, simpleUserToken }, } = testData; const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(deleteRowInTable.status, 200); } catch (e) { @@ -2423,79 +2045,60 @@ test.serial(`${currentTest} should return delete result`, async (t) => { } }); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); -currentTest = "GET /table/row/:slug"; +currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} should return row`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2505,163 +2108,131 @@ test.serial(`${currentTest} should return row`, async (t) => { users: { adminUserToken, simpleUserToken }, } = testData; const getRowInTable = await request(app.getHttpServer()) - .get( - `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getRowInTableRO = JSON.parse(getRowInTable.text); t.is(getRowInTable.status, 200); t.is(getRowInTableRO.row.id, 7); - t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); - t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); - t.is(Object.hasOwn(getRowInTableRO, "structure"), true); - t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); - t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); - t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); + t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); + t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); } catch (e) { console.error(e); } }); -test.serial( - `${currentTest} should throw an exception when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get( - `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); -test.serial( - `${currentTest} should throw an exception when table name passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get( - `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); +test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); //****************************** TABLE LOGS CONTROLLER TESTS ******************************// -currentTest = "GET /logs/:slug"; - -test.serial( - `${currentTest} should return all found logs in connection'`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(addRowInTable.status, 201); +currentTest = 'GET /logs/:slug'; - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const getRowInTableRO = JSON.parse(getTableLogs.text); +test.serial(`${currentTest} should return all found logs in connection'`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTable.status, 201); - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); - t.is( - Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), - true, - ); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); - } catch (e) { - console.error(e); - } - }, -); + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2675,55 +2246,49 @@ test.serial( const created_at = new Date(); const updated_at = new Date(); - const updateConnection = - mockFactory.generateConnectionToTestPostgresDBInDocker(); + const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnectionResponse = await request(app.getHttpServer()) .put(`/connection/${connections.firstId}`) .send(updateConnection) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(updateConnectionResponse.status, 200); - const newConnectionProperties = - mockFactory.generateConnectionPropertiesUserExcluded( - firstTableInfo.testTableName, - false, - ); + const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded( + firstTableInfo.testTableName, + false, + ); - const createConnectionPropertiesResponse = await request( - app.getHttpServer(), - ) + const createConnectionPropertiesResponse = await request(app.getHttpServer()) .post(`/connection/properties/${connections.firstId}`) .send(newConnectionProperties) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createConnectionPropertiesResponse.status, 201); const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) + .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) .send({ [firstTableInfo.testTableColumnName]: randomName, [firstTableInfo.testTableSecondColumnName]: randomEmail, created_at: created_at, updated_at: updated_at, }) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(addRowInTable.status, 201); const getTableLogs = await request(app.getHttpServer()) .get(`/logs/${connections.firstId}`) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getRowInTableRO = JSON.parse(getTableLogs.text); t.is(getRowInTableRO.logs.length, 0); @@ -2736,14 +2301,11 @@ test.serial( //****************************** TABLE SETTINGS CONTROLLER TESTS ******************************// -currentTest = "GET /settings/"; +currentTest = 'GET /settings/'; test.skip(`${currentTest} should return empty table settings when it was not created`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2753,12 +2315,10 @@ test.skip(`${currentTest} should return empty table settings when it was not cre users: { adminUserToken, simpleUserToken }, } = testData; const getTableSettings = await request(app.getHttpServer()) - .get( - `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getTableSettingsRO = JSON.parse(getTableSettings.text); t.is(getTableSettings.status, 200); t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); @@ -2767,75 +2327,65 @@ test.skip(`${currentTest} should return empty table settings when it was not cre } }); -test.serial( - `${currentTest} 'should return table settings when it was created`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; +test.serial(`${currentTest} 'should return table settings when it was created`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ['id'], + [firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createTableSettingsResponse.status, 201); + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(getTableSettingsRO.hasOwnProperty('id'), true); - t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(JSON.stringify(getTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(getTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(getTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(getTableSettingsRO.connection_id, connections.firstId); - } catch (e) { - console.error(e); - } + const getTableSettings = await request(app.getHttpServer()) + .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(getTableSettingsRO.hasOwnProperty('id'), true); + t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); + t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); + t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); + t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); + t.is(JSON.stringify(getTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); + t.is(JSON.stringify(getTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); + t.is(JSON.stringify(getTableSettingsRO.autocomplete_columns), JSON.stringify([])); + t.is(getTableSettingsRO.connection_id, connections.firstId); + } catch (e) { + console.error(e); + } }); test.serial( `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2845,36 +2395,32 @@ test.serial( users: { adminUserToken, simpleUserToken }, } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ['id'], + [secondTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, - ) + .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) .send(createTableSettingsDTO) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); const getTableSettings = await request(app.getHttpServer()) - .get( - `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .get(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); const getTableSettingsRO = JSON.parse(getTableSettings.text); t.is(getTableSettings.status, 403); t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); @@ -2884,16 +2430,50 @@ test.serial( }, ); -currentTest = "POST /settings/"; +currentTest = 'POST /settings/'; + +test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + 'users', + ['id'], + ['email'], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) + .send(createTableSettingsDTO) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 403); + t.is(JSON.parse(createTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); test.serial( - `${currentTest} should throw an exception do not have permission`, + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2903,45 +2483,97 @@ test.serial( users: { adminUserToken, simpleUserToken }, } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - 'users', - ['id'], - ['email'], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ['id'], + [secondTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, - ) + .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`) .send(createTableSettingsDTO) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 403); - t.is( - JSON.parse(createTableSettingsResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); + + const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); } }, ); +currentTest = 'PUT /settings/'; + +test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ['id'], + [firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ['id'], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) + .send(updateTableSettingsDTO) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(updateTableSettingsResponse.status, 403); + t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); + test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -2950,270 +2582,137 @@ test.serial( secondTableInfo, users: { adminUserToken, simpleUserToken }, } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`, - ) - .send(createTableSettingsDTO) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse( - createTableSettingsResponse.text, + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ['id'], + [secondTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, ); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = "PUT /settings/"; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, - ) + .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) .send(createTableSettingsDTO) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put( - `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, - ) - .send(updateTableSettingsDTO) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(updateTableSettingsResponse.status, 403); - t.is( - JSON.parse(updateTableSettingsResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ['id'], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, ); - } catch (e) { - console.error(e); - } - }, -); - -test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); const updateTableSettingsResponse = await request(app.getHttpServer()) - .put( - `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`, - ) + .put(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`) .send(updateTableSettingsDTO) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(updateTableSettingsResponse.status, 403); - t.is( - JSON.parse(updateTableSettingsResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); + t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); } }, ); -currentTest = "DELETE /settings/"; +currentTest = 'DELETE /settings/'; test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete( - `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ['id'], + [firstTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); - t.is(deleteTableSettingsResponse.status, 403); - t.is( - JSON.parse(deleteTableSettingsResponse.text).message, - Messages.DONT_HAVE_PERMISSIONS, - ); - } catch (e) { - console.error(e); - } - }, -); + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(deleteTableSettingsResponse.status, 403); + t.is(JSON.parse(deleteTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ['id'], + [secondTableInfo.testTableSecondColumnName], + ['updated_at'], + ['created_at'], + undefined, + undefined, + undefined, + ); const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, - ) + .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) .send(createTableSettingsDTO) - .set("Cookie", adminUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); t.is(createTableSettingsResponse.status, 201); const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete( - `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const deleteTableSettingsRO = JSON.parse( - deleteTableSettingsResponse.text, - ); + .delete(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); t.is(deleteTableSettingsResponse.status, 403); t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { @@ -3224,135 +2723,99 @@ test.serial( //****************************** TABLE WIDGETS CONTROLLER TESTS ******************************// -currentTest = "GET /widgets/:slug"; - -test.serial( - `${currentTest} should return empty widgets array when widgets not created`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableWidgets = await request(app.getHttpServer()) - .get( - `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) - .set("Cookie", simpleUserToken) - .set("Content-Type", "application/json") - .set("Accept", "application/json"); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, "object"); - t.is(getTableWidgetsRO.length, 0); - } catch (e) { - console.error(e); - } - }, -); +currentTest = 'GET /widgets/:slug'; -test.serial( - `${currentTest} should return array of table widgets for table`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; +test.serial(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(typeof getTableWidgetsRO, 'object'); + t.is(getTableWidgetsRO.length, 0); + } catch (e) { + console.error(e); + } +}); - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - "id", - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post( - `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", adminUserToken) - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, "object"); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); +test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; - const getTableWidgets = await request(app.getHttpServer()) - .get( - `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) - .set("Content-Type", "application/json") - .set("Cookie", simpleUserToken) - .set("Accept", "application/json"); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, "object"); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get( - `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) - .set("Content-Type", "application/json") - .set("Cookie", simpleUserToken) - .set("Accept", "application/json"); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is( - getTableStructureRO.table_widgets[0].field_name, - newTableWidgets[0].field_name, - ); - t.is( - getTableStructureRO.table_widgets[1].widget_type, - newTableWidgets[1].widget_type, - ); - t.is( - compareTableWidgetsArrays( - getTableStructureRO.table_widgets, - newTableWidgets, - ), - true, - ); - } catch (e) { - console.error(e); - } - }, -); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + 'id', + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', adminUserToken) + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, 'object'); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', simpleUserToken) + .set('Accept', 'application/json'); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, 'object'); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', simpleUserToken) + .set('Accept', 'application/json'); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); + t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); + t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -3361,31 +2824,26 @@ test.serial( secondTableInfo, users: { adminUserToken, simpleUserToken }, } = testData; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - "id", - firstTableInfo.testTableColumnName, - ); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + 'id', + firstTableInfo.testTableColumnName, + ); const createTableWidgetResponse = await request(app.getHttpServer()) - .post( - `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, - ) + .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", adminUserToken) - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', adminUserToken) + .set('Accept', 'application/json'); const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, "object"); + t.is(typeof createTableWidgetRO, 'object'); t.is(createTableWidgetRO.length, 2); const getTableWidgets = await request(app.getHttpServer()) - .get( - `/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, - ) - .set("Content-Type", "application/json") - .set("Cookie", simpleUserToken) - .set("Accept", "application/json"); + .get(`/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) + .set('Content-Type', 'application/json') + .set('Cookie', simpleUserToken) + .set('Accept', 'application/json'); const getTableWidgetsRO = JSON.parse(getTableWidgets.text); t.is(getTableWidgets.status, 403); t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); @@ -3396,56 +2854,44 @@ test.serial( }, ); -currentTest = "POST /widget/:slug"; +currentTest = 'POST /widget/:slug'; -test.serial( - `${currentTest} should throw an exception do not have permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; +test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - "id", - firstTableInfo.testTableColumnName, - ); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + 'id', + firstTableInfo.testTableColumnName, + ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post( - `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`, - ) - .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", simpleUserToken) - .set("Accept", "application/json"); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`) + .send({ widgets: newTableWidgets }) + .set('Content-Type', 'application/json') + .set('Cookie', simpleUserToken) + .set('Accept', 'application/json'); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } +}); test.serial( `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, async (t) => { try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( - app, - ); + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const { connections, firstTableInfo, @@ -3454,20 +2900,17 @@ test.serial( secondTableInfo, users: { adminUserToken, simpleUserToken }, } = testData; - const newTableWidgets = - mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - "id", - firstTableInfo.testTableColumnName, - ); + const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + 'id', + firstTableInfo.testTableColumnName, + ); const createTableWidgetResponse = await request(app.getHttpServer()) - .post( - `/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, - ) + .post(`/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) .send({ widgets: newTableWidgets }) - .set("Content-Type", "application/json") - .set("Cookie", simpleUserToken) - .set("Accept", "application/json"); + .set('Content-Type', 'application/json') + .set('Cookie', simpleUserToken) + .set('Accept', 'application/json'); const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); t.is(createTableWidgetResponse.status, 403); t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-sign-in-audit.e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-sign-in-audit.e2e.test.ts index b17237bab..b8f9926bc 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-sign-in-audit.e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-sign-in-audit.e2e.test.ts @@ -12,7 +12,7 @@ import { ValidationException } from '../../../src/exceptions/custom-exceptions/v import { Messages } from '../../../src/exceptions/text/messages.js'; import { DatabaseModule } from '../../../src/shared/database/database.module.js'; import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; +import { registerUserAndReturnUserInfo, createInitialTestUser } 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 { MockFactory } from '../../mock.factory.js'; @@ -56,6 +56,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 cb53180ff..301701c44 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,7 +22,7 @@ import { DatabaseModule } from "../../../src/shared/database/database.module.js" import { DatabaseService } from "../../../src/shared/database/database.service.js"; import { MockFactory } from "../../mock.factory.js"; import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; -import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { inviteUserInCompanyAndAcceptInvitation, createInitialTestUser } from "../../utils/register-user-and-return-user-info.js"; import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; import { TestUtils } from "../../utils/test.utils.js"; import { createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions } from "../../utils/user-with-different-permissions-utils.js"; @@ -63,6 +63,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); 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 4653b3dd4..cba39d145 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 @@ -22,7 +22,7 @@ import { DatabaseModule } from "../../../src/shared/database/database.module.js" import { DatabaseService } from "../../../src/shared/database/database.service.js"; import { MockFactory } from "../../mock.factory.js"; import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; -import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { inviteUserInCompanyAndAcceptInvitation, createInitialTestUser } from "../../utils/register-user-and-return-user-info.js"; import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; import { TestUtils } from "../../utils/test.utils.js"; import { createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions } from "../../utils/user-with-different-permissions-utils.js"; @@ -63,6 +63,7 @@ test.before(async () => { }), ); await app.init(); + await createInitialTestUser(app); app.getHttpServer().listen(0); }); diff --git a/backend/test/utils/register-user-and-return-user-info.ts b/backend/test/utils/register-user-and-return-user-info.ts index 2d7c8ad5c..d433755a5 100644 --- a/backend/test/utils/register-user-and-return-user-info.ts +++ b/backend/test/utils/register-user-and-return-user-info.ts @@ -12,94 +12,139 @@ import { UserEntity } from '../../src/entities/user/user.entity.js'; import { CompanyInfoEntity } from '../../src/entities/company-info/company-info.entity.js'; import { generateGwtToken } from '../../src/entities/user/utils/generate-gwt-token.js'; import { UserRoleEnum } from '../../src/entities/user/enums/user-role.enum.js'; +import { buildRegisteringUser } from '../../src/entities/user/utils/build-registering-user.util.js'; +import { RegisterUserDs } from '../../src/entities/user/application/data-structures/register-user-ds.js'; + +export async function createInitialTestUser( + app: INestApplication, + email: string = 'admin@email.local', + password: string = 'test12345', +): Promise<{ + token: string; + email: string; + password: string; +}> { + const dataSource = app.get(BaseType.DATA_SOURCE); + const userRepository = dataSource.getRepository(UserEntity); + const companyRepository = dataSource.getRepository(CompanyInfoEntity); + + const existingUser = await userRepository.findOneBy({ email: email.toLowerCase() }); + if (existingUser) { + const tokenData = generateGwtToken(existingUser, []); + const token = `${Constants.JWT_COOKIE_KEY_NAME}=${tokenData.token}`; + return { token, email: existingUser.email, password }; + } + + const registerUserData: RegisterUserDs = { + email: email.toLowerCase(), + password: password, + isActive: true, + gclidValue: null, + name: 'Admin', + role: UserRoleEnum.ADMIN, + }; + + const savedUser = await userRepository.save(buildRegisteringUser(registerUserData)); + + const newCompanyInfo = new CompanyInfoEntity(); + newCompanyInfo.id = faker.string.uuid(); + const savedCompanyInfo = await companyRepository.save(newCompanyInfo); + + savedUser.company = savedCompanyInfo; + const finalUser = await userRepository.save(savedUser); + const tokenData = generateGwtToken(finalUser, []); + const token = `${Constants.JWT_COOKIE_KEY_NAME}=${tokenData.token}`; + + return { token, email: finalUser.email, password }; +} // eslint-disable-next-line @typescript-eslint/no-unused-vars export async function registerUserAndReturnUserInfo(app: INestApplication): Promise<{ - token: string; - email: string; - password: string; + token: string; + email: string; + password: string; }> { - if (isSaaS()) { - return await registerUserOnSaasAndReturnUserInfo(); - } - const dataSource = app.get(BaseType.DATA_SOURCE); - const userRepository = dataSource.getRepository(UserEntity); - const companyRepository = dataSource.getRepository(CompanyInfoEntity); - - const email = `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.internet.email()}`.toLowerCase(); - const password = `#r@dY^e&7R4b5Ib@31iE4xbn`; - const companyName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.company.name()}`; - - // Create company - const company = companyRepository.create({ - id: faker.string.uuid(), - name: companyName, - }); - const savedCompany = await companyRepository.save(company); - - // Create user - const user = userRepository.create({ - email, - password, - isActive: true, - company: savedCompany, - role: UserRoleEnum.ADMIN, - }); - const savedUser = await userRepository.save(user); - - // Generate JWT token - const tokenData = generateGwtToken(savedUser, []); - const token = `${Constants.JWT_COOKIE_KEY_NAME}=${tokenData.token}`; - - return { token, email, password }; + if (isSaaS()) { + return await registerUserOnSaasAndReturnUserInfo(); + } + const dataSource = app.get(BaseType.DATA_SOURCE); + const userRepository = dataSource.getRepository(UserEntity); + const companyRepository = dataSource.getRepository(CompanyInfoEntity); + + const email = `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.internet.email()}`.toLowerCase(); + const password = `#r@dY^e&7R4b5Ib@31iE4xbn`; + const companyName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.company.name()}`; + + // Create company + const company = companyRepository.create({ + id: faker.string.uuid(), + name: companyName, + }); + const savedCompany = await companyRepository.save(company); + + // Create user + const user = userRepository.create({ + email, + password, + isActive: true, + company: savedCompany, + role: UserRoleEnum.ADMIN, + }); + const savedUser = await userRepository.save(user); + + // Generate JWT token + const tokenData = generateGwtToken(savedUser, []); + const token = `${Constants.JWT_COOKIE_KEY_NAME}=${tokenData.token}`; + + return { token, email, password }; } export async function registerUserOnSaasAndReturnUserInfo( - email: string = `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.internet.email()}`, + email: string = `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.internet.email()}`, ): Promise<{ - token: string; - email: string; - password: string; + token: string; + email: string; + password: string; }> { - const userRegisterInfo: RegisterUserData & { companyName: string } = { - email: email, - password: `#r@dY^e&7R4b5Ib@31iE4xbn`, - companyName: `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.company.name()}`, - }; - - const result = await fetch('http://rocketadmin-private-microservice:3001/saas/user/register', { - method: 'POST', - body: JSON.stringify(userRegisterInfo), - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - }); - if (result.status > 201) { - console.info('result.body -> ', await result.json()); - } - const token = `${Constants.JWT_COOKIE_KEY_NAME}=${TestUtils.getJwtTokenFromResponse2(result)}`; - return { token: token, ...userRegisterInfo }; + const userRegisterInfo: RegisterUserData & { companyName: string } = { + email: email, + password: `#r@dY^e&7R4b5Ib@31iE4xbn`, + companyName: `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.company.name()}`, + }; + + const result = await fetch('http://rocketadmin-private-microservice:3001/saas/user/register', { + method: 'POST', + body: JSON.stringify(userRegisterInfo), + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + }); + if (result.status > 201) { + console.info('result.body -> ', await result.json()); + } + const token = `${Constants.JWT_COOKIE_KEY_NAME}=${TestUtils.getJwtTokenFromResponse2(result)}`; + return { token: token, ...userRegisterInfo }; } type RegisterUserData = { - email: string; - password: string; + email: string; + password: string; }; export async function inviteUserInCompanyAndAcceptInvitation( - inviterJwtToken: string, - role: 'ADMIN' | 'USER' = 'USER', - app: INestApplication, - groupId: string, - invitedUserEmail?: string, + inviterJwtToken: string, + role: 'ADMIN' | 'USER' = 'USER', + app: INestApplication, + groupId: string, + invitedUserEmail?: string, ): Promise<{ - email: string; - password: string; - token: string; + email: string; + password: string; + token: string; }> { - return await inviteUserInCompanyAndGroupAndAcceptInvitation(inviterJwtToken, role, groupId, app, invitedUserEmail); - /* + return await inviteUserInCompanyAndGroupAndAcceptInvitation(inviterJwtToken, role, groupId, app, invitedUserEmail); + /* const foundUser: any = await request(app.getHttpServer()) .get('/user/') @@ -151,59 +196,59 @@ export async function inviteUserInCompanyAndAcceptInvitation( } export async function inviteUserInCompanyAndGroupAndAcceptInvitation( - inviterJwtToken: string, - role: 'ADMIN' | 'USER' = 'USER', - groupId: string, - app: INestApplication, - newEmail?: string, + inviterJwtToken: string, + role: 'ADMIN' | 'USER' = 'USER', + groupId: string, + app: INestApplication, + newEmail?: string, ): Promise<{ - email: string; - password: string; - token: string; + email: string; + password: string; + token: string; }> { - const foundUser: any = await request(app.getHttpServer()) - .get('/user/') - .set('Cookie', inviterJwtToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const foundUserJson = JSON.parse(foundUser.text); - const companyId = foundUserJson.company.id; - if (!newEmail) { - newEmail = `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.internet.email()}`; - } - const newPassword = `#r@dY^e&7R4b5Ib@31iE4xbn`; - const invitationRequestBody = { - companyId: foundUserJson.company.id, - email: newEmail, - role: role, - groupId: groupId, - }; - - const invitationResult = await request(app.getHttpServer()) - .put(`/company/user/${companyId}`) - .send(invitationRequestBody) - .set('Cookie', inviterJwtToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const invitationRO: InvitedUserInCompanyAndConnectionGroupDs & { verificationString: string } = JSON.parse( - invitationResult.text, - ); - if (invitationResult.status > 201) { - console.info('invitationResult.body -> ', invitationRO); - } - const verificationResult = await request(app.getHttpServer()) - .post(`/company/invite/verify/${invitationRO.verificationString}`) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - .send({ - password: newPassword, - userName: newEmail, - }); - const verificationRO = JSON.parse(verificationResult.text); - if (verificationResult.status > 201) { - console.info('verificationResult.body -> ', verificationRO); - } - const token = `${Constants.JWT_COOKIE_KEY_NAME}=${TestUtils.getJwtTokenFromResponse(verificationResult)}`; - return { email: newEmail, password: newPassword, token: token }; + const foundUser: any = await request(app.getHttpServer()) + .get('/user/') + .set('Cookie', inviterJwtToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const foundUserJson = JSON.parse(foundUser.text); + const companyId = foundUserJson.company.id; + if (!newEmail) { + newEmail = `${faker.lorem.words(1)}_${faker.lorem.words(1)}_${faker.internet.email()}`; + } + const newPassword = `#r@dY^e&7R4b5Ib@31iE4xbn`; + const invitationRequestBody = { + companyId: foundUserJson.company.id, + email: newEmail, + role: role, + groupId: groupId, + }; + + const invitationResult = await request(app.getHttpServer()) + .put(`/company/user/${companyId}`) + .send(invitationRequestBody) + .set('Cookie', inviterJwtToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const invitationRO: InvitedUserInCompanyAndConnectionGroupDs & { verificationString: string } = JSON.parse( + invitationResult.text, + ); + if (invitationResult.status > 201) { + console.info('invitationResult.body -> ', invitationRO); + } + const verificationResult = await request(app.getHttpServer()) + .post(`/company/invite/verify/${invitationRO.verificationString}`) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json') + .send({ + password: newPassword, + userName: newEmail, + }); + const verificationRO = JSON.parse(verificationResult.text); + if (verificationResult.status > 201) { + console.info('verificationResult.body -> ', verificationRO); + } + const token = `${Constants.JWT_COOKIE_KEY_NAME}=${TestUtils.getJwtTokenFromResponse(verificationResult)}`; + return { email: newEmail, password: newPassword, token: token }; }