diff --git a/.gitignore b/.gitignore index c3ba47ed1..e7f1212d5 100644 --- a/.gitignore +++ b/.gitignore @@ -54,4 +54,7 @@ Thumbs.db !.yarn/plugins !.yarn/releases !.yarn/sdks -!.yarn/versions \ No newline at end of file +!.yarn/versions + +# PGLite storage +pglite-storage \ No newline at end of file diff --git a/autoadmin-ws-server/.dockerignore b/autoadmin-ws-server/.dockerignore index 93f136199..bb2c13e88 100644 --- a/autoadmin-ws-server/.dockerignore +++ b/autoadmin-ws-server/.dockerignore @@ -1,2 +1,8 @@ node_modules -npm-debug.log +dist +.env +*.log +.git +.gitignore +*.md +.env.* diff --git a/autoadmin-ws-server/.env.example b/autoadmin-ws-server/.env.example new file mode 100644 index 000000000..895d5dff3 --- /dev/null +++ b/autoadmin-ws-server/.env.example @@ -0,0 +1,10 @@ +HTTP_PORT=8008 +WS_PORT=8009 +HOST=0.0.0.0 + +JWT_SECRET=MySuperSecretJwtSecret +PRIVATE_KEY=MySuperSecretEncryptionPrivateKey + +CHECK_CONNECTION_TOKEN_URL=http://backend:3000/connection/token + +LOG_LEVEL=info diff --git a/autoadmin-ws-server/.gitignore b/autoadmin-ws-server/.gitignore old mode 100755 new mode 100644 index 02f1182d7..e9319fdd2 --- a/autoadmin-ws-server/.gitignore +++ b/autoadmin-ws-server/.gitignore @@ -1,119 +1,14 @@ - -# Created by https://www.gitignore.io/api/node -# Edit at https://www.gitignore.io/?templates=node - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm -.yarn/* -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.test.env -.encryption.env - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# rollup.js default build output dist/ +.env +*.log +.DS_Store -# Uncomment the public line if your project uses Gatsby -# https://nextjs.org/blog/next-9-1#public-directory-support -# https://create-react-app.dev/docs/using-the-public-folder/#docsNav -# public - -# Storybook build outputs -.out -.storybook-out - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# Temporary folders -tmp/ -temp/ - -#IDE integration files -.idea - -#private data -.env.dev -.amazon.env -.development.env -# End of https://www.gitignore.io/api/node +# Yarn +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions +.pnp.* diff --git a/autoadmin-ws-server/.prettierrc b/autoadmin-ws-server/.prettierrc deleted file mode 100755 index dcb72794f..000000000 --- a/autoadmin-ws-server/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all" -} \ No newline at end of file diff --git a/autoadmin-ws-server/.ws-server-development.env b/autoadmin-ws-server/.ws-server-development.env index 75667cc02..895d5dff3 100644 --- a/autoadmin-ws-server/.ws-server-development.env +++ b/autoadmin-ws-server/.ws-server-development.env @@ -1,6 +1,10 @@ -JWT_SECRET=MySuperSecretJwtSecret -HTTP_PORT= -WS_PORT= +HTTP_PORT=8008 +WS_PORT=8009 HOST=0.0.0.0 + +JWT_SECRET=MySuperSecretJwtSecret PRIVATE_KEY=MySuperSecretEncryptionPrivateKey -CHECK_CONNECTION_TOKEN_URL=http://backend:3000/connection/token \ No newline at end of file + +CHECK_CONNECTION_TOKEN_URL=http://backend:3000/connection/token + +LOG_LEVEL=info diff --git a/autoadmin-ws-server/Dockerfile b/autoadmin-ws-server/Dockerfile index a5a944684..4585819f9 100644 --- a/autoadmin-ws-server/Dockerfile +++ b/autoadmin-ws-server/Dockerfile @@ -1,7 +1,29 @@ -FROM node:22-slim +FROM node:22-alpine AS builder + WORKDIR /app -COPY package.json yarn.lock /app/ -RUN yarn install --network-timeout 1000000 -COPY . /app -EXPOSE 8008 -CMD ["yarn", "start"] \ No newline at end of file + +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile + +COPY tsconfig.json ./ +COPY src ./src + +RUN yarn build + +FROM node:22-alpine + +WORKDIR /app + +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nodejs -u 1001 + +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile --production && yarn cache clean + +COPY --from=builder /app/dist ./dist + +USER nodejs + +EXPOSE 8008 8009 + +CMD ["node", "dist/index.js"] diff --git a/autoadmin-ws-server/README.md b/autoadmin-ws-server/README.md deleted file mode 100644 index 85339f0bb..000000000 --- a/autoadmin-ws-server/README.md +++ /dev/null @@ -1 +0,0 @@ -# autoadmin-ws-server diff --git a/autoadmin-ws-server/buildspec.yml b/autoadmin-ws-server/buildspec.yml deleted file mode 100644 index 344360376..000000000 --- a/autoadmin-ws-server/buildspec.yml +++ /dev/null @@ -1,40 +0,0 @@ -version: 0.2 - -phases: - install: - runtime-versions: - docker: 18 - commands: - - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2& - - timeout 15 sh -c "until docker info; do echo .; sleep 1; done" - pre_build: - commands: - - echo Logging in to Amazon ECR.... - - aws --version - # update the following line with your own region - - docker login --username autoadmin --password 53705f3e-b96d-47cf-82af-7da93b1d9d21 - - aws ecr get-login-password --region=us-east-2 | docker login --username AWS --password-stdin 680745329161.dkr.ecr.us-east-2.amazonaws.com - - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - - IMAGE_TAG=${COMMIT_HASH:=latest} - - REPOSITORY_URI=680745329161.dkr.ecr.us-east-2.amazonaws.com/autoadmin-ws - build: - commands: - - echo Build started on `date` - - echo Building the Docker image... - # update the following line with the name of your own ECR repository - - docker build -t $REPOSITORY_URI:latest . - # update the following line with the URI of your own ECR repository (view the Push Commands in the console) - - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG - post_build: - commands: - - echo Build completed on `date` - - echo pushing to repo - # update the following line with the URI of your own ECR repository - - docker push $REPOSITORY_URI:latest - - docker push $REPOSITORY_URI:$IMAGE_TAG - - echo Writing image definitions file... - - printf '[{"name":"autoadmin-ws","imageUri":"%s", "portMappings":[{"hostPort":8008, "containerPort":8008}, {"hostPort":8009, "containerPort":8009}]}]' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json - #- printf '{"ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json -artifacts: - files: - - imageDetail.json diff --git a/autoadmin-ws-server/package.json b/autoadmin-ws-server/package.json index d981a51d0..cc7f403f6 100644 --- a/autoadmin-ws-server/package.json +++ b/autoadmin-ws-server/package.json @@ -1,18 +1,31 @@ { - "name": "autoadmin-ws-server", + "name": "rocketadmin-ws-server", "version": "1.0.0", - "main": "src/index.js", - "license": "MIT", "type": "module", + "license": "UNLICENSED", "scripts": { - "start": "node src/index.js" + "dev": "tsx watch src/index.ts", + "build": "tsc", + "start": "node dist/index.js", + "lint": "biome check src/", + "lint:fix": "biome check --write src/" }, "dependencies": { - "axios": "^1.13.2", - "express": "^5.2.1", + "@hono/node-server": "^1.19.9", + "hono": "^4.11.7", "jsonwebtoken": "^9.0.3", - "lru-cache": "^11.2.4", + "lru-cache": "^11.2.5", "nanoid": "^5.1.6", - "ws": "^8.18.3" + "pino": "^10.3.0", + "ws": "^8.19.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@biomejs/biome": "2.3.13", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^22.10.2", + "@types/ws": "^8.18.1", + "tsx": "^4.21.0", + "typescript": "^5.9.3" } } diff --git a/autoadmin-ws-server/src/app.ts b/autoadmin-ws-server/src/app.ts new file mode 100644 index 000000000..bab33c62d --- /dev/null +++ b/autoadmin-ws-server/src/app.ts @@ -0,0 +1,42 @@ +import { Hono } from 'hono'; +import { cors } from 'hono/cors'; +import { logger as honoLogger } from 'hono/logger'; +import { CONSTANTS } from './constants/index.js'; +import { executeCommand } from './handlers/command.js'; +import { authMiddleware } from './middleware/auth.js'; +import { getConnectionsCount } from './services/connections-cache.js'; + +export function createApp(): Hono { + const app = new Hono(); + + app.use('*', cors()); + app.use('*', honoLogger()); + + app.get('/', (c) => { + return c.json({ status: CONSTANTS.API_IS_RUNNING }); + }); + + app.get('/health', (c) => { + return c.json({ + status: 'healthy', + connections: getConnectionsCount(), + uptime: process.uptime(), + timestamp: new Date().toISOString(), + }); + }); + + app.post('/', authMiddleware, executeCommand); + + app.onError((err, c) => { + const status = 'status' in err ? (err.status as number) : 500; + const message = err.message || 'Internal Server Error'; + + return c.json({ error: message }, status as 400); + }); + + app.notFound((c) => { + return c.json({ error: 'Not Found' }, 404); + }); + + return app; +} diff --git a/autoadmin-ws-server/src/config.ts b/autoadmin-ws-server/src/config.ts new file mode 100644 index 000000000..8249ad2be --- /dev/null +++ b/autoadmin-ws-server/src/config.ts @@ -0,0 +1,19 @@ +export const config = { + httpPort: Number(process.env.HTTP_PORT) || 8008, + wsPort: Number(process.env.WS_PORT) || 8009, + host: process.env.HOST || '0.0.0.0', + jwtSecret: process.env.JWT_SECRET || '', + privateKey: process.env.PRIVATE_KEY || '', + checkConnectionTokenUrl: + process.env.CHECK_CONNECTION_TOKEN_URL || 'http://autoadmin-internal-auth.local:3000/connection/token', + logLevel: process.env.LOG_LEVEL || 'silent', +} as const; + +export function validateConfig(): void { + if (!config.jwtSecret) { + throw new Error('JWT_SECRET environment variable is required'); + } + if (!config.privateKey) { + throw new Error('PRIVATE_KEY environment variable is required'); + } +} diff --git a/autoadmin-ws-server/src/constants/command-type.js b/autoadmin-ws-server/src/constants/command-type.js deleted file mode 100644 index 7dedfe906..000000000 --- a/autoadmin-ws-server/src/constants/command-type.js +++ /dev/null @@ -1,18 +0,0 @@ -export const COMMAND_TYPE = Object.freeze({ - addRowInTable: 'addRowInTable', - deleteRowInTable: 'deleteRowInTable', - getRowByPrimaryKey: 'getRowByPrimaryKey', - getRowsFromTable: 'getRowsFromTable', - getTableForeignKeys: 'getTableForeignKeys', - getTablePrimaryColumns: 'getTablePrimaryColumns', - getTableStructure: 'getTableStructure', - getTablesFromDB: 'getTablesFromDB', - testConnect: 'testConnect', - updateRowInTable: 'updateRowInTable', - bulkUpdateRowsInTable: 'bulkUpdateRowsInTable', - validateSettings: 'validateSettings', - initialConnection: 'initialConnection', - dataFromAgent: 'dataFromAgent', - isView: 'isView', - getRowsAsStream: 'getRowsAsStream', -}); diff --git a/autoadmin-ws-server/src/constants/command-type.ts b/autoadmin-ws-server/src/constants/command-type.ts new file mode 100644 index 000000000..ee10c7241 --- /dev/null +++ b/autoadmin-ws-server/src/constants/command-type.ts @@ -0,0 +1,20 @@ +export const COMMAND_TYPE = { + addRowInTable: 'addRowInTable', + deleteRowInTable: 'deleteRowInTable', + getRowByPrimaryKey: 'getRowByPrimaryKey', + getRowsFromTable: 'getRowsFromTable', + getTableForeignKeys: 'getTableForeignKeys', + getTablePrimaryColumns: 'getTablePrimaryColumns', + getTableStructure: 'getTableStructure', + getTablesFromDB: 'getTablesFromDB', + testConnect: 'testConnect', + updateRowInTable: 'updateRowInTable', + bulkUpdateRowsInTable: 'bulkUpdateRowsInTable', + validateSettings: 'validateSettings', + initialConnection: 'initialConnection', + dataFromAgent: 'dataFromAgent', + isView: 'isView', + getRowsAsStream: 'getRowsAsStream', +} as const; + +export type CommandType = (typeof COMMAND_TYPE)[keyof typeof COMMAND_TYPE]; diff --git a/autoadmin-ws-server/src/constants/constants.js b/autoadmin-ws-server/src/constants/constants.js deleted file mode 100644 index 864402a83..000000000 --- a/autoadmin-ws-server/src/constants/constants.js +++ /dev/null @@ -1,27 +0,0 @@ -export const CONSTANTS = Object.freeze({ - AUTHORIZATION_FAILED: 'Authorization failed', - NO_AUTHORIZATION_HEADER: 'No Authorization header', - TOKEN_MISSING: 'Token missing', - CONNECTION_TOKEN_MISSING: 'No connection token found', - CONNECTION_TOKEN_INCORRECT: 'Connection token in incorrect', - API_IS_RUNNING: 'API is running', - UNKNOWN_COMMAND: 'Unknown command', - CLIENT_NOT_CONNECTED: 'Client is not connected', - - WS_CACHE_OPTIONS: { - max: 5000, - }, - - TOKEN_RESULT_CACHE_OPTIONS: { - max: 5000, - maxAge: 1000 * 60 * 5, - }, - - RES_CACHE_OPTIONS: { - max: 5000, - dispose: (_key, n) => { - n?.send('Connection was closed by timeout'); - }, - maxAge: 600000, - }, -}); diff --git a/autoadmin-ws-server/src/constants/index.ts b/autoadmin-ws-server/src/constants/index.ts new file mode 100644 index 000000000..a3cb91bf2 --- /dev/null +++ b/autoadmin-ws-server/src/constants/index.ts @@ -0,0 +1,25 @@ +export const CONSTANTS = { + AUTHORIZATION_FAILED: 'Authorization failed', + NO_AUTHORIZATION_HEADER: 'No Authorization header', + TOKEN_MISSING: 'Token missing', + CONNECTION_TOKEN_MISSING: 'No connection token found', + CONNECTION_TOKEN_INCORRECT: 'Connection token is incorrect', + API_IS_RUNNING: 'API is running', + UNKNOWN_COMMAND: 'Unknown command', + CLIENT_NOT_CONNECTED: 'Client is not connected', + CONNECTION_TIMEOUT: 'Connection was closed by timeout', +} as const; + +export const CACHE_OPTIONS = { + WS_CONNECTIONS: { + max: 6000, + }, + TOKEN_RESULT: { + max: 5000, + ttl: 1000 * 60 * 5, // 5 minutes + }, + RESPONSE: { + max: 10000, + ttl: 600000, // 10 minutes + }, +} as const; diff --git a/autoadmin-ws-server/src/controllers/command.js b/autoadmin-ws-server/src/controllers/command.js deleted file mode 100644 index 559251c9d..000000000 --- a/autoadmin-ws-server/src/controllers/command.js +++ /dev/null @@ -1,25 +0,0 @@ -import { nanoid } from 'nanoid'; -import { LRUCache } from 'lru-cache' -import { CONSTANTS } from '../constants/constants.js'; -import { sendCommandToWsClient } from '../controllers/ws-connections.js'; -const resCache = new LRUCache(CONSTANTS.WS_CACHE_OPTIONS); - -export async function executeCommand(req, res) { - const connectionToken = req.connectionToken.token; - const resId = nanoid(); - req.body.resId = resId; - resCache.set(resId, res); - try { - sendCommandToWsClient(connectionToken, req.body, resId); - } catch (e) { - console.log('Command execution error ->', e.message); - } -} - -export function getCachedResponse(responseId) { - return resCache.get(responseId); -} - -export function delCachedResponse(responseId) { - resCache.delete(responseId); -} diff --git a/autoadmin-ws-server/src/controllers/ws-connections.js b/autoadmin-ws-server/src/controllers/ws-connections.js deleted file mode 100644 index b4ee8ec0d..000000000 --- a/autoadmin-ws-server/src/controllers/ws-connections.js +++ /dev/null @@ -1,47 +0,0 @@ -import { LRUCache } from 'lru-cache' -import { CONSTANTS } from '../constants/constants.js'; -import WebSocket from 'ws'; -import { getCachedResponse, delCachedResponse } from './command.js'; -const clientsCache = new LRUCache(CONSTANTS.WS_CACHE_OPTIONS); - -export function cacheWsConnection(connectionToken, wsConnection) { - clientsCache.set(connectionToken, wsConnection); -} - -export function getCacheWsConnection(connectionToken) { - return clientsCache.get(connectionToken); -} - -export function delCachedWsConnection(connectionToken) { - clientsCache.delete(connectionToken); -} - -export function sendCommandToWsClient(connectionToken, receivedData, resId) { - const cachedConnection = clientsCache.get(connectionToken); - const data = { - connectionToken: connectionToken, - data: receivedData, - }; - if (cachedConnection) { - if (cachedConnection.readyState === WebSocket.OPEN) { - try { - cachedConnection.send(JSON.stringify(data)); - } catch (e) { - console.log('-> Error sending command to client', e.message); - } - } else { - clientsCache.delete(connectionToken); - const cachedResponse = getCachedResponse(resId); - if (cachedResponse) { - cachedResponse.status(523).send(CONSTANTS.CLIENT_NOT_CONNECTED); - delCachedResponse(resId); - } - } - } else { - const cachedResponse = getCachedResponse(resId); - if (cachedResponse) { - cachedResponse.status(523).send(CONSTANTS.CLIENT_NOT_CONNECTED); - delCachedResponse(resId); - } - } -} \ No newline at end of file diff --git a/autoadmin-ws-server/src/handlers/command.ts b/autoadmin-ws-server/src/handlers/command.ts new file mode 100644 index 000000000..1d9d3ad72 --- /dev/null +++ b/autoadmin-ws-server/src/handlers/command.ts @@ -0,0 +1,57 @@ +import type { Context } from 'hono'; +import { nanoid } from 'nanoid'; +import { sendCommandToClient } from '../services/connections-cache.js'; +import { cacheResponse, responseCache } from '../services/response-cache.js'; +import { logger } from '../utils/logger.js'; + +export async function executeCommand(c: Context): Promise { + const connectionToken = c.get('connectionToken'); + const body = await c.req.json(); + const resId = nanoid(); + + body.resId = resId; + + logger.info({ resId, operationType: body.operationType, tokenFromJwt: connectionToken.token }, 'Executing command'); + + return new Promise((resolve) => { + const timeout = setTimeout(() => { + if (responseCache.has(resId)) { + responseCache.delete(resId); + resolve(c.json({ error: 'Request timeout' }, 504)); + } + }, 600000); // 10 minutes timeout + + const handleResolve = (data: string) => { + clearTimeout(timeout); + // Data from agent is already JSON string, pass it through + resolve( + new Response(data, { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }), + ); + }; + + const handleReject = (error: Error) => { + clearTimeout(timeout); + resolve(c.json({ error: error.message }, 500)); + }; + + const handleSendError = (status: number, message: string) => { + clearTimeout(timeout); + resolve(c.json({ error: message }, status as 400)); + }; + + cacheResponse(resId, handleResolve, handleReject, handleSendError); + + try { + sendCommandToClient(connectionToken.token, body, resId); + } catch (error) { + clearTimeout(timeout); + responseCache.delete(resId); + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + logger.error({ error: errorMessage, resId }, 'Command execution error'); + resolve(c.json({ error: 'Command execution failed' }, 500)); + } + }); +} diff --git a/autoadmin-ws-server/src/handlers/websocket.ts b/autoadmin-ws-server/src/handlers/websocket.ts new file mode 100644 index 000000000..aba519fab --- /dev/null +++ b/autoadmin-ws-server/src/handlers/websocket.ts @@ -0,0 +1,91 @@ +import type { Server } from 'node:http'; +import WebSocket, { WebSocketServer } from 'ws'; +import { COMMAND_TYPE } from '../constants/command-type.js'; +import { CONSTANTS } from '../constants/index.js'; +import type { WsMessage } from '../schemas/command.js'; +import { cacheConnection, deleteConnection, getConnection } from '../services/connections-cache.js'; +import { responseCache } from '../services/response-cache.js'; +import { validateConnectionToken } from '../services/token-validator.js'; +import { hashToken } from '../utils/crypto.js'; +import { logger } from '../utils/logger.js'; + +export function setupWebSocketServer(server: Server): WebSocketServer { + const wss = new WebSocketServer({ server }); + + wss.on('connection', (ws, req) => { + const ip = req.socket.remoteAddress; + logger.info({ ip }, 'New WebSocket connection'); + + ws.on('message', async (rawMessage) => { + let data: WsMessage; + + try { + data = JSON.parse(rawMessage.toString()); + } catch (_error) { + logger.warn('Failed to parse WebSocket message'); + return; + } + + const { operationType, resId } = data; + let { connectionToken } = data; + + if (connectionToken && operationType === COMMAND_TYPE.initialConnection) { + logger.info({ connectionToken: `${connectionToken.substring(0, 8)}...` }, 'Initial connection received'); + const isValid = await validateConnectionToken(connectionToken); + + if (!isValid) { + logger.warn({ connectionToken: `${connectionToken.substring(0, 8)}...` }, 'Invalid connection token'); + ws.close(1003, CONSTANTS.CONNECTION_TOKEN_INCORRECT); + return; + } + + const hashedToken = hashToken(connectionToken); + logger.info( + { rawToken: `${connectionToken.substring(0, 8)}...`, hashedToken: `${hashedToken.substring(0, 8)}...` }, + 'Token validated and hashed', + ); + connectionToken = hashedToken; + data.connectionToken = connectionToken; + } + + if (operationType === COMMAND_TYPE.dataFromAgent && resId) { + const cachedResponse = responseCache.get(resId); + + if (cachedResponse) { + logger.debug({ resId }, 'Received data from agent'); + cachedResponse.resolve(rawMessage.toString()); + responseCache.delete(resId); + } + return; + } + + if (!connectionToken) { + logger.warn('Message received without connection token'); + return; + } + + const cachedConnection = getConnection(connectionToken); + + if (!cachedConnection) { + cacheConnection(connectionToken, ws); + } else if (cachedConnection.ws.readyState !== WebSocket.OPEN) { + deleteConnection(connectionToken); + cacheConnection(connectionToken, ws); + } + }); + + ws.on('close', (code, reason) => { + logger.info({ ip, code, reason: reason.toString() }, 'WebSocket connection closed'); + }); + + ws.on('error', (error) => { + logger.error({ ip, error: error.message }, 'WebSocket error'); + }); + }); + + wss.on('error', (error) => { + logger.error({ error: error.message }, 'WebSocket server error'); + }); + + return wss; +} diff --git a/autoadmin-ws-server/src/index.js b/autoadmin-ws-server/src/index.js deleted file mode 100644 index aa5c75b84..000000000 --- a/autoadmin-ws-server/src/index.js +++ /dev/null @@ -1,126 +0,0 @@ -import express, { Router, json } from 'express'; -import axios from 'axios'; -const app = express(); -import { createServer } from 'http'; -const httpServer = createServer(app); -const wsServer = createServer((_req, res) => { - res.writeHead(200); - res.end(); -}); -import WebSocket, { WebSocketServer } from 'ws'; -const _router = Router(); -import commandRoute from './routes/command.js'; -import { - getCacheWsConnection, - cacheWsConnection, - delCachedWsConnection, -} from './controllers/ws-connections.js'; -import { COMMAND_TYPE } from './constants/command-type.js'; -import { CONSTANTS } from './constants/constants.js'; -import { getCachedResponse, delCachedResponse } from './controllers/command.js'; -import { createHmac } from 'crypto'; -import { LRUCache } from 'lru-cache'; - -const httpPort = process.env.HTTP_PORT || 8008; -const wsPort = process.env.WS_PORT || 8009; -const hostname = process.env.HOST || '172.16.0.0'; //172.16.0.0 -const privateKey = process.env.PRIVATE_KEY; -const tokenCacheResult = new LRUCache(CONSTANTS.TOKEN_RESULT_CACHE_OPTIONS); - -app.use(json()); - -app.get('/', (_req, res) => { - res.json({ status: CONSTANTS.API_IS_RUNNING }); -}); - -app.use('/', commandRoute); - -wsServer.listen(wsPort, () => { - console.log(`Web socket server listening on port: ${wsPort}`); -}); - -const ws = new WebSocketServer({ server: wsServer }); - -ws.on('connection', (connection, req) => { - const _ip = req.socket.remoteAddress; - // console.log(`Connected ${ip}`); - - connection.on('message', async (message) => { - let data; - try { - data = JSON.parse(message); - } catch (e) { - console.log('-> e.message', e.message); - return; - } - const { operationType, resId } = data; - - if ( - data.connectionToken && - operationType && - operationType === COMMAND_TYPE.initialConnection - ) { - if (!(await checkConnectionToken(data.connectionToken))) { - connection.close(1003, CONSTANTS.CONNECTION_TOKEN_INCORRECT); - } - const hmac = createHmac('sha256', privateKey); - hmac.update(data.connectionToken); - data.connectionToken = hmac.digest('hex'); - } - - const cachedConnection = getCacheWsConnection(data.connectionToken); - if (!cachedConnection) { - cacheWsConnection(data.connectionToken, connection); - } - if (cachedConnection && cachedConnection.readyState !== WebSocket.OPEN) { - delCachedWsConnection(data.connectionToken); - cacheWsConnection(data.connectionToken, connection); - } - if (operationType === COMMAND_TYPE.dataFromAgent) { - const cachedResponse = getCachedResponse(resId); - if (cachedResponse) { - cachedResponse.send(message); - delCachedResponse(resId); - } - } - }); - - connection.on('close', () => { - // console.log(`Disconnected ${ip}`); - }); -}); - -httpServer.listen(httpPort, hostname, () => { - console.log(`Http server listening host: ${hostname} on port: ${httpPort}`); -}); - -async function checkConnectionToken(connectionToken) { - if (!connectionToken) return false; - const cachedTokenResult = tokenCacheResult.get(connectionToken); - if (cachedTokenResult) { - return true; - } - try { - let checkConnectionTokenUrl; - if (process.env.CHECK_CONNECTION_TOKEN_URL) { - checkConnectionTokenUrl = `${process.env.CHECK_CONNECTION_TOKEN_URL}?token=${connectionToken}`; - } else { - checkConnectionTokenUrl = `http://autoadmin-internal-auth.local:3000/connection/token?token=${connectionToken}`; - } - console.info('-> checkConnectionTokenUrl', checkConnectionTokenUrl); - const response = await axios.get(checkConnectionTokenUrl); - if (response.status !== 200) { - console.info('-> response.status', response.status); - console.info('-> response.data', response.data); - return false; - } - const result = !!response.data.isValid; - if (result) { - tokenCacheResult.set(connectionToken, true); - } - return result; - } catch (error) { - console.error(error); - return false; - } -} diff --git a/autoadmin-ws-server/src/index.ts b/autoadmin-ws-server/src/index.ts new file mode 100644 index 000000000..304a3541b --- /dev/null +++ b/autoadmin-ws-server/src/index.ts @@ -0,0 +1,77 @@ +import { createServer } from 'node:http'; +import { serve } from '@hono/node-server'; +import { createApp } from './app.js'; +import { config, validateConfig } from './config.js'; +import { setupWebSocketServer } from './handlers/websocket.js'; +import { logger } from './utils/logger.js'; + +// Validate configuration +try { + validateConfig(); +} catch (error) { + const message = error instanceof Error ? error.message : 'Configuration error'; + logger.fatal({ error: message }, 'Failed to validate configuration'); + process.exit(1); +} + +const app = createApp(); + +// Create HTTP server for Hono +const httpServer = serve({ + fetch: app.fetch, + port: config.httpPort, + hostname: config.host, +}); + +logger.info({ host: config.host, port: config.httpPort }, 'HTTP server started'); + +const wsHttpServer = createServer((_req, res) => { + res.writeHead(200); + res.end(); +}); + +const wss = setupWebSocketServer(wsHttpServer); + +wsHttpServer.listen(config.wsPort, () => { + logger.info({ port: config.wsPort }, 'WebSocket server started'); +}); + +// Graceful shutdown +const shutdown = (signal: string) => { + logger.info({ signal }, 'Shutdown signal received'); + + // Close WebSocket server + wss.close(() => { + logger.info('WebSocket server closed'); + }); + + wsHttpServer.close(() => { + logger.info('WebSocket HTTP server closed'); + }); + + // Close HTTP server + httpServer.close(() => { + logger.info('HTTP server closed'); + }); + + // Give connections time to close gracefully + setTimeout(() => { + logger.info('Forcing shutdown'); + process.exit(0); + }, 5000); +}; + +process.on('SIGTERM', () => shutdown('SIGTERM')); +process.on('SIGINT', () => shutdown('SIGINT')); + +// Handle uncaught errors +process.on('uncaughtException', (error) => { + logger.fatal({ error: error.message, stack: error.stack }, 'Uncaught exception'); + process.exit(1); +}); + +process.on('unhandledRejection', (reason) => { + logger.error({ reason }, 'Unhandled rejection'); +}); + +export { app, httpServer, wss }; diff --git a/autoadmin-ws-server/src/middleware/auth.js b/autoadmin-ws-server/src/middleware/auth.js deleted file mode 100644 index 8da5c8abe..000000000 --- a/autoadmin-ws-server/src/middleware/auth.js +++ /dev/null @@ -1,26 +0,0 @@ -import { decode } from '../utils/jwt.js'; -import { CONSTANTS } from '../constants/constants.js'; - -export async function authByToken(req, res, next) { - const jwtSecret = process.env.JWT_SECRET; - let token = req.headers.authorization?.replace('Bearer ', ''); - - if (!token) { - return res.status(403).json({ - errors: { body: [CONSTANTS.AUTHORIZATION_FAILED, CONSTANTS.NO_AUTHORIZATION_HEADER] }, - }); - } - - try { - const connectionToken = await decode(token, jwtSecret); - if (!connectionToken) - throw new Error(CONSTANTS.CONNECTION_TOKEN_MISSING); - req.connectionToken = connectionToken; - return next(); - } catch (e) { - return res.status(401).json({ - errors: { body: [CONSTANTS.AUTHORIZATION_FAILED, e.message] }, - }); - } - -} diff --git a/autoadmin-ws-server/src/middleware/auth.ts b/autoadmin-ws-server/src/middleware/auth.ts new file mode 100644 index 000000000..650ae47d2 --- /dev/null +++ b/autoadmin-ws-server/src/middleware/auth.ts @@ -0,0 +1,56 @@ +import type { Context, Next } from 'hono'; +import { HTTPException } from 'hono/http-exception'; +import { CONSTANTS } from '../constants/index.js'; +import { type TokenPayload, verifyToken } from '../utils/jwt.js'; +import { logger } from '../utils/logger.js'; + +declare module 'hono' { + interface ContextVariableMap { + connectionToken: TokenPayload; + } +} + +// biome-ignore lint/suspicious/noConfusingVoidType: Hono middleware returns void +export async function authMiddleware(c: Context, next: Next): Promise { + const authHeader = c.req.header('Authorization'); + + if (!authHeader) { + logger.warn('Missing authorization header'); + throw new HTTPException(403, { + message: JSON.stringify({ + errors: { body: [CONSTANTS.AUTHORIZATION_FAILED, CONSTANTS.NO_AUTHORIZATION_HEADER] }, + }), + }); + } + + const token = authHeader.replace('Bearer ', ''); + + if (!token) { + logger.warn('Empty token in authorization header'); + throw new HTTPException(403, { + message: JSON.stringify({ + errors: { body: [CONSTANTS.AUTHORIZATION_FAILED, CONSTANTS.TOKEN_MISSING] }, + }), + }); + } + + try { + const payload = await verifyToken(token); + logger.info({ payloadToken: payload.token }, 'JWT payload decoded'); + + if (!payload.token) { + throw new Error(CONSTANTS.CONNECTION_TOKEN_MISSING); + } + + c.set('connectionToken', payload); + await next(); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + logger.warn({ error: errorMessage }, 'Token verification failed'); + throw new HTTPException(401, { + message: JSON.stringify({ + errors: { body: [CONSTANTS.AUTHORIZATION_FAILED, errorMessage] }, + }), + }); + } +} diff --git a/autoadmin-ws-server/src/routes/command.js b/autoadmin-ws-server/src/routes/command.js deleted file mode 100644 index 38e673d0c..000000000 --- a/autoadmin-ws-server/src/routes/command.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Router } from 'express'; -const router = Router(); - -import { executeCommand } from '../controllers/command.js'; -import { authByToken } from '../middleware/auth.js'; - -router.post('/', authByToken, executeCommand); - -export default router; diff --git a/autoadmin-ws-server/src/schemas/command.ts b/autoadmin-ws-server/src/schemas/command.ts new file mode 100644 index 000000000..57d25d2b1 --- /dev/null +++ b/autoadmin-ws-server/src/schemas/command.ts @@ -0,0 +1,23 @@ +import { z } from 'zod'; +import { COMMAND_TYPE } from '../constants/command-type.js'; + +export const commandBodySchema = z + .object({ + operationType: z.nativeEnum(COMMAND_TYPE).optional(), + connectionToken: z.string().optional(), + resId: z.string().optional(), + // Allow additional properties for command-specific data + }) + .passthrough(); + +export type CommandBody = z.infer; + +export const wsMessageSchema = z + .object({ + operationType: z.nativeEnum(COMMAND_TYPE).optional(), + connectionToken: z.string().optional(), + resId: z.string().optional(), + }) + .passthrough(); + +export type WsMessage = z.infer; diff --git a/autoadmin-ws-server/src/services/connections-cache.ts b/autoadmin-ws-server/src/services/connections-cache.ts new file mode 100644 index 000000000..5f038bc0a --- /dev/null +++ b/autoadmin-ws-server/src/services/connections-cache.ts @@ -0,0 +1,83 @@ +import { LRUCache } from 'lru-cache'; +import type WebSocket from 'ws'; +import { CACHE_OPTIONS, CONSTANTS } from '../constants/index.js'; +import { logger } from '../utils/logger.js'; +import { responseCache } from './response-cache.js'; + +interface CachedConnection { + ws: WebSocket; + connectedAt: Date; +} + +const connectionsCache = new LRUCache({ + max: CACHE_OPTIONS.WS_CONNECTIONS.max, +}); + +export function cacheConnection(connectionToken: string, ws: WebSocket): void { + connectionsCache.set(connectionToken, { + ws, + connectedAt: new Date(), + }); + logger.debug({ connectionToken: `${connectionToken.substring(0, 8)}...` }, 'Connection cached'); +} + +export function getConnection(connectionToken: string): CachedConnection | undefined { + return connectionsCache.get(connectionToken); +} + +export function deleteConnection(connectionToken: string): void { + connectionsCache.delete(connectionToken); + logger.debug({ connectionToken: `${connectionToken.substring(0, 8)}...` }, 'Connection removed from cache'); +} + +export function sendCommandToClient(connectionToken: string, data: unknown, resId: string): void { + const cached = connectionsCache.get(connectionToken); + const payload = { + connectionToken, + data, + }; + + logger.info( + { + token: `${connectionToken.substring(0, 8)}...`, + cacheSize: connectionsCache.size, + found: !!cached, + }, + 'Looking up connection', + ); + + if (!cached) { + logger.warn({ connectionToken: `${connectionToken.substring(0, 8)}...` }, 'No cached connection found'); + const cachedResponse = responseCache.get(resId); + if (cachedResponse) { + cachedResponse.sendError(523, CONSTANTS.CLIENT_NOT_CONNECTED); + responseCache.delete(resId); + } + return; + } + + const { ws } = cached; + + if (ws.readyState !== ws.OPEN) { + logger.warn({ connectionToken: `${connectionToken.substring(0, 8)}...` }, 'WebSocket not in OPEN state'); + connectionsCache.delete(connectionToken); + const cachedResponse = responseCache.get(resId); + if (cachedResponse) { + cachedResponse.sendError(523, CONSTANTS.CLIENT_NOT_CONNECTED); + responseCache.delete(resId); + } + return; + } + + try { + ws.send(JSON.stringify(payload)); + logger.debug({ resId }, 'Command sent to client'); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + logger.error({ error: errorMessage }, 'Error sending command to client'); + } +} + +export function getConnectionsCount(): number { + return connectionsCache.size; +} diff --git a/autoadmin-ws-server/src/services/response-cache.ts b/autoadmin-ws-server/src/services/response-cache.ts new file mode 100644 index 000000000..6fbd13e86 --- /dev/null +++ b/autoadmin-ws-server/src/services/response-cache.ts @@ -0,0 +1,42 @@ +import { LRUCache } from 'lru-cache'; +import { CACHE_OPTIONS, CONSTANTS } from '../constants/index.js'; +import { logger } from '../utils/logger.js'; + +interface CachedResponse { + resolve: (data: string) => void; + reject: (error: Error) => void; + sendError: (status: number, message: string) => void; + createdAt: Date; +} + +export const responseCache = new LRUCache({ + max: CACHE_OPTIONS.RESPONSE.max, + ttl: CACHE_OPTIONS.RESPONSE.ttl, + dispose: (value, key) => { + logger.debug({ resId: key }, 'Response cache entry disposed (timeout)'); + value.reject(new Error(CONSTANTS.CONNECTION_TIMEOUT)); + }, +}); + +export function cacheResponse( + resId: string, + resolve: (data: string) => void, + reject: (error: Error) => void, + sendError: (status: number, message: string) => void, +): void { + responseCache.set(resId, { + resolve, + reject, + sendError, + createdAt: new Date(), + }); + logger.debug({ resId }, 'Response cached'); +} + +export function getResponse(resId: string): CachedResponse | undefined { + return responseCache.get(resId); +} + +export function deleteResponse(resId: string): void { + responseCache.delete(resId); +} diff --git a/autoadmin-ws-server/src/services/token-validator.ts b/autoadmin-ws-server/src/services/token-validator.ts new file mode 100644 index 000000000..5de38c3c7 --- /dev/null +++ b/autoadmin-ws-server/src/services/token-validator.ts @@ -0,0 +1,46 @@ +import { LRUCache } from 'lru-cache'; +import { config } from '../config.js'; +import { CACHE_OPTIONS } from '../constants/index.js'; +import { logger } from '../utils/logger.js'; + +const tokenCache = new LRUCache({ + max: CACHE_OPTIONS.TOKEN_RESULT.max, + ttl: CACHE_OPTIONS.TOKEN_RESULT.ttl, +}); + +export async function validateConnectionToken(connectionToken: string): Promise { + if (!connectionToken) { + return false; + } + + const cachedResult = tokenCache.get(connectionToken); + if (cachedResult !== undefined) { + logger.debug({ connectionToken: `${connectionToken.substring(0, 8)}...` }, 'Token validation from cache'); + return cachedResult; + } + + try { + const checkUrl = `${config.checkConnectionTokenUrl}?token=${connectionToken}`; + logger.info({ url: checkUrl }, 'Validating connection token'); + + const response = await fetch(checkUrl); + + if (response.status !== 200) { + logger.warn({ status: response.status }, 'Token validation failed'); + return false; + } + + const data = (await response.json()) as { isValid?: boolean }; + const isValid = !!data.isValid; + + if (isValid) { + tokenCache.set(connectionToken, true); + } + + return isValid; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + logger.error({ error: errorMessage }, 'Error validating connection token'); + return false; + } +} diff --git a/autoadmin-ws-server/src/utils/crypto.ts b/autoadmin-ws-server/src/utils/crypto.ts new file mode 100644 index 000000000..67cda1917 --- /dev/null +++ b/autoadmin-ws-server/src/utils/crypto.ts @@ -0,0 +1,8 @@ +import { createHmac } from 'node:crypto'; +import { config } from '../config.js'; + +export function hashToken(token: string): string { + const hmac = createHmac('sha256', config.privateKey); + hmac.update(token); + return hmac.digest('hex'); +} diff --git a/autoadmin-ws-server/src/utils/jwt.js b/autoadmin-ws-server/src/utils/jwt.js deleted file mode 100644 index 1fd5f5dd4..000000000 --- a/autoadmin-ws-server/src/utils/jwt.js +++ /dev/null @@ -1,27 +0,0 @@ -import jwt from 'jsonwebtoken' - -export async function signToken(agent) { - const JWT_SECRET = process.env.JWT_SECRET; - return new Promise((resolve, reject) => { - jwt.sign({ - token: agent.token, - }, JWT_SECRET, (err, token) => { - if (err) - return reject(err); - return resolve(token); - }); - }); - -} - -export async function decode(token) { - const JWT_SECRET = process.env.JWT_SECRET; - return new Promise((resolve, reject) => { - jwt.verify(token, JWT_SECRET, (err, decoded) => { - if (err) - return reject(err); - - return resolve(decoded); - }); - }); -} diff --git a/autoadmin-ws-server/src/utils/jwt.ts b/autoadmin-ws-server/src/utils/jwt.ts new file mode 100644 index 000000000..94ef5dd77 --- /dev/null +++ b/autoadmin-ws-server/src/utils/jwt.ts @@ -0,0 +1,37 @@ +import jwt from 'jsonwebtoken'; +import { config } from '../config.js'; + +export interface TokenPayload { + token: string; + iat?: number; + exp?: number; +} + +export function signToken(connectionToken: string): Promise { + return new Promise((resolve, reject) => { + jwt.sign({ token: connectionToken }, config.jwtSecret, (err: Error | null, token: string | undefined) => { + if (err) { + return reject(err); + } + if (!token) { + + return reject(new Error('Failed to sign token')); + } + return resolve(token); + }); + }); +} + +export function verifyToken(token: string): Promise { + return new Promise((resolve, reject) => { + jwt.verify(token, config.jwtSecret, (err, decoded) => { + if (err) { + return reject(err); + } + if (!decoded || typeof decoded === 'string') { + return reject(new Error('Invalid token payload')); + } + return resolve(decoded as TokenPayload); + }); + }); +} diff --git a/autoadmin-ws-server/src/utils/logger.ts b/autoadmin-ws-server/src/utils/logger.ts new file mode 100644 index 000000000..2b6bb9009 --- /dev/null +++ b/autoadmin-ws-server/src/utils/logger.ts @@ -0,0 +1,14 @@ +import pino from 'pino'; +import { config } from '../config.js'; + +export const logger = pino({ + level: config.logLevel, + transport: { + target: 'pino/file', + options: { destination: 1 }, // stdout + }, + formatters: { + level: (label) => ({ level: label }), + }, + timestamp: pino.stdTimeFunctions.isoTime, +}); diff --git a/autoadmin-ws-server/tsconfig.json b/autoadmin-ws-server/tsconfig.json new file mode 100644 index 000000000..45b6b79fa --- /dev/null +++ b/autoadmin-ws-server/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2022"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/autoadmin-ws-server/yarn.lock b/autoadmin-ws-server/yarn.lock index 25049ac3b..1da5f5af1 100644 --- a/autoadmin-ws-server/yarn.lock +++ b/autoadmin-ws-server/yarn.lock @@ -1,881 +1,256 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@biomejs/biome@2.3.13": + version "2.3.13" + resolved "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.13.tgz" + integrity sha512-Fw7UsV0UAtWIBIm0M7g5CRerpu1eKyKAXIazzxhbXYUyMkwNrkX/KLkGI7b+uVDQ5cLUMfOC9vR60q9IDYDstA== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "2.3.13" + "@biomejs/cli-darwin-x64" "2.3.13" + "@biomejs/cli-linux-arm64" "2.3.13" + "@biomejs/cli-linux-arm64-musl" "2.3.13" + "@biomejs/cli-linux-x64" "2.3.13" + "@biomejs/cli-linux-x64-musl" "2.3.13" + "@biomejs/cli-win32-arm64" "2.3.13" + "@biomejs/cli-win32-x64" "2.3.13" + +"@biomejs/cli-linux-x64@2.3.13": + version "2.3.13" + resolved "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.13.tgz" + integrity sha512-s+YsZlgiXNq8XkgHs6xdvKDFOj/bwTEevqEY6rC2I3cBHbxXYU1LOZstH3Ffw9hE5tE1sqT7U23C00MzkXztMw== + +"@esbuild/linux-x64@0.27.2": + version "0.27.2" + +"@hono/node-server@^1.19.9": + version "1.19.9" + +"@pinojs/redact@^0.4.0": + version "0.4.0" + +"@types/jsonwebtoken@^9.0.10": + version "9.0.10" + dependencies: + "@types/ms" "*" + "@types/node" "*" + +"@types/ms@*": + version "2.1.0" + +"@types/node@*": + version "25.0.10" + dependencies: + undici-types "~7.16.0" + +"@types/node@^22.10.2": + version "22.19.7" + dependencies: + undici-types "~6.21.0" + +"@types/ws@^8.18.1": + version "8.18.1" + dependencies: + "@types/node" "*" + +atomic-sleep@^1.0.0: + version "1.0.0" -__metadata: - version: 6 - cacheKey: 8 +buffer-equal-constant-time@^1.0.1: + version "1.0.1" -"accepts@npm:^2.0.0": - version: 2.0.0 - resolution: "accepts@npm:2.0.0" +ecdsa-sig-formatter@1.0.11: + version "1.0.11" dependencies: - mime-types: ^3.0.0 - negotiator: ^1.0.0 - checksum: 49fe6c050cb6f6ff4e771b4d88324fca4d3127865f2473872e818dca127d809ba3aa8fdfc7acb51dd3c5bade7311ca6b8cfff7015ea6db2f7eb9c8444d223a4f - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"autoadmin-ws-server@workspace:.": - version: 0.0.0-use.local - resolution: "autoadmin-ws-server@workspace:." - dependencies: - axios: ^1.13.2 - express: ^5.2.1 - jsonwebtoken: ^9.0.3 - lru-cache: ^11.2.4 - nanoid: ^5.1.6 - ws: ^8.18.3 - languageName: unknown - linkType: soft - -"axios@npm:^1.13.2": - version: 1.13.2 - resolution: "axios@npm:1.13.2" - dependencies: - follow-redirects: ^1.15.6 - form-data: ^4.0.4 - proxy-from-env: ^1.1.0 - checksum: 057d0204d5930e2969f0bccb9f0752745b1524a36994667833195e7e1a82f245d660752ba8517b2dbea17e9e4ed0479f10b80c5fe45edd0b5a0df645c0060386 - languageName: node - linkType: hard - -"body-parser@npm:^2.2.1": - version: 2.2.1 - resolution: "body-parser@npm:2.2.1" - dependencies: - bytes: ^3.1.2 - content-type: ^1.0.5 - debug: ^4.4.3 - http-errors: ^2.0.0 - iconv-lite: ^0.7.0 - on-finished: ^2.4.1 - qs: ^6.14.0 - raw-body: ^3.0.1 - type-is: ^2.0.1 - checksum: 4a111af3534e6a5d37e8b98c23da403d5d1f046a24546193a417b2a4da7c52ee7c367f18cea73638fa25b8699b02923948bc4b55f366b879d3ca8ede49e201aa - languageName: node - linkType: hard - -"buffer-equal-constant-time@npm:^1.0.1": - version: 1.0.1 - resolution: "buffer-equal-constant-time@npm:1.0.1" - checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab - languageName: node - linkType: hard - -"bytes@npm:^3.1.2, bytes@npm:~3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind-apply-helpers@npm:1.0.2" - dependencies: - es-errors: ^1.3.0 - function-bind: ^1.1.2 - checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b - languageName: node - linkType: hard - -"call-bound@npm:^1.0.2": - version: 1.0.4 - resolution: "call-bound@npm:1.0.4" - dependencies: - call-bind-apply-helpers: ^1.0.2 - get-intrinsic: ^1.3.0 - checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"content-disposition@npm:^1.0.0": - version: 1.0.0 - resolution: "content-disposition@npm:1.0.0" - dependencies: - safe-buffer: 5.2.1 - checksum: b27e2579fefe0ecf78238bb652fbc750671efce8344f0c6f05235b12433e6a965adb40906df1ac1fdde23e8f9f0e58385e44640e633165420f3f47d830ae0398 - languageName: node - linkType: hard - -"content-type@npm:^1.0.5": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 - languageName: node - linkType: hard - -"cookie-signature@npm:^1.2.1": - version: 1.2.2 - resolution: "cookie-signature@npm:1.2.2" - checksum: 1ad4f9b3907c9f3673a0f0a07c0a23da7909ac6c9204c5d80a0ec102fe50ccc45f27fdf496361840d6c132c5bb0037122c0a381f856d070183d1ebe3e5e041ff - languageName: node - linkType: hard - -"cookie@npm:^0.7.1": - version: 0.7.2 - resolution: "cookie@npm:0.7.2" - checksum: 9bf8555e33530affd571ea37b615ccad9b9a34febbf2c950c86787088eb00a8973690833b0f8ebd6b69b753c62669ea60cec89178c1fb007bf0749abed74f93e - languageName: node - linkType: hard - -"debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.3": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: ^2.1.3 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 4805abd570e601acdca85b6aa3757186084a45cff9b2fa6eee1f3b173caa776b45f478b2a71a572d616d2010cea9211d0ac4a02a610e4c18ac4324bde3760834 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"depd@npm:^2.0.0, depd@npm:~2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"dunder-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "dunder-proto@npm:1.0.1" - dependencies: - call-bind-apply-helpers: ^1.0.1 - es-errors: ^1.3.0 - gopd: ^1.2.0 - checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 - languageName: node - linkType: hard - -"ecdsa-sig-formatter@npm:1.0.11": - version: 1.0.11 - resolution: "ecdsa-sig-formatter@npm:1.0.11" - dependencies: - safe-buffer: ^5.0.1 - checksum: 207f9ab1c2669b8e65540bce29506134613dd5f122cccf1e6a560f4d63f2732d427d938f8481df175505aad94583bcb32c688737bb39a6df0625f903d6d93c03 - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f - languageName: node - linkType: hard - -"encodeurl@npm:^2.0.0": - version: 2.0.0 - resolution: "encodeurl@npm:2.0.0" - checksum: abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.1": - version: 1.0.1 - resolution: "es-define-property@npm:1.0.1" - checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": - version: 1.1.1 - resolution: "es-object-atoms@npm:1.1.1" - dependencies: - es-errors: ^1.3.0 - checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.1.0": - version: 2.1.0 - resolution: "es-set-tostringtag@npm:2.1.0" - dependencies: - es-errors: ^1.3.0 - get-intrinsic: ^1.2.6 - has-tostringtag: ^1.0.2 - hasown: ^2.0.2 - checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 - languageName: node - linkType: hard - -"escape-html@npm:^1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 - languageName: node - linkType: hard - -"etag@npm:^1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff - languageName: node - linkType: hard - -"express@npm:^5.2.1": - version: 5.2.1 - resolution: "express@npm:5.2.1" - dependencies: - accepts: ^2.0.0 - body-parser: ^2.2.1 - content-disposition: ^1.0.0 - content-type: ^1.0.5 - cookie: ^0.7.1 - cookie-signature: ^1.2.1 - debug: ^4.4.0 - depd: ^2.0.0 - encodeurl: ^2.0.0 - escape-html: ^1.0.3 - etag: ^1.8.1 - finalhandler: ^2.1.0 - fresh: ^2.0.0 - http-errors: ^2.0.0 - merge-descriptors: ^2.0.0 - mime-types: ^3.0.0 - on-finished: ^2.4.1 - once: ^1.4.0 - parseurl: ^1.3.3 - proxy-addr: ^2.0.7 - qs: ^6.14.0 - range-parser: ^1.2.1 - router: ^2.2.0 - send: ^1.1.0 - serve-static: ^2.2.0 - statuses: ^2.0.1 - type-is: ^2.0.1 - vary: ^1.1.2 - checksum: e0bc9c11fcf4e6ed29c9b0551229e8cf35d959970eb5e10ef3e48763eb3a63487251950d9bf4ef38b93085f0f33bb1fc37ab07349b8fa98a0fa5f67236d4c054 - languageName: node - linkType: hard - -"finalhandler@npm:^2.1.0": - version: 2.1.0 - resolution: "finalhandler@npm:2.1.0" - dependencies: - debug: ^4.4.0 - encodeurl: ^2.0.0 - escape-html: ^1.0.3 - on-finished: ^2.4.1 - parseurl: ^1.3.3 - statuses: ^2.0.1 - checksum: 27ca9cc83b1384ba37959eb95bc7e62bc0bf4d6f6af63f6d38821cf7499b113e34b23f96a2a031616817f73986f94deea67c2f558de9daf406790c181a2501df - languageName: node - linkType: hard - -"follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" - peerDependenciesMeta: - debug: - optional: true - checksum: a62c378dfc8c00f60b9c80cab158ba54e99ba0239a5dd7c81245e5a5b39d10f0c35e249c3379eae719ff0285fff88c365dd446fab19dee771f1d76252df1bbf5 - languageName: node - linkType: hard - -"form-data@npm:^4.0.4": - version: 4.0.4 - resolution: "form-data@npm:4.0.4" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - es-set-tostringtag: ^2.1.0 - hasown: ^2.0.2 - mime-types: ^2.1.12 - checksum: 9b7788836df9fa5a6999e0c02515b001946b2a868cfe53f026c69e2c537a2ff9fbfb8e9d2b678744628f3dc7a2d6e14e4e45dfaf68aa6239727f0bdb8ce0abf2 - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 - languageName: node - linkType: hard - -"fresh@npm:^2.0.0": - version: 2.0.0 - resolution: "fresh@npm:2.0.0" - checksum: 38b9828352c6271e2a0dd8bdd985d0100dbbc4eb8b6a03286071dd6f7d96cfaacd06d7735701ad9a95870eb3f4555e67c08db1dcfe24c2e7bb87383c72fae1d2 - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": - version: 1.3.0 - resolution: "get-intrinsic@npm:1.3.0" - dependencies: - call-bind-apply-helpers: ^1.0.2 - es-define-property: ^1.0.1 - es-errors: ^1.3.0 - es-object-atoms: ^1.1.1 - function-bind: ^1.1.2 - get-proto: ^1.0.1 - gopd: ^1.2.0 - has-symbols: ^1.1.0 - hasown: ^2.0.2 - math-intrinsics: ^1.1.0 - checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d - languageName: node - linkType: hard - -"get-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "get-proto@npm:1.0.1" - dependencies: - dunder-proto: ^1.0.1 - es-object-atoms: ^1.0.0 - checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b - languageName: node - linkType: hard - -"gopd@npm:^1.2.0": - version: 1.2.0 - resolution: "gopd@npm:1.2.0" - checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: ^1.0.3 - checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d - languageName: node - linkType: hard - -"hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: ^1.1.2 - checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db - languageName: node - linkType: hard - -"http-errors@npm:^2.0.0, http-errors@npm:~2.0.1": - version: 2.0.1 - resolution: "http-errors@npm:2.0.1" - dependencies: - depd: ~2.0.0 - inherits: ~2.0.4 - setprototypeof: ~1.2.0 - statuses: ~2.0.2 - toidentifier: ~1.0.1 - checksum: 155d1a100a06e4964597013109590b97540a177b69c3600bbc93efc746465a99a2b718f43cdf76b3791af994bbe3a5711002046bf668cdc007ea44cea6df7ccd - languageName: node - linkType: hard - -"iconv-lite@npm:^0.7.0, iconv-lite@npm:~0.7.0": - version: 0.7.1 - resolution: "iconv-lite@npm:0.7.1" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: d20ea696c8bace51b8d4e1c7e7eda3e51a2ffd72fde2caa54aeff6dc6bc23a60db0b111db750c84b397874a04923c5b0f1cc8beb400349fb1a83a797a85ec082 - languageName: node - linkType: hard - -"inherits@npm:~2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 - languageName: node - linkType: hard - -"is-promise@npm:^4.0.0": - version: 4.0.0 - resolution: "is-promise@npm:4.0.0" - checksum: 0b46517ad47b00b6358fd6553c83ec1f6ba9acd7ffb3d30a0bf519c5c69e7147c132430452351b8a9fc198f8dd6c4f76f8e6f5a7f100f8c77d57d9e0f4261a8a - languageName: node - linkType: hard - -"jsonwebtoken@npm:^9.0.3": - version: 9.0.3 - resolution: "jsonwebtoken@npm:9.0.3" - dependencies: - jws: ^4.0.1 - lodash.includes: ^4.3.0 - lodash.isboolean: ^3.0.3 - lodash.isinteger: ^4.0.4 - lodash.isnumber: ^3.0.3 - lodash.isplainobject: ^4.0.6 - lodash.isstring: ^4.0.1 - lodash.once: ^4.0.0 - ms: ^2.1.1 - semver: ^7.5.4 - checksum: 22d306335aeba0a0a1a4f7abbc4ee36b4bed3b98c67cdf078f0854845bf5646732e08f1cf1fae802a71c4efb1daef72aa1055d36bce6806caad7b1308b14bcd8 - languageName: node - linkType: hard - -"jwa@npm:^2.0.1": - version: 2.0.1 - resolution: "jwa@npm:2.0.1" - dependencies: - buffer-equal-constant-time: ^1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: ^5.0.1 - checksum: 6a9828c054c407f6718057089bd3d46dfcb1394e1553e3867abd4579dbec7728b4b0759e7253422ab7d824d95615a86427b35c43f94b83fc3a76470ca4bd2037 - languageName: node - linkType: hard - -"jws@npm:^4.0.1": - version: 4.0.1 - resolution: "jws@npm:4.0.1" - dependencies: - jwa: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: c33a060b2cce1e0e49f85054a49a951f9d52a9e2ae732d720f0fc51843c9ac07a68aacd8e9d086ef4c7c4437d42978b698b57a3e7c9bc4a91c0b74276ea85a9a - languageName: node - linkType: hard - -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6 - languageName: node - linkType: hard - -"lodash.isboolean@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isboolean@npm:3.0.3" - checksum: b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 - languageName: node - linkType: hard - -"lodash.isinteger@npm:^4.0.4": - version: 4.0.4 - resolution: "lodash.isinteger@npm:4.0.4" - checksum: 6034821b3fc61a2ffc34e7d5644bb50c5fd8f1c0121c554c21ac271911ee0c0502274852845005f8651d51e199ee2e0cfebfe40aaa49c7fe617f603a8a0b1691 - languageName: node - linkType: hard - -"lodash.isnumber@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isnumber@npm:3.0.3" - checksum: 913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 - languageName: node - linkType: hard - -"lodash.isplainobject@npm:^4.0.6": - version: 4.0.6 - resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 - languageName: node - linkType: hard - -"lodash.isstring@npm:^4.0.1": - version: 4.0.1 - resolution: "lodash.isstring@npm:4.0.1" - checksum: eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 - languageName: node - linkType: hard - -"lodash.once@npm:^4.0.0": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 - languageName: node - linkType: hard - -"lru-cache@npm:^11.2.4": - version: 11.2.4 - resolution: "lru-cache@npm:11.2.4" - checksum: cb8cf72b80a506593f51880bd5a765380d6d8eb82e99b2fbb2f22fe39e5f2f641d47a2509e74cc294617f32a4e90ae8f6214740fe00bc79a6178854f00419b24 - languageName: node - linkType: hard - -"math-intrinsics@npm:^1.1.0": - version: 1.1.0 - resolution: "math-intrinsics@npm:1.1.0" - checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 - languageName: node - linkType: hard - -"media-typer@npm:^1.1.0": - version: 1.1.0 - resolution: "media-typer@npm:1.1.0" - checksum: a58dd60804df73c672942a7253ccc06815612326dc1c0827984b1a21704466d7cde351394f47649e56cf7415e6ee2e26e000e81b51b3eebb5a93540e8bf93cbd - languageName: node - linkType: hard - -"merge-descriptors@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-descriptors@npm:2.0.0" - checksum: e383332e700a94682d0125a36c8be761142a1320fc9feeb18e6e36647c9edf064271645f5669b2c21cf352116e561914fd8aa831b651f34db15ef4038c86696a - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-db@npm:^1.54.0": - version: 1.54.0 - resolution: "mime-db@npm:1.54.0" - checksum: e99aaf2f23f5bd607deb08c83faba5dd25cf2fec90a7cc5b92d8260867ee08dab65312e1a589e60093dc7796d41e5fae013268418482f1db4c7d52d0a0960ac9 - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": - version: 3.0.1 - resolution: "mime-types@npm:3.0.1" - dependencies: - mime-db: ^1.54.0 - checksum: 8d497ad5cb2dd1210ac7d049b5de94af0b24b45a314961e145b44389344604d54752f03bc00bf880c0da60a214be6fb6d423d318104f02c28d95dd8ebeea4fb4 - languageName: node - linkType: hard - -"ms@npm:^2.1.1, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"nanoid@npm:^5.1.6": - version: 5.1.6 - resolution: "nanoid@npm:5.1.6" - bin: - nanoid: bin/nanoid.js - checksum: 4109dbcf596d7f297a9b42f459b8f01694a03ebbdd2f41408d963ad54e5ec7234cbe7b4acad137751f31add11bb4fb3415a3e688082516745812811f05570014 - languageName: node - linkType: hard - -"negotiator@npm:^1.0.0": - version: 1.0.0 - resolution: "negotiator@npm:1.0.0" - checksum: 20ebfe79b2d2e7cf9cbc8239a72662b584f71164096e6e8896c8325055497c96f6b80cd22c258e8a2f2aa382a787795ec3ee8b37b422a302c7d4381b0d5ecfbb - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.3": - version: 1.13.4 - resolution: "object-inspect@npm:1.13.4" - checksum: 582810c6a8d2ef988ea0a39e69e115a138dad8f42dd445383b394877e5816eb4268489f316a6f74ee9c4e0a984b3eab1028e3e79d62b1ed67c726661d55c7a8b - languageName: node - linkType: hard - -"on-finished@npm:^2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: 1.1.1 - checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 - languageName: node - linkType: hard - -"once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"parseurl@npm:^1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 - languageName: node - linkType: hard - -"path-to-regexp@npm:^8.0.0": - version: 8.2.0 - resolution: "path-to-regexp@npm:8.2.0" - checksum: 56e13e45962e776e9e7cd72e87a441cfe41f33fd539d097237ceb16adc922281136ca12f5a742962e33d8dda9569f630ba594de56d8b7b6e49adf31803c5e771 - languageName: node - linkType: hard - -"proxy-addr@npm:^2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 - languageName: node - linkType: hard - -"qs@npm:^6.14.0": - version: 6.14.0 - resolution: "qs@npm:6.14.0" - dependencies: - side-channel: ^1.1.0 - checksum: 189b52ad4e9a0da1a16aff4c58b2a554a8dad9bd7e287c7da7446059b49ca2e33a49e570480e8be406b87fccebf134f51c373cbce36c8c83859efa0c9b71d635 - languageName: node - linkType: hard - -"range-parser@npm:^1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 - languageName: node - linkType: hard - -"raw-body@npm:^3.0.1": - version: 3.0.2 - resolution: "raw-body@npm:3.0.2" - dependencies: - bytes: ~3.1.2 - http-errors: ~2.0.1 - iconv-lite: ~0.7.0 - unpipe: ~1.0.0 - checksum: bf8ce8e9734f273f24d81f9fed35609dbd25c2869faa5fb5075f7ee225c0913e2240adda03759d7e72f2a757f8012d58bb7a871a80261d5140ad65844caeb5bd - languageName: node - linkType: hard - -"router@npm:^2.2.0": - version: 2.2.0 - resolution: "router@npm:2.2.0" - dependencies: - debug: ^4.4.0 - depd: ^2.0.0 - is-promise: ^4.0.0 - parseurl: ^1.3.3 - path-to-regexp: ^8.0.0 - checksum: 4c3bec8011ed10bb07d1ee860bc715f245fff0fdff991d8319741d2932d89c3fe0a56766b4fa78e95444bc323fd2538e09c8e43bfbd442c2a7fab67456df7fa5 - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"semver@npm:^7.5.4": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 - languageName: node - linkType: hard - -"send@npm:^1.1.0, send@npm:^1.2.0": - version: 1.2.0 - resolution: "send@npm:1.2.0" - dependencies: - debug: ^4.3.5 - encodeurl: ^2.0.0 - escape-html: ^1.0.3 - etag: ^1.8.1 - fresh: ^2.0.0 - http-errors: ^2.0.0 - mime-types: ^3.0.1 - ms: ^2.1.3 - on-finished: ^2.4.1 - range-parser: ^1.2.1 - statuses: ^2.0.1 - checksum: 7557ee6c1c257a1c53b402b4fba8ed88c95800b08abe085fc79e0824869274f213491be2efb2df3de228c70e4d40ce2019e5f77b58c42adb97149135420c3f34 - languageName: node - linkType: hard - -"serve-static@npm:^2.2.0": - version: 2.2.0 - resolution: "serve-static@npm:2.2.0" + safe-buffer "^5.0.1" + +esbuild@~0.27.0: + version "0.27.2" + optionalDependencies: + "@esbuild/aix-ppc64" "0.27.2" + "@esbuild/android-arm" "0.27.2" + "@esbuild/android-arm64" "0.27.2" + "@esbuild/android-x64" "0.27.2" + "@esbuild/darwin-arm64" "0.27.2" + "@esbuild/darwin-x64" "0.27.2" + "@esbuild/freebsd-arm64" "0.27.2" + "@esbuild/freebsd-x64" "0.27.2" + "@esbuild/linux-arm" "0.27.2" + "@esbuild/linux-arm64" "0.27.2" + "@esbuild/linux-ia32" "0.27.2" + "@esbuild/linux-loong64" "0.27.2" + "@esbuild/linux-mips64el" "0.27.2" + "@esbuild/linux-ppc64" "0.27.2" + "@esbuild/linux-riscv64" "0.27.2" + "@esbuild/linux-s390x" "0.27.2" + "@esbuild/linux-x64" "0.27.2" + "@esbuild/netbsd-arm64" "0.27.2" + "@esbuild/netbsd-x64" "0.27.2" + "@esbuild/openbsd-arm64" "0.27.2" + "@esbuild/openbsd-x64" "0.27.2" + "@esbuild/openharmony-arm64" "0.27.2" + "@esbuild/sunos-x64" "0.27.2" + "@esbuild/win32-arm64" "0.27.2" + "@esbuild/win32-ia32" "0.27.2" + "@esbuild/win32-x64" "0.27.2" + +get-tsconfig@^4.7.5: + version "4.13.0" + dependencies: + resolve-pkg-maps "^1.0.0" + +hono@^4, hono@^4.11.7: + version "4.11.7" + +jsonwebtoken@^9.0.3: + version "9.0.3" + dependencies: + jws "^4.0.1" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" + +jwa@^2.0.1: + version "2.0.1" dependencies: - encodeurl: ^2.0.0 - escape-html: ^1.0.3 - parseurl: ^1.3.3 - send: ^1.2.0 - checksum: 74f39e88f0444aa6732aae3b9597739c47552adecdc83fa32aa42555e76f1daad480d791af73894655c27a2d378275a461e691cead33fb35d8b976f1e2d24665 - languageName: node - linkType: hard - -"setprototypeof@npm:~1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 - languageName: node - linkType: hard - -"side-channel-list@npm:^1.0.0": - version: 1.0.0 - resolution: "side-channel-list@npm:1.0.0" + buffer-equal-constant-time "^1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^4.0.1: + version "4.0.1" dependencies: - es-errors: ^1.3.0 - object-inspect: ^1.13.3 - checksum: 603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f - languageName: node - linkType: hard - -"side-channel-map@npm:^1.0.1": - version: 1.0.1 - resolution: "side-channel-map@npm:1.0.1" + jwa "^2.0.1" + safe-buffer "^5.0.1" + +lodash.includes@^4.3.0: + version "4.3.0" + +lodash.isboolean@^3.0.3: + version "3.0.3" + +lodash.isinteger@^4.0.4: + version "4.0.4" + +lodash.isnumber@^3.0.3: + version "3.0.3" + +lodash.isplainobject@^4.0.6: + version "4.0.6" + +lodash.isstring@^4.0.1: + version "4.0.1" + +lodash.once@^4.0.0: + version "4.1.1" + +lru-cache@^11.2.5: + version "11.2.5" + +ms@^2.1.1: + version "2.1.3" + +nanoid@^5.1.6: + version "5.1.6" + +on-exit-leak-free@^2.1.0: + version "2.1.2" + +pino-abstract-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz" + integrity sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg== + dependencies: + split2 "^4.0.0" + +pino-std-serializers@^7.0.0: + version "7.1.0" + +pino@^10.3.0: + version "10.3.0" + resolved "https://registry.npmjs.org/pino/-/pino-10.3.0.tgz" + integrity sha512-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA== dependencies: - call-bound: ^1.0.2 - es-errors: ^1.3.0 - get-intrinsic: ^1.2.5 - object-inspect: ^1.13.3 - checksum: 42501371cdf71f4ccbbc9c9e2eb00aaaab80a4c1c429d5e8da713fd4d39ef3b8d4a4b37ed4f275798a65260a551a7131fd87fe67e922dba4ac18586d6aab8b06 - languageName: node - linkType: hard - -"side-channel-weakmap@npm:^1.0.2": - version: 1.0.2 - resolution: "side-channel-weakmap@npm:1.0.2" + "@pinojs/redact" "^0.4.0" + atomic-sleep "^1.0.0" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^3.0.0" + pino-std-serializers "^7.0.0" + process-warning "^5.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^4.0.1" + thread-stream "^4.0.0" + +process-warning@^5.0.0: + version "5.0.0" + +quick-format-unescaped@^4.0.3: + version "4.0.4" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + +safe-buffer@^5.0.1: + version "5.2.1" + +safe-stable-stringify@^2.3.1: + version "2.5.0" + +semver@^7.5.4: + version "7.7.3" + +sonic-boom@^4.0.1: + version "4.2.0" dependencies: - call-bound: ^1.0.2 - es-errors: ^1.3.0 - get-intrinsic: ^1.2.5 - object-inspect: ^1.13.3 - side-channel-map: ^1.0.1 - checksum: a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 - languageName: node - linkType: hard - -"side-channel@npm:^1.1.0": - version: 1.1.0 - resolution: "side-channel@npm:1.1.0" + atomic-sleep "^1.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +thread-stream@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz" + integrity sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA== dependencies: - es-errors: ^1.3.0 - object-inspect: ^1.13.3 - side-channel-list: ^1.0.0 - side-channel-map: ^1.0.1 - side-channel-weakmap: ^1.0.2 - checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff - languageName: node - linkType: hard - -"statuses@npm:^2.0.1, statuses@npm:~2.0.2": - version: 2.0.2 - resolution: "statuses@npm:2.0.2" - checksum: 6927feb50c2a75b2a4caab2c565491f7a93ad3d8dbad7b1398d52359e9243a20e2ebe35e33726dee945125ef7a515e9097d8a1b910ba2bbd818265a2f6c39879 - languageName: node - linkType: hard - -"toidentifier@npm:~1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 - languageName: node - linkType: hard - -"type-is@npm:^2.0.1": - version: 2.0.1 - resolution: "type-is@npm:2.0.1" + real-require "^0.2.0" + +tsx@^4.21.0: + version "4.21.0" dependencies: - content-type: ^1.0.5 - media-typer: ^1.1.0 - mime-types: ^3.0.0 - checksum: 0266e7c782238128292e8c45e60037174d48c6366bb2d45e6bd6422b611c193f83409a8341518b6b5f33f8e4d5a959f38658cacfea77f0a3505b9f7ac1ddec8f - languageName: node - linkType: hard - -"unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 - languageName: node - linkType: hard - -"vary@npm:^1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"ws@npm:^8.18.3": - version: 8.18.3 - resolution: "ws@npm:8.18.3" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: d64ef1631227bd0c5fe21b3eb3646c9c91229402fb963d12d87b49af0a1ef757277083af23a5f85742bae1e520feddfb434cb882ea59249b15673c16dc3f36e0 - languageName: node - linkType: hard + esbuild "~0.27.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + +typescript@^5.9.3: + version "5.9.3" + +undici-types@~6.21.0: + version "6.21.0" + +undici-types@~7.16.0: + version "7.16.0" + +ws@^8.19.0: + version "8.19.0" + +zod@^4.3.6: + version "4.3.6" + resolved "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz" + integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg== 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 bb959c921..2d28e37ea 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 @@ -33,3630 +33,3630 @@ 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(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; - await dropTestTables(testTables, connectionToTestDB); - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; + await dropTestTables(testTables, connectionToTestDB); + 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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 = '5'; - - 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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', '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 = '5'; + + 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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', '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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', '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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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'); - - 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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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'); + + 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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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'); - - 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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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'); + + 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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName } = await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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 connectionToTestDB = getTestData(mockFactory).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestPostgresTableWithSchema(connectionToTestDB); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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).connectionToPostgresSchema; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestPostgresTableWithSchema(connectionToTestDB); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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).connectionToPostgresSchema; - 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).connectionToPostgresSchema; + 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'); }); diff --git a/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts b/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts index d925254aa..d27d0c479 100644 --- a/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts @@ -43,3749 +43,3050 @@ let testTableSecondColumnName: string; let testEntitiesSeedsCount: number; let insertedSearchedIds: Array<{ id?: string; number: number }>; let connectionToTestDB: any; +let firstUserToken: string; +let createdConnectionId: string; 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); - connectionToTestDB = getTestData(mockFactory).cassandraAgentTestConnection; - 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); + connectionToTestDB = getTestData(mockFactory).cassandraAgentTestConnection; + 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); + + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; }); test.beforeEach(async () => { - const connectionToCassandraDBInDocker = getTestData(mockFactory).cassandraTestConnection; - const testTableCreationResult = await createTestTable(connectionToCassandraDBInDocker); - testTableName = testTableCreationResult.testTableName; - testTableColumnName = testTableCreationResult.testTableColumnName; - testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; - testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; - insertedSearchedIds = testTableCreationResult.insertedSearchedIds; + const connectionToCassandraDBInDocker = getTestData(mockFactory).cassandraTestConnection; + const testTableCreationResult = await createTestTable(connectionToCassandraDBInDocker); + testTableName = testTableCreationResult.testTableName; + testTableColumnName = testTableCreationResult.testTableColumnName; + testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; + testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; + insertedSearchedIds = testTableCreationResult.insertedSearchedIds; }); 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); - console.log('🚀 ~ test.serial ~ getTablesRO:', getTablesRO); - 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${emptyConnectionId}`) + .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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); + 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); -test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const row = { + id: faker.string.uuid(), + age: 99, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + t.is(rows.length, 42); +}); - 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'); +test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); - t.is(message, Messages.PARAMETER_MISSING); + 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); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + 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 { rows, primaryColumns, pagination } = getTableRowsRO; - t.is(rows.length, 42); + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + const foundIdForUpdate = insertedSearchedIds[0].id; + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const foundIdForUpdate = insertedSearchedIds[0].id; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundIdForUpdate = insertedSearchedIds[0].id; + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const foundIdForUpdate = insertedSearchedIds[0].id; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundIdForUpdate = insertedSearchedIds[0].id; + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const foundIdForUpdate = insertedSearchedIds[0].id; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundIdForUpdate = insertedSearchedIds[0].id; + + 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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const foundIdForUpdate = insertedSearchedIds[0].id; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundIdForUpdate = insertedSearchedIds[0].id; + + 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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, 500); - const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); - t.is(originalMessage, `No data returned from agent`); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + 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/${createdConnectionId}?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, 500); + const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); + t.is(originalMessage, `No data returned from agent`); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0].id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0].id; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0].id; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0].id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0].id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, 500); - t.is(deleteRowInTableRO.originalMessage, `No data returned from agent`); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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, 500); + t.is(deleteRowInTableRO.originalMessage, `No data returned from agent`); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = insertedSearchedIds[0].id; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = insertedSearchedIds[0].id; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = insertedSearchedIds[0].id; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = insertedSearchedIds[0].id; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = insertedSearchedIds[0].id; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = insertedSearchedIds[0].id; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, 500); - const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); - t.is(originalMessage, `No data returned from agent`); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const idForSearch = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForSearch}&age=14`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(foundRowInTableResponse.status, 500); + const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); + t.is(originalMessage, `No data returned from agent`); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}`) + .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.true(deleteRowsLogs.length >= primaryKeysForDeletion.length); }); currentTest = 'POST /connection/test'; test.skip(`${currentTest} should test connection and return result`, async (t) => { - 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 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.skip(`${currentTest} should test connection and return negative result when connection password is incorrect result`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - connectionToTestDB.password = '8764323452888'; - connectionToTestDB.database = 'test_db'; - const testConnectionResponse = await request(app.getHttpServer()) - .post('/connection/test/') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(testConnectionResponse.status, 201); - const { result } = JSON.parse(testConnectionResponse.text); - t.is(result, false); + 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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); - }, + async (t) => { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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/${createdConnectionId}?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/saas-tests/table-clickhouse-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts index cd3ac3b7b..96e059431 100644 --- a/backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts @@ -37,8 +37,9 @@ let _testUtils: TestUtils; const testSearchedUserName = 'Vasia'; const testTables: Array = []; let currentTest: string; -let _connectionToTestDB: any; -let _firstUserToken: string; +let connectionToTestDB: any; +let firstUserToken: string; +let createdConnectionId: string; let testTableName: string; let testTableColumnName: string; let testTableSecondColumnName: string; @@ -46,4075 +47,3133 @@ let testEntitiesSeedsCount: number; let _insertedSearchedIds: Array<{ _id?: string; number: number }>; test.before(async () => { - 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); + 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); + + connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; }); 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.beforeEach(async () => { - const connectionToClickhouseDBInDocker = getTestData(mockFactory).clickhouseTestConnection; - const testTableCreationResult = await createTestTable(connectionToClickhouseDBInDocker); - testTableName = testTableCreationResult.testTableName; - testTableColumnName = testTableCreationResult.testTableColumnName; - testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; - testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; + const connectionToClickhouseDBInDocker = getTestData(mockFactory).clickhouseTestConnection; + const testTableCreationResult = await createTestTable(connectionToClickhouseDBInDocker); + testTableName = testTableCreationResult.testTableName; + testTableColumnName = testTableCreationResult.testTableColumnName; + testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; + testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; }); currentTest = 'GET /connection/tables/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - - .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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${emptyConnectionId}`) + .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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 = '5'; - - 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, 3); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createTableSettingsResponse.status, 201); + + const searchedDescription = '5'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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, 3); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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, '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, '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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - 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, '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, '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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 'integer'); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, 'integer'); + + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 'integer'); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, 'integer'); + + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, 6); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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'); - - 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].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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldvalue}`, + ) + .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].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; + } + }, ); // 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 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, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 filters = { + [fieldname]: { lt: fieldvalue }, + }; + + const getTableRowsResponse = await request(app.getHttpServer()) + .post( + `/table/rows/find/${createdConnectionId}?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].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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, 6); + + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 6); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, 6); + + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 emptyConnectionId = ''; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${emptyConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createdConnectionId}&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 fakeConnectionId = faker.string.uuid(); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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'); - - const { message } = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 400); - t.is(message, Messages.TABLE_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createdConnectionId}&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/${createdConnectionId}?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'); + + const { message } = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 400); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createdConnectionId}&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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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: 43, - [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); - console.log('🚀 ~ test.serial ~ getLogsRO:', getLogsRO.logs[1].affected_primary_key); - 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + id: 43, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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); + const addedRow = rows.find((r) => r.id === 43); + t.truthy(addedRow, 'Added row with id=43 should exist'); + t.is(addedRow[testTableColumnName], row[testTableColumnName]); + t.is(addedRow[testTableSecondColumnName], row[testTableSecondColumnName]); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); -test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const row = { + id: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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); - testTables.push(testTableName); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - 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(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); + 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 addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(message, Messages.PARAMETER_MISSING); + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); - //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); + t.is(message, Messages.PARAMETER_MISSING); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + 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 getTableRowsRO = JSON.parse(getTableRowsResponse.text); - const { rows, primaryColumns, pagination } = getTableRowsRO; + t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); + t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); + t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); - t.is(rows.length, 42); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - - const { message } = JSON.parse(addRowInTableResponse.text); - console.log('🚀 ~ test.serial ~ message:', message); - 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 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/${createdConnectionId}?tableName=${fakeTableName}`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const { message } = JSON.parse(addRowInTableResponse.text); + console.log('🚀 ~ test.serial ~ message:', message); + 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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 { message } = JSON.parse(updateRowInTableResponse.text); - console.log('🚀 ~ message:', message); - t.is(message, 'Failed to update row in table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + 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/${createdConnectionId}?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 { message } = JSON.parse(updateRowInTableResponse.text); + console.log('🚀 ~ message:', message); + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 requestData = { - primaryKeys: [{ id: 1 }, { id: 2 }], - 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=1`) - .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=2`) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const requestData = { + primaryKeys: [{ id: 1 }, { id: 2 }], + newValues: { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/update/${createdConnectionId}?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/${createdConnectionId}?tableName=${testTableName}&id=1`) + .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/${createdConnectionId}?tableName=${testTableName}&id=2`) + .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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, 6); + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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, 6); }); test.serial(`${currentTest} should throw an exception, when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - - const FoundRowRO = JSON.parse(foundRowInTableResponse.text); - console.log('🚀 ~ test.serial ~ FoundRowRO:', FoundRowRO); - t.is(foundRowInTableResponse.status, 400); - t.is(FoundRowRO.message, Messages.TABLE_NOT_FOUND); + const idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${fakeTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const FoundRowRO = JSON.parse(foundRowInTableResponse.text); + console.log('🚀 ~ test.serial ~ FoundRowRO:', FoundRowRO); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, 500); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(foundRowInTableResponse.status, 500); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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 primaryKeysForDeletion: Array> = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + 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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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: 1, - }, - { - id: 10, - }, - { - id: 32, - }, - ]; - 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, - ); - } - - // 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 primaryKeysForDeletion = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}`) + .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.true(deleteRowsLogs.length >= primaryKeysForDeletion.length); }); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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.log(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 getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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.log(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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + false, + false, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createdConnectionId}&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/${createdConnectionId}?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).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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); - - 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, 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); - const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); - t.is(addedRows.length, 2); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + 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/${createdConnectionId}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + t.is(importCsvResponse.status, 201); + + //checking that the lines was added + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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); + const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); + t.is(addedRows.length, 2); }); test.serial(`${currentTest} should throw exception whe csv import is disabled`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseAgentTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + false, + true, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createdConnectionId}&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/${createdConnectionId}?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); + + 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/${createdConnectionId}?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/saas-tests/table-clickhouse-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts index 12aaa7fc5..b33437689 100644 --- a/backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts @@ -39,4218 +39,4217 @@ const testTables: Array = []; let currentTest; test.before(async () => { - 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); + 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); }); 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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 = '5'; - - 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, 3); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - 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).clickhouseTestConnection; + 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 = '5'; + + 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, 3); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + 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).clickhouseTestConnection; - 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, '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).clickhouseTestConnection; + 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, '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).clickhouseTestConnection; - 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); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - 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, '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).clickhouseTestConnection; + 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, '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).clickhouseTestConnection; - 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, 'integer'); - - 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).clickhouseTestConnection; + 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, 'integer'); + + 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).clickhouseTestConnection; - 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, 'integer'); - - 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).clickhouseTestConnection; + 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, 'integer'); + + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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, 6); - 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).clickhouseTestConnection; + 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, 6); + 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).clickhouseTestConnection; - 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, 6); - 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).clickhouseTestConnection; + 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, 6); + 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).clickhouseTestConnection; - 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, 6); - 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).clickhouseTestConnection; + 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, 6); + 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).clickhouseTestConnection; - 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, 6); - 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).clickhouseTestConnection; + 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, 6); + 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).clickhouseTestConnection; - 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, 6); - 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).clickhouseTestConnection; + 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, 6); + 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).clickhouseTestConnection; - 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, 6); - 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).clickhouseTestConnection; + 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, 6); + 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).clickhouseTestConnection; - 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, 6); - 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).clickhouseTestConnection; + 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, 6); + 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).clickhouseTestConnection; - 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, 6); - 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).clickhouseTestConnection; + 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, 6); + 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).clickhouseTestConnection; - 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'); - - 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].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).clickhouseTestConnection; + 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'); + + 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].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; + } + }, ); // 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).clickhouseTestConnection; - 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 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, 2); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - - 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).clickhouseTestConnection; + 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 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, 2); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + + 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).clickhouseTestConnection; - 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, 6); - - 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).clickhouseTestConnection; + 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, 6); + + 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).clickhouseTestConnection; - 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, 6); - - 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).clickhouseTestConnection; + 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, 6); + + 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).clickhouseTestConnection; - 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, 6); - - 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).clickhouseTestConnection; + 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, 6); + + 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).clickhouseTestConnection; - 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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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).clickhouseTestConnection; + 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 createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${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).clickhouseTestConnection; - 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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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).clickhouseTestConnection; + 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 createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${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).clickhouseTestConnection; - 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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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'); - - const { message } = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 400); - t.is(message, Messages.TABLE_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; + 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 createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${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'); + + const { message } = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 400); + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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: 43, - [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); - console.log('🚀 ~ test.serial ~ getLogsRO:', getLogsRO.logs[1].affected_primary_key); - 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).clickhouseTestConnection; + 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: 43, + [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); + console.log('🚀 ~ test.serial ~ getLogsRO:', getLogsRO.logs[1].affected_primary_key); + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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'); - - const { message } = JSON.parse(addRowInTableResponse.text); - console.log('🚀 ~ test.serial ~ message:', message); - 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).clickhouseTestConnection; + 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'); + + const { message } = JSON.parse(addRowInTableResponse.text); + console.log('🚀 ~ test.serial ~ message:', message); + 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).clickhouseTestConnection; - 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'); - - 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 connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; + 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'); + + 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 connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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 = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; - 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 requestData = { - primaryKeys: [{ id: 1 }, { id: 2 }], - 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=1`) - .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=2`) - .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).clickhouseTestConnection; + 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 requestData = { + primaryKeys: [{ id: 1 }, { id: 2 }], + 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=1`) + .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=2`) + .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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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, 6); + const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; + 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, 6); }); test.serial(`${currentTest} should throw an exception, when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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'); - - const FoundRowRO = JSON.parse(foundRowInTableResponse.text); - console.log('🚀 ~ test.serial ~ FoundRowRO:', FoundRowRO); - t.is(foundRowInTableResponse.status, 400); - t.is(FoundRowRO.message, Messages.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; + 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'); + + const FoundRowRO = JSON.parse(foundRowInTableResponse.text); + console.log('🚀 ~ test.serial ~ FoundRowRO:', FoundRowRO); + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - 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 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).clickhouseTestConnection; + 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 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).clickhouseTestConnection; - 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 = [ - { - id: 1, - }, - { - id: 10, - }, - { - id: 32, - }, - ]; - 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, - ); - } - - // 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).clickhouseTestConnection; + 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 = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + 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, + ); + } + + // 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); }); test.serial(`${currentTest} should test connection and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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).clickhouseTestConnection; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - connectionToTestDB.password = '8764323452888'; - 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).clickhouseTestConnection; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + connectionToTestDB.password = '8764323452888'; + 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).clickhouseTestConnection; - 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.log(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).clickhouseTestConnection; + 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.log(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).clickhouseTestConnection; - 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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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).clickhouseTestConnection; + 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 createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${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).clickhouseTestConnection; - 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).clickhouseTestConnection; + 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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; - 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); - - 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, 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); - const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); - t.is(addedRows.length, 2); + const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; + 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); + + 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, 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); + const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); + t.is(addedRows.length, 2); }); test.serial(`${currentTest} should throw exception whe csv import is disabled`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).clickhouseTestConnection; - 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 createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${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); - - 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).clickhouseTestConnection; + 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 createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${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); + + 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/saas-tests/table-ibmdb2-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts index 8a63c9c15..809247e41 100644 --- a/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts @@ -39,3249 +39,2708 @@ const _testTables: Array = []; let currentTest; let connectionToTestDB: any; let firstUserToken: string; +let createdConnectionId: string; let testTableName: string; let testTableColumnName: string; let testTableSecondColumnName: string; let testEntitiesSeedsCount: number; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); - - firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - connectionToTestDB = getTestData(mockFactory).connectionToAgentIbmDB2; - const _createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - await testUtils.sleep(2000); - - // const connectionToIbmDb2 = getTestData(mockFactory).connectionToIbmDb2; - // const testTableCreationResult = await createTestTable(connectionToIbmDb2); - // testTableName = testTableCreationResult.testTableName; - // testTableColumnName = testTableCreationResult.testTableColumnName; - // testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; - // testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; + 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); + + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + connectionToTestDB = getTestData(mockFactory).connectionToAgentIbmDB2; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; + await testUtils.sleep(); + + // const connectionToIbmDb2 = getTestData(mockFactory).connectionToIbmDb2; + // const testTableCreationResult = await createTestTable(connectionToIbmDb2); + // testTableName = testTableCreationResult.testTableName; + // testTableColumnName = testTableCreationResult.testTableColumnName; + // testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; + // testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; }); test.beforeEach(async () => { - const connectionToIbmDb2 = getTestData(mockFactory).connectionToIbmDb2; - const testTableCreationResult = await createTestTable(connectionToIbmDb2); - testTableName = testTableCreationResult.testTableName; - testTableColumnName = testTableCreationResult.testTableColumnName; - testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; - testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; + const connectionToIbmDb2 = getTestData(mockFactory).connectionToIbmDb2; + const testTableCreationResult = await createTestTable(connectionToIbmDb2); + testTableName = testTableCreationResult.testTableName; + testTableColumnName = testTableCreationResult.testTableColumnName; + testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; + testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; }); 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(getTablesResponse.status, 200); - 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTablesRO = JSON.parse(getTablesResponse.text); + + t.is(getTablesResponse.status, 200); + 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${emptyConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 emptyConnectionId = ''; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${emptyConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 fakeConnectionId = faker.string.uuid(); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 403); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 400); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 404); }); test.serial(`${currentTest} should throw an exception whe connection id passed in request id incorrect`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - createConnectionRO.id = faker.string.uuid(); - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 403); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); + const fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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); + const addedRow = rows.find((r) => r.ID === 43); + t.truthy(addedRow, 'Added row with ID=43 should exist'); + t.is(addedRow[testTableColumnName], row[testTableColumnName]); + t.is(addedRow[testTableSecondColumnName], row[testTableSecondColumnName]); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - - const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - const { message } = updateRowInTableRO; - t.is(message, 'Failed to update row in table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + 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/${createdConnectionId}?tableName=${testTableName}&ID=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const updateRowInTableRO = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + const { message } = updateRowInTableRO; + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, ); currentTest = 'DELETE /table/row/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const idForDeletion = 1; - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&ID=${idForDeletion}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - console.log('🚀 ~ test ~ deleteRowInTableRO:', deleteRowInTableRO); - - t.is(deleteRowInTableResponse.status, 200); - - 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 idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&ID=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + console.log('🚀 ~ test ~ deleteRowInTableRO:', deleteRowInTableRO); + + t.is(deleteRowInTableResponse.status, 200); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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.message, 'Failed to delete row from table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&ID=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const idForSearch = 1; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&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 idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, 500); - const { message } = JSON.parse(foundRowInTableResponse.text); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&ID=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(foundRowInTableResponse.status, 500); + const { message } = JSON.parse(foundRowInTableResponse.text); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const 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 primaryKeysForDeletion: Array> = [ + { + ID: 1, + }, + { + ID: 10, + }, + { + ID: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); // currentTest = 'POST /connection/test/'; @@ -3301,218 +2760,191 @@ test.serial(`${currentTest} should delete row in table and return result`, async currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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 getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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); - - function deleteIdColumnsInCSVFile(filePatch: string) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - const fileContent = fs.readFileSync(filePatch).toString(); - const rows = fileContent.split('\n'); - const idColumnIndex = rows[0].split(',').indexOf('ID'); - const newRows = rows.map((row) => { - const columns = row.split(','); - if (columns.length === 1) { - return row; - } - if (idColumnIndex >= 0) { - columns.splice(idColumnIndex, 1); - } - return columns.join(','); - }); - return newRows.join('\n'); - } - - const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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, 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); - const addedRows = getTableRowsRO.rows.filter((row: Record) => row.ID > testEntitiesSeedsCount); - t.is(addedRows.length, 2); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + function deleteIdColumnsInCSVFile(filePatch: string) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const fileContent = fs.readFileSync(filePatch).toString(); + const rows = fileContent.split('\n'); + const idColumnIndex = rows[0].split(',').indexOf('ID'); + const newRows = rows.map((row) => { + const columns = row.split(','); + if (columns.length === 1) { + return row; + } + if (idColumnIndex >= 0) { + columns.splice(idColumnIndex, 1); + } + return columns.join(','); + }); + return newRows.join('\n'); + } + + const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createdConnectionId}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + t.is(importCsvResponse.status, 201); + //checking that the lines was added + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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); + const addedRows = getTableRowsRO.rows.filter((row: Record) => row.ID > testEntitiesSeedsCount); + t.is(addedRows.length, 2); }); diff --git a/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts index 19849739b..cb3ae234c 100644 --- a/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts @@ -38,6 +38,7 @@ const testSearchedUserName = 'Vasia'; let currentTest: string; let connectionToTestDB: any; let firstUserToken: string; +let createdConnectionId: string; let testTableName: string; let testTableColumnName: string; let testTableSecondColumnName: string; @@ -45,3534 +46,2961 @@ let testEntitiesSeedsCount: number; let insertedSearchedIds: Array<{ _id?: string; number: number }>; test.before(async () => { - 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); - - firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - connectionToTestDB = getTestData(mockFactory).mongoDbAgentConnection; - const _createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - await testUtils.sleep(2000); + 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); + + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + connectionToTestDB = getTestData(mockFactory).mongoDbAgentConnection; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; + await testUtils.sleep(); }); 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.beforeEach(async () => { - const connectionToMongoDBInDocker = getTestData(mockFactory).mongoDbConnection; - const testTableCreationResult = await createTestTable(connectionToMongoDBInDocker); - testTableName = testTableCreationResult.testTableName; - testTableColumnName = testTableCreationResult.testTableColumnName; - testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; - testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; - insertedSearchedIds = testTableCreationResult.insertedSearchedIds; + const connectionToMongoDBInDocker = getTestData(mockFactory).mongoDbConnection; + const testTableCreationResult = await createTestTable(connectionToMongoDBInDocker); + testTableName = testTableCreationResult.testTableName; + testTableColumnName = testTableCreationResult.testTableColumnName; + testTableSecondColumnName = testTableCreationResult.testTableSecondColumnName; + testEntitiesSeedsCount = testTableCreationResult.testEntitiesSeedsCount; + insertedSearchedIds = testTableCreationResult.insertedSearchedIds; }); currentTest = 'GET /connection/tables/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${emptyConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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()) - .post(`/table/rows/find/${createConnectionRO.id}?tableName=${testTableName}&search=${searchedDescription}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 201); - t.is(typeof getTableRowsRO, 'object'); - t.is(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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createTableSettingsResponse.status, 201); + + const searchedDescription = insertedSearchedIds.find((id) => id.number === 5)._id; + + const getTableRowsResponse = await request(app.getHttpServer()) + .post(`/table/rows/find/${createdConnectionId}?tableName=${testTableName}&search=${searchedDescription}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 201); + t.is(typeof getTableRowsRO, 'object'); + t.is(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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', '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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 emptyConnectionId = ''; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${emptyConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 fakeConnectionId = faker.string.uuid(); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 403); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 400); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableStructure.status, 404); }); test.serial(`${currentTest} should throw an exception whe connection id passed in request id incorrect`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - createConnectionRO.id = faker.string.uuid(); - const getTableStructure = await request(app.getHttpServer()) - .get(`/table/structure/${createConnectionRO.id}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableStructure.status, 403); - const { message } = JSON.parse(getTableStructure.text); - t.is(message, Messages.DONT_HAVE_PERMISSIONS); + const fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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); + const addedRow = rows.find( + (r) => + r[testTableColumnName] === row[testTableColumnName] && + r[testTableSecondColumnName] === row[testTableSecondColumnName], + ); + t.truthy(addedRow, 'Added row should exist'); + t.is(addedRow[testTableColumnName], row[testTableColumnName]); + t.is(addedRow[testTableSecondColumnName], row[testTableSecondColumnName]); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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=6606c97e2fff2ec599cc7bca`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 500); - const responseObject = JSON.parse(updateRowInTableResponse.text); - t.is(responseObject.originalMessage, `No data returned from agent`); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + 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/${createdConnectionId}?tableName=${testTableName}&_id=6606c97e2fff2ec599cc7bca`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 500); + const responseObject = JSON.parse(updateRowInTableResponse.text); + t.is(responseObject.originalMessage, `No data returned from agent`); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const 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 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/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0]._id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0]._id; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0]._id; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0]._id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForDeletion = insertedSearchedIds[0]._id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const deleteRowInTableResponse = await request(app.getHttpServer()) - .delete(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_id=6606c97e2fff2ec599cc7bca`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 500); - t.is(deleteRowInTableRO.originalMessage, `No data returned from agent`); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&_id=6606c97e2fff2ec599cc7bca`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.originalMessage, `No data returned from agent`); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const idForSearch = insertedSearchedIds[0]._id; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&_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 idForSearch = insertedSearchedIds[0]._id; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 idForSearch = insertedSearchedIds[0]._id; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, 500); - const findRowResponse = JSON.parse(foundRowInTableResponse.text); - t.is(findRowResponse.message, `Failed to get row by primary key. No data returned from agent`); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const idForSearch = '6604197dab8d910eb77783f9'; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&_id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(foundRowInTableResponse.status, 500); + const findRowResponse = JSON.parse(foundRowInTableResponse.text); + t.is(findRowResponse.message, `Failed to get row by primary key. No data returned from agent`); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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 primaryKeysForDeletion: Array> = [ + { + _id: insertedSearchedIds[0]._id, + }, + { + _id: insertedSearchedIds[9]._id, + }, + { + _id: insertedSearchedIds[31]._id, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 primaryKeysForDeletion = [ + { + _id: insertedSearchedIds[0]._id, + }, + { + _id: insertedSearchedIds[9]._id, + }, + { + _id: insertedSearchedIds[31]._id, + }, + ]; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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.skip(`${currentTest} should test connection and return result`, async (t) => { - 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 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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); - - function deleteIdColumnsInCSVFile(filePatch: string) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - const fileContent = fs.readFileSync(filePatch).toString(); - const rows = fileContent.split('\n'); - const idColumnIndex = rows[0].split(',').indexOf('_id'); - const newRows = rows.map((row) => { - const columns = row.split(','); - if (columns.length === 1) { - return row; - } - if (idColumnIndex >= 0) { - columns.splice(idColumnIndex, 1); - } - return columns.join(','); - }); - return newRows.join('\n'); - } - - const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + function deleteIdColumnsInCSVFile(filePatch: string) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const fileContent = fs.readFileSync(filePatch).toString(); + const rows = fileContent.split('\n'); + const idColumnIndex = rows[0].split(',').indexOf('_id'); + const newRows = rows.map((row) => { + const columns = row.split(','); + if (columns.length === 1) { + return row; + } + if (idColumnIndex >= 0) { + columns.splice(idColumnIndex, 1); + } + return columns.join(','); + }); + return newRows.join('\n'); + } + + const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createdConnectionId}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + t.is(importCsvResponse.status, 201); + + //checking that the lines was added + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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); }); diff --git a/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts index 2046f7130..30619f2b2 100644 --- a/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts @@ -42,6 +42,7 @@ const testTables: Array = []; let currentTest; const testEntitiesSeedsCount = 42; let firstUserToken: string; +let createdConnectionId: string; let connectionToTestDB: any; let testTableName = getRandomTestTableName(); let testTableColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; @@ -49,3554 +50,2982 @@ let testTableSecondColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)} const _pColumnName = 'id'; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - testUtils = moduleFixture.get(TestUtils); - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); - firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - connectionToTestDB = getTestData(mockFactory).mssqlAgentConnection; - const _createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - await testUtils.sleep(); + 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); + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + connectionToTestDB = getTestData(mockFactory).mssqlAgentConnection; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; + await testUtils.sleep(); }); 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('should run', (t) => { - t.pass(); + t.pass(); }); test.beforeEach('restDatabase', async (_t) => { - const host = 'mssql-e2e-testing'; - const port = 1433; - const Knex = knex({ - client: 'mssql', - connection: { - user: 'sa', - database: 'TempDB', - password: 'yNuXf@6T#BgoQ%U6knMp', - port: port, - host: host, - }, - }); - - await Knex.schema.dropTableIfExists(testTableName); - await Knex.schema.createTable(testTableName, (table) => { - table.increments(); - table.string(testTableColumnName); - table.string(testTableSecondColumnName); - table.timestamps(); - }); - // const primaryKeyConstraintName ='id'; - // await Knex.schema.alterTable(testTableName, function (t) { - // t.primary([pColumnName], primaryKeyConstraintName); - // }); - // let counter = 0; - for (let i = 0; i < testEntitiesSeedsCount; i++) { - if (i === 0 || i === testEntitiesSeedsCount - 21 || i === testEntitiesSeedsCount - 5) { - await Knex(testTableName).insert({ - // [pColumnName]: ++counter, - [testTableColumnName]: testSearchedUserName, - [testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } else { - await Knex(testTableName).insert({ - // [pColumnName]: ++counter, - [testTableColumnName]: faker.person.firstName(), - [testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } - } - - await Knex.destroy(); + const host = 'mssql-e2e-testing'; + const port = 1433; + const Knex = knex({ + client: 'mssql', + connection: { + user: 'sa', + database: 'TempDB', + password: 'yNuXf@6T#BgoQ%U6knMp', + port: port, + host: host, + }, + }); + + await Knex.schema.dropTableIfExists(testTableName); + await Knex.schema.createTable(testTableName, (table) => { + table.increments(); + table.string(testTableColumnName); + table.string(testTableSecondColumnName); + table.timestamps(); + }); + // const primaryKeyConstraintName ='id'; + // await Knex.schema.alterTable(testTableName, function (t) { + // t.primary([pColumnName], primaryKeyConstraintName); + // }); + // let counter = 0; + for (let i = 0; i < testEntitiesSeedsCount; i++) { + if (i === 0 || i === testEntitiesSeedsCount - 21 || i === testEntitiesSeedsCount - 5) { + await Knex(testTableName).insert({ + // [pColumnName]: ++counter, + [testTableColumnName]: testSearchedUserName, + [testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } else { + await Knex(testTableName).insert({ + // [pColumnName]: ++counter, + [testTableColumnName]: faker.person.firstName(), + [testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } + } + + await Knex.destroy(); }); test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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(getTablesResponse.status, 200); - - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => { - return 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTablesRO = JSON.parse(getTablesResponse.text); + t.is(getTablesResponse.status, 200); + + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => { + return 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${emptyConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return rows of selected table with search and without pagination`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return page of all rows with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 21); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return page of all rows with pagination page=3, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 3); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, without sorting + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${currentTest} without search and with pagination and with sorting should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 emptyConnectionId = ''; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${emptyConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 fakeConnectionId = faker.string.uuid(); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 403); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 400); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(element.hasOwnProperty('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); - } + testTables.push(testTableName); + + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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(element.hasOwnProperty('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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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); + testTables.push(testTableName); + + const emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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); + testTables.push(testTableName); + + const fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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); + const addedRow = rows.find((r) => r.id === 43); + t.truthy(addedRow, 'Added row with id=43 should exist'); + t.is(addedRow[testTableColumnName], row[testTableColumnName]); + t.is(addedRow[testTableSecondColumnName], row[testTableSecondColumnName]); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + testTables.push(testTableName); - 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'); + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); - t.is(message, Messages.PARAMETER_MISSING); + 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); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + 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 { rows, primaryColumns, pagination } = getTableRowsRO; - t.is(rows.length, 42); + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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]); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(message, 'Failed to update row in table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); + + 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/${createdConnectionId}?tableName=${testTableName}&id=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const requestData = { - primaryKeys: [{ id: 1 }, { id: 2 }], - 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=1`) - .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=2`) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const requestData = { + primaryKeys: [{ id: 1 }, { id: 2 }], + newValues: { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/update/${createdConnectionId}?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/${createdConnectionId}?tableName=${testTableName}&id=1`) + .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/${createdConnectionId}?tableName=${testTableName}&id=2`) + .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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 200); - - 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); + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 200); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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.message, 'Failed to delete row from table. No data returned from agent'); - t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); + + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForSearch = 1; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const idForSearch = 1000000; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); - t.is(foundRowInTableResponse.status, 500); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); - t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + testTables.push(testTableName); + + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); + t.is(foundRowInTableResponse.status, 500); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete rows in table and return result`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const 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); - } + testTables.push(testTableName); + + const primaryKeysForDeletion: Array> = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - - 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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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'); + + const getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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); }); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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); - - function deleteIdColumnsInCSVFile(filePatch: string) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - const fileContent = fs.readFileSync(filePatch).toString(); - const rows = fileContent.split('\n'); - const newRows = rows.map((row) => { - const columns = row.split(','); - if (columns.length === 1) { - return row; - } - columns.shift(); - return columns.join(','); - }); - return newRows.join('\n'); - } - - const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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, 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); - const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); - t.is(addedRows.length, 2); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + function deleteIdColumnsInCSVFile(filePatch: string) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const fileContent = fs.readFileSync(filePatch).toString(); + const rows = fileContent.split('\n'); + const newRows = rows.map((row) => { + const columns = row.split(','); + if (columns.length === 1) { + return row; + } + columns.shift(); + return columns.join(','); + }); + return newRows.join('\n'); + } + + const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createdConnectionId}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + t.is(importCsvResponse.status, 201); + + //checking that the lines was added + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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); + const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); + t.is(addedRows.length, 2); }); diff --git a/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts index d2f132b9d..d0c102f31 100644 --- a/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts @@ -42,6 +42,7 @@ const testTables: Array = []; let currentTest; const testEntitiesSeedsCount = 42; let firstUserToken: string; +let createdConnectionId: string; let connectionToTestDB: any; let testTableName = getRandomTestTableName(); let testTableColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; @@ -49,3560 +50,2988 @@ let testTableSecondColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)} const pColumnName = 'id'; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - testUtils = moduleFixture.get(TestUtils); - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); - firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - connectionToTestDB = getTestData(mockFactory).mysqlAgentConnection; - const _createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - await testUtils.sleep(); + 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); + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + connectionToTestDB = getTestData(mockFactory).mysqlAgentConnection; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; + await testUtils.sleep(); }); 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.beforeEach('restDatabase', async (_t) => { - const host = 'testMySQL-e2e-testing'; - const port = 3306; - const Knex = knex({ - client: 'mysql2', - connection: { - user: 'root', - database: 'testDB', - password: '123', - port: port, - host: host, - }, - }); - - await Knex.schema.dropTableIfExists(testTableName); - await Knex.schema.createTable(testTableName, (table) => { - table.integer(pColumnName); - table.string(testTableColumnName); - table.string(testTableSecondColumnName); - table.timestamps(); - }); - const primaryKeyConstraintName = getRandomConstraintName(); - await Knex.schema.alterTable(testTableName, (t) => { - t.primary([pColumnName], primaryKeyConstraintName); - }); - let counter = 0; - for (let i = 0; i < testEntitiesSeedsCount; i++) { - if (i === 0 || i === testEntitiesSeedsCount - 21 || i === testEntitiesSeedsCount - 5) { - await Knex(testTableName).insert({ - [pColumnName]: ++counter, - [testTableColumnName]: testSearchedUserName, - [testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } else { - await Knex(testTableName).insert({ - [pColumnName]: ++counter, - [testTableColumnName]: faker.person.firstName(), - [testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } - } - - await Knex.destroy(); + const host = 'testMySQL-e2e-testing'; + const port = 3306; + const Knex = knex({ + client: 'mysql2', + connection: { + user: 'root', + database: 'testDB', + password: '123', + port: port, + host: host, + }, + }); + + await Knex.schema.dropTableIfExists(testTableName); + await Knex.schema.createTable(testTableName, (table) => { + table.integer(pColumnName); + table.string(testTableColumnName); + table.string(testTableSecondColumnName); + table.timestamps(); + }); + const primaryKeyConstraintName = getRandomConstraintName(); + await Knex.schema.alterTable(testTableName, (t) => { + t.primary([pColumnName], primaryKeyConstraintName); + }); + let counter = 0; + for (let i = 0; i < testEntitiesSeedsCount; i++) { + if (i === 0 || i === testEntitiesSeedsCount - 21 || i === testEntitiesSeedsCount - 5) { + await Knex(testTableName).insert({ + [pColumnName]: ++counter, + [testTableColumnName]: testSearchedUserName, + [testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } else { + await Knex(testTableName).insert({ + [pColumnName]: ++counter, + [testTableColumnName]: faker.person.firstName(), + [testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } + } + + await Knex.destroy(); }); test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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(getTablesResponse.status, 200); - - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => { - return 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTablesRO = JSON.parse(getTablesResponse.text); + t.is(getTablesResponse.status, 200); + + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => { + return 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${emptyConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return rows of selected table with search and without pagination`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return page of all rows with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 21); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return page of all rows with pagination page=3, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 3); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, without sorting + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${currentTest} without search and with pagination and with sorting should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 emptyConnectionId = ''; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${emptyConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 fakeConnectionId = faker.string.uuid(); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 403); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 400); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(element.hasOwnProperty('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); - } + testTables.push(testTableName); + + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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(element.hasOwnProperty('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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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); + testTables.push(testTableName); + + const emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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); + testTables.push(testTableName); + + const fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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: 43, - [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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + id: 43, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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); + const addedRow = rows.find((r) => r.id === 43); + t.truthy(addedRow, 'Added row with id=43 should exist'); + t.is(addedRow[testTableColumnName], row[testTableColumnName]); + t.is(addedRow[testTableSecondColumnName], row[testTableSecondColumnName]); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - 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(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); + t.is(message, Messages.PARAMETER_MISSING); - t.is(message, Messages.PARAMETER_MISSING); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - //checking that the line wasn't 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); - 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); - 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 { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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]); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - t.is(message, 'Failed to update row in table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); + + 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/${createdConnectionId}?tableName=${testTableName}&id=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const requestData = { - primaryKeys: [{ id: 1 }, { id: 2 }], - 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=1`) - .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=2`) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const requestData = { + primaryKeys: [{ id: 1 }, { id: 2 }], + newValues: { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/update/${createdConnectionId}?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/${createdConnectionId}?tableName=${testTableName}&id=1`) + .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/${createdConnectionId}?tableName=${testTableName}&id=2`) + .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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 200); - - 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); + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 200); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); + + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForSearch = 1; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const idForSearch = 1000000; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); - t.is(foundRowInTableResponse.status, 500); - // const {message} = JSON.parse(foundRowInTableResponse.text); - t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + testTables.push(testTableName); + + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); + t.is(foundRowInTableResponse.status, 500); + // const {message} = JSON.parse(foundRowInTableResponse.text); + t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete rows in table and return result`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const 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); - } + testTables.push(testTableName); + + const primaryKeysForDeletion: Array> = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - - 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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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'); + + const getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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); }); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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); - - function changeIdFieldsValuesInCsvFile(filePatch: string) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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); - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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 _importCsvResponseRO = 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); - const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); - t.is(addedRows.length, 2); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + function changeIdFieldsValuesInCsvFile(filePatch: string) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + 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); + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createdConnectionId}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + const _importCsvResponseRO = JSON.parse(importCsvResponse.text); + t.is(importCsvResponse.status, 201); + + //checking that the lines was added + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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); + const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); + t.is(addedRows.length, 2); }); diff --git a/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts index a59e0b0a4..02194613e 100644 --- a/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts @@ -42,6 +42,7 @@ const testTables: Array = []; let currentTest; const testEntitiesSeedsCount = 42; let firstUserToken: string; +let createdConnectionId: string; let connectionToTestDB: any; let testTableName = getRandomTestTableName(); let testTableColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; @@ -49,3559 +50,2987 @@ let testTableSecondColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)} const pColumnName = 'id'; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - testUtils = moduleFixture.get(TestUtils); - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); - firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - connectionToTestDB = getTestData(mockFactory).oracleAgentConnection; - const _createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - await testUtils.sleep(); + 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); + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + connectionToTestDB = getTestData(mockFactory).oracleAgentConnection; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; + await testUtils.sleep(); }); 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.beforeEach('restDatabase', async (_t) => { - const host = 'test-oracle-e2e-testing'; - const port = 1521; - const sid = 'XE'; - const Knex = knex({ - client: 'oracledb', - connection: { - user: 'SYSTEM', - database: 'XEPDB1', - password: '12345', - connectString: `${host}:${port}/${sid ? sid : ''}`, - }, - }); - - await Knex.schema.dropTableIfExists(testTableName); - await Knex.schema.createTable(testTableName, (table) => { - table.integer(pColumnName); - table.string(testTableColumnName); - table.string(testTableSecondColumnName); - table.timestamps(); - }); - const primaryKeyConstraintName = getRandomConstraintName(); - await Knex.schema.alterTable(testTableName, (t) => { - t.primary([pColumnName], primaryKeyConstraintName); - }); - let counter = 0; - for (let i = 0; i < testEntitiesSeedsCount; i++) { - if (i === 0 || i === testEntitiesSeedsCount - 21 || i === testEntitiesSeedsCount - 5) { - await Knex(testTableName).insert({ - [pColumnName]: ++counter, - [testTableColumnName]: testSearchedUserName, - [testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } else { - await Knex(testTableName).insert({ - [pColumnName]: ++counter, - [testTableColumnName]: faker.person.firstName(), - [testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } - } - - await Knex.destroy(); + const host = 'test-oracle-e2e-testing'; + const port = 1521; + const sid = 'XE'; + const Knex = knex({ + client: 'oracledb', + connection: { + user: 'SYSTEM', + database: 'XEPDB1', + password: '12345', + connectString: `${host}:${port}/${sid ? sid : ''}`, + }, + }); + + await Knex.schema.dropTableIfExists(testTableName); + await Knex.schema.createTable(testTableName, (table) => { + table.integer(pColumnName); + table.string(testTableColumnName); + table.string(testTableSecondColumnName); + table.timestamps(); + }); + const primaryKeyConstraintName = getRandomConstraintName(); + await Knex.schema.alterTable(testTableName, (t) => { + t.primary([pColumnName], primaryKeyConstraintName); + }); + let counter = 0; + for (let i = 0; i < testEntitiesSeedsCount; i++) { + if (i === 0 || i === testEntitiesSeedsCount - 21 || i === testEntitiesSeedsCount - 5) { + await Knex(testTableName).insert({ + [pColumnName]: ++counter, + [testTableColumnName]: testSearchedUserName, + [testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } else { + await Knex(testTableName).insert({ + [pColumnName]: ++counter, + [testTableColumnName]: faker.person.firstName(), + [testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } + } + + await Knex.destroy(); }); test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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(getTablesResponse.status, 200); - - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => { - return 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTablesRO = JSON.parse(getTablesResponse.text); + t.is(getTablesResponse.status, 200); + + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => { + return 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${emptyConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return rows of selected table with search and without pagination`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return page of all rows with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 21); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return page of all rows with pagination page=3, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 3); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, without sorting + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${currentTest} without search and with pagination and with sorting should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 emptyConnectionId = ''; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${emptyConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 fakeConnectionId = faker.string.uuid(); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 403); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 400); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(element.hasOwnProperty('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); - } + testTables.push(testTableName); + + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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(element.hasOwnProperty('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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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); + testTables.push(testTableName); + + const emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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); + testTables.push(testTableName); + + const fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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: 43, - [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, String(43)); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + id: 43, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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); + const addedRow = rows.find((r) => r.id === 43); + t.truthy(addedRow, 'Added row with id=43 should exist'); + t.is(addedRow[testTableColumnName], row[testTableColumnName]); + t.is(addedRow[testTableSecondColumnName], row[testTableSecondColumnName]); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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, String(43)); }); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - 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(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); + t.is(message, Messages.PARAMETER_MISSING); - t.is(message, Messages.PARAMETER_MISSING); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - //checking that the line wasn't 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); - 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); - 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 { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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]); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - t.is(message, 'Failed to update row in table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); + + 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/${createdConnectionId}?tableName=${testTableName}&id=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const requestData = { - primaryKeys: [{ id: 1 }, { id: 2 }], - 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=1`) - .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=2`) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const requestData = { + primaryKeys: [{ id: 1 }, { id: 2 }], + newValues: { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/update/${createdConnectionId}?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/${createdConnectionId}?tableName=${testTableName}&id=1`) + .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/${createdConnectionId}?tableName=${testTableName}&id=2`) + .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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 200); - - 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); + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 200); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); + + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForSearch = 1; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const idForSearch = 1000000; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); - t.is(foundRowInTableResponse.status, 500); - // const {message} = JSON.parse(foundRowInTableResponse.text); - t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + testTables.push(testTableName); + + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); + t.is(foundRowInTableResponse.status, 500); + // const {message} = JSON.parse(foundRowInTableResponse.text); + t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete rows in table and return result`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const 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); - } + testTables.push(testTableName); + + const primaryKeysForDeletion: Array> = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - - 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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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'); + + const getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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); }); currentTest = 'POST /table/csv/import/:slug'; test.skip(`${currentTest} should import csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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); - - function changeIdFieldsValuesInCsvFile(filePatch: string) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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); - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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, 201); - - //checking that the lines was added - - const getTableRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${createConnectionRO.id}?tableName=${testTableName}&page=1&perPage=70`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 200); - const addedRows = getTableRowsRO.rows.filter((row: Record) => row.ID > testEntitiesSeedsCount); - t.is(addedRows.length, 3); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + function changeIdFieldsValuesInCsvFile(filePatch: string) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + 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); + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createdConnectionId}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + t.is(importCsvResponse.status, 201); + + //checking that the lines was added + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=70`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 200); + const addedRows = getTableRowsRO.rows.filter((row: Record) => row.ID > testEntitiesSeedsCount); + t.is(addedRows.length, 3); }); diff --git a/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts index 2fb0c4da0..41ce3fbea 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts @@ -43,3564 +43,2995 @@ let currentTest; const testEntitiesSeedsCount = 42; let firstUserToken: string; let connectionToTestDB: any; +let createdConnectionId: string; let testTableName = getRandomTestTableName(); let testTableColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; let testTableSecondColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; const pColumnName = 'id'; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - testUtils = moduleFixture.get(TestUtils); - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); - firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - connectionToTestDB = getTestData(mockFactory).postgresAgentConnection; - const _createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - await testUtils.sleep(); + 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); + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + connectionToTestDB = getTestData(mockFactory).postgresAgentConnection; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; + await testUtils.sleep(); }); 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.beforeEach('restDatabase', async (_t) => { - const host = 'testPg-e2e-testing'; - const port = 5432; - const Knex = knex({ - client: 'postgres', - connection: { - user: 'postgres', - database: 'postgres', - password: '123', - port: port, - host: host, - }, - }); - - await Knex.schema.dropTableIfExists(testTableName); - await Knex.schema.createTable(testTableName, (table) => { - table.integer(pColumnName); - table.string(testTableColumnName); - table.string(testTableSecondColumnName); - table.timestamps(); - }); - const primaryKeyConstraintName = getRandomConstraintName(); - await Knex.schema.alterTable(testTableName, (t) => { - t.primary([pColumnName], primaryKeyConstraintName); - }); - let counter = 0; - for (let i = 0; i < testEntitiesSeedsCount; i++) { - if (i === 0 || i === testEntitiesSeedsCount - 21 || i === testEntitiesSeedsCount - 5) { - await Knex(testTableName).insert({ - [pColumnName]: ++counter, - [testTableColumnName]: testSearchedUserName, - [testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } else { - await Knex(testTableName).insert({ - [pColumnName]: ++counter, - [testTableColumnName]: faker.person.firstName(), - [testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } - } - - await Knex.destroy(); + const host = 'testPg-e2e-testing'; + const port = 5432; + const Knex = knex({ + client: 'postgres', + connection: { + user: 'postgres', + database: 'postgres', + password: '123', + port: port, + host: host, + }, + }); + + await Knex.schema.dropTableIfExists(testTableName); + await Knex.schema.createTable(testTableName, (table) => { + table.integer(pColumnName); + table.string(testTableColumnName); + table.string(testTableSecondColumnName); + table.timestamps(); + }); + const primaryKeyConstraintName = getRandomConstraintName(); + await Knex.schema.alterTable(testTableName, (t) => { + t.primary([pColumnName], primaryKeyConstraintName); + }); + let counter = 0; + for (let i = 0; i < testEntitiesSeedsCount; i++) { + if (i === 0 || i === testEntitiesSeedsCount - 21 || i === testEntitiesSeedsCount - 5) { + await Knex(testTableName).insert({ + [pColumnName]: ++counter, + [testTableColumnName]: testSearchedUserName, + [testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } else { + await Knex(testTableName).insert({ + [pColumnName]: ++counter, + [testTableColumnName]: faker.person.firstName(), + [testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } + } + + await Knex.destroy(); }); test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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(getTablesResponse.status, 200); - - t.is(typeof getTablesRO, 'object'); - t.is(getTablesRO.length > 0, true); - - const testTableIndex = getTablesRO.findIndex((t) => { - return 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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const getTablesRO = JSON.parse(getTablesResponse.text); + console.log('🚀 ~ getTablesRO:', getTablesRO); + console.log('🚀 ~ getTablesRO:', JSON.stringify(getTablesRO?.originalMessage)); + t.is(getTablesResponse.status, 200); + + t.is(typeof getTablesRO, 'object'); + t.is(getTablesRO.length > 0, true); + + const testTableIndex = getTablesRO.findIndex((t) => { + return 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return rows of selected table with search and without pagination`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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 = '5'; - - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(createTableSettingsResponse.status, 201); + + const searchedDescription = '5'; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return page of all rows with pagination page=1, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 21); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should return page of all rows with pagination page=3, perPage=2`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['id'], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - t.is(getTableRowsRO.pagination.total, 42); - t.is(getTableRowsRO.pagination.lastPage, 21); - t.is(getTableRowsRO.pagination.perPage, 2); - t.is(getTableRowsRO.pagination.currentPage, 3); - } catch (e) { - console.error(e); - throw e; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + t.is(getTableRowsRO.pagination.total, 42); + t.is(getTableRowsRO.pagination.lastPage, 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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, without sorting + `${currentTest} with search, with pagination, without sorting should return all found rows with pagination page=1 perPage=3`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); - // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); - - // t.is(getTableRowsRO.pagination.total, 42); - // t.is(getTableRowsRO.pagination.lastPage, 2); - // t.is(getTableRowsRO.pagination.perPage, 2); - // t.is(getTableRowsRO.pagination.currentPage, 1); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + t.is(getTableRowsRO.primaryColumns[0].column_name, 'id'); + // t.is(getTableRowsRO.primaryColumns[0].data_type, 'int'); + + // t.is(getTableRowsRO.pagination.total, 42); + // t.is(getTableRowsRO.pagination.lastPage, 2); + // t.is(getTableRowsRO.pagination.perPage, 2); + // t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by DESC`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and without pagination and with sorting + `${currentTest} without search and without pagination and with sorting should return all found rows with sorting ids by ASC`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} without search and with pagination and with sorting + `${currentTest} without search and with pagination and with sorting should return all found rows with sorting ports by DESC and with pagination page=1, perPage=2`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting ports by ASC and with pagination page=1, perPage=2`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} should return all found rows with sorting ports by DESC and with pagination page=2, perPage=3`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('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 createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=10 and DESC sorting and filtering'`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=2, perPage=2 and DESC sorting and filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial( - `${currentTest} with search, with pagination, with sorting and with filtering + `${currentTest} with search, with pagination, with sorting and with filtering should return all found rows with search, pagination: page=1, perPage=2 and DESC sorting and with multi filtering`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, ); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 emptyConnectionId = ''; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${emptyConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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 fakeConnectionId = faker.string.uuid(); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 403); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${fakeTableName}&search=${testSearchedUserName}&page=1&perPage=2&f_${fieldname}__lt=${fieldLtvalue}&f_${fieldname}__gt=${fieldGtvalue}`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 400); + + const { message } = JSON.parse(getTableRowsResponse.text); + + t.is(message, Messages.TABLE_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should return an array with searched fields when filtered name passed in request is incorrect`, - async (t) => { - try { - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - [testTableColumnName], - undefined, - undefined, - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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(element.hasOwnProperty('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); - } + testTables.push(testTableName); + + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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(element.hasOwnProperty('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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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); + testTables.push(testTableName); + + const emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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); + testTables.push(testTableName); + + const fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 not passed in request`, async (t) => { + testTables.push(testTableName); + + const tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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: 43, - [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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + id: 43, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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); + const addedRow = rows.find((r) => r.id === 43); + t.truthy(addedRow, 'Added row with id=43 should exist'); + t.is(addedRow[testTableColumnName], row[testTableColumnName]); + t.is(addedRow[testTableSecondColumnName], row[testTableSecondColumnName]); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); + testTables.push(testTableName); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - 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(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); + t.is(message, Messages.PARAMETER_MISSING); - t.is(message, Messages.PARAMETER_MISSING); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - //checking that the line wasn't 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); - 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); - 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 { rows, primaryColumns, pagination } = getTableRowsRO; - - t.is(rows.length, 42); + t.is(rows.length, 42); }); test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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]); + testTables.push(testTableName); + + 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/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - t.is(message, 'Failed to update row in table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); + + 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/${createdConnectionId}?tableName=${testTableName}&id=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const { message, originalMessage } = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + t.is(message, 'Failed to update row in table. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const fakeName = faker.person.firstName(); - const fakeMail = faker.internet.email(); - - const requestData = { - primaryKeys: [{ id: 1 }, { id: 2 }], - 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=1`) - .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=2`) - .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); + testTables.push(testTableName); + + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const requestData = { + primaryKeys: [{ id: 1 }, { id: 2 }], + newValues: { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/update/${createdConnectionId}?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/${createdConnectionId}?tableName=${testTableName}&id=1`) + .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/${createdConnectionId}?tableName=${testTableName}&id=2`) + .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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 200); - - 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); + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForDeletion}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 200); + + t.is(Object.hasOwn(deleteRowInTableRO, 'row'), true); + + //checking that the line was deleted + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + 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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForDeletion = 1; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + testTables.push(testTableName); + + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const 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); + testTables.push(testTableName); + + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForSearch = 1; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); + testTables.push(testTableName); + + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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) => { + testTables.push(testTableName); + + const idForSearch = 1; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const idForSearch = 1000000; - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); - t.is(foundRowInTableResponse.status, 500); - t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - t.is(message, 'Failed to get row by primary key. No data returned from agent'); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + testTables.push(testTableName); + + const idForSearch = 1000000; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&id=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const { message, originalMessage } = JSON.parse(foundRowInTableResponse.text); + t.is(foundRowInTableResponse.status, 500); + t.is(originalMessage, ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + t.is(message, 'Failed to get row by primary key. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete rows in table and return result`, async (t) => { - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const 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); - } + testTables.push(testTableName); + + const primaryKeysForDeletion: Array> = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.id === key.id) >= 0, true); + } }); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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'); - - 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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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'); + + const getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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); }); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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); - - function changeIdFieldsValuesInCsvFile(filePatch: string) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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); - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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, 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); - const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); - t.is(addedRows.length, 2); + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + function changeIdFieldsValuesInCsvFile(filePatch: string) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + 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); + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createdConnectionId}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + t.is(importCsvResponse.status, 201); + + //checking that the lines was added + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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); + const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); + t.is(addedRows.length, 2); }); diff --git a/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts index 131d9cd19..74a2ad9e7 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts @@ -41,4512 +41,4512 @@ const testTables: Array = []; let currentTest; test.before(async () => { - 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); + 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); }); 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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, 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).connectionToPostgres; + 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, 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 generated as identity primary key`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const testTableName = getRandomTestTableName().toLowerCase(); - const testTableColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; - const testTableSecondColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; - - const Knex = getTestKnex(connectionToTestDB); - - // await Knex.schema.dropTableIfExists(testTableName); - await Knex.schema.createTable(testTableName, (table) => { - table.integer('id').primary(); - table.string(testTableColumnName); - table.string(testTableSecondColumnName); - table.timestamps(); - }); - - await Knex.raw(`ALTER TABLE ${testTableName} ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY`); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - 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); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const testTableName = getRandomTestTableName().toLowerCase(); + const testTableColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; + const testTableSecondColumnName = `${faker.lorem.words(1)}_${faker.lorem.words(1)}`; + + const Knex = getTestKnex(connectionToTestDB); + + // await Knex.schema.dropTableIfExists(testTableName); + await Knex.schema.createTable(testTableName, (table) => { + table.integer('id').primary(); + table.string(testTableColumnName); + table.string(testTableSecondColumnName); + table.timestamps(); + }); + + await Knex.raw(`ALTER TABLE ${testTableName} ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY`); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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); + } 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).connectionToPostgres; - 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 = '5'; - - 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 connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + 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 = '5'; + + 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 connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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 createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - - 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'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - 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[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'); - - 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).connectionToPostgres; + 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 createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); + + 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'); + + 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[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'); + + 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).connectionToPostgres; - 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'); - - 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).connectionToPostgres; + 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'); + + t.is(getTableRowsRO.pagination.total, 3); + t.is(getTableRowsRO.pagination.lastPage, 2); + t.is(getTableRowsRO.pagination.perPage, 2); + t.is(getTableRowsRO.pagination.currentPage, 1); + } catch (e) { + console.error(e); + throw e; + } + }, ); -test.serial(`${currentTest} without search and without pagination and with sorting -should return all found rows with sorting ids by DESC`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - 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, - 20, - 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); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - t.is(getTableRowsResponse.status, 200); - - t.is(typeof getTableRowsRO, 'object'); - t.is(getTableRowsRO.hasOwnProperty('rows'), true); - t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); - t.is(getTableRowsRO.hasOwnProperty('pagination'), true); - t.is(getTableRowsRO.rows.length, 20); - 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[19].id, 23); - - t.is(typeof getTableRowsRO.primaryColumns, 'object'); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); - t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} without search and without pagination and with sorting +should return all found rows with sorting ids by DESC`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + 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, + 20, + 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(getTableRowsRO.hasOwnProperty('rows'), true); + t.is(getTableRowsRO.hasOwnProperty('primaryColumns'), true); + t.is(getTableRowsRO.hasOwnProperty('pagination'), true); + t.is(getTableRowsRO.rows.length, 20); + 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[19].id, 23); + + t.is(typeof getTableRowsRO.primaryColumns, 'object'); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('column_name'), true); + t.is(getTableRowsRO.primaryColumns[0].hasOwnProperty('data_type'), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} without search and without pagination and with sorting + `${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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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'); - - 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).connectionToPostgres; + 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'); + + 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; + } + }, ); // 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).connectionToPostgres; - 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 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, 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).connectionToPostgres; + 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 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, 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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'); - - const { message } = JSON.parse(getTableRowsResponse.text); - t.is(getTableRowsResponse.status, 400); - t.is(message, Messages.TABLE_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } + try { + const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + 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'); + + const { message } = JSON.parse(getTableRowsResponse.text); + t.is(getTableRowsResponse.status, 400); + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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]); - 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); - console.log('🚀 ~ test.serial ~ getLogsRO:', getLogsRO.logs[1].affected_primary_key); - 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).connectionToPostgres; + 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]); + 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); + console.log('🚀 ~ test.serial ~ getLogsRO:', getLogsRO.logs[1].affected_primary_key); + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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'); - - const { message } = JSON.parse(addRowInTableResponse.text); - console.log('🚀 ~ test.serial ~ message:', message); - 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).connectionToPostgres; + 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'); + + const { message } = JSON.parse(addRowInTableResponse.text); + console.log('🚀 ~ test.serial ~ message:', message); + 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).connectionToPostgres; - 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'); - - 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 connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + 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'); + + 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 update row in table and return result, when table has json field`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = - await createTestTable(connectionToTestDB, undefined, undefined, true); - - testTables.push(testTableName); - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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, - "json_field": [ - { - id: 'PgSAwanAwptE', - url: 'www.example.com', - name: 'test', - type: 'test type', - metadata: {}, - reference: null, - created_at: '2025-09-25T18:51:09.188Z', - updated_at: '2025-09-25T18:51:09.188Z', - description: 'some test field', - }, - ], - "jsonb_field": [ - { - id: 'PgSAwanAwptE', - url: 'www.example.com', - name: 'test', - type: 'test type', - metadata: {}, - reference: null, - created_at: '2025-09-25T18:51:09.188Z', - updated_at: '2025-09-25T18:51:09.188Z', - description: 'some test field', - }, - ], - }; - const rowToUpdate = JSON.stringify(row); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) - .send(rowToUpdate) - .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]); - - // add row with json field - const newRow = { - [testTableColumnName]: faker.person.firstName(), - [testTableSecondColumnName]: faker.internet.email(), - "json_field": { - id: 'newRowId', - url: 'www.newrow.com', - name: 'new row', - type: 'new type', - metadata: {}, - reference: null, - created_at: new Date().toISOString(), - updated_at: new Date().toISOString(), - description: 'new row description', - }, - }; - const addRowInTableResponse = await request(app.getHttpServer()) - .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) - .send(JSON.stringify(newRow)) - .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(typeof addRowInTableRO.row.json_field, 'object'); - - // update the added row - - const updatedNewRow = { - [testTableColumnName]: faker.person.firstName(), - [testTableSecondColumnName]: faker.internet.email(), - "json_field": [ - { - id: 'updatedNewRowId', - url: 'www.updatednewrow.com', - name: 'updated new row', - type: 'updated new type', - metadata: {}, - reference: null, - created_at: new Date().toISOString(), - updated_at: new Date().toISOString(), - description: 'updated new row description', - }, - ], - }; - - const updateNewRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${addRowInTableRO.row.id}`) - .send(updatedNewRow) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const updateNewRowInTableRO = JSON.parse(updateNewRowInTableResponse.text); - t.is(updateNewRowInTableResponse.status, 200); - t.is(Object.hasOwn(updateNewRowInTableRO, 'row'), true); - t.is(Object.hasOwn(updateNewRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(updateNewRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(updateNewRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(updateNewRowInTableRO, 'readonly_fields'), true); - t.is(updateNewRowInTableRO.row[testTableColumnName], updatedNewRow[testTableColumnName]); - t.is(updateNewRowInTableRO.row[testTableSecondColumnName], updatedNewRow[testTableSecondColumnName]); - t.is(typeof updateNewRowInTableRO.row.json_field, 'object'); - t.is(Array.isArray(updateNewRowInTableRO.row.json_field), true); - t.is(updateNewRowInTableRO.row.json_field[0].id, 'updatedNewRowId'); + const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName, testTableColumnName, testEntitiesSeedsCount, testTableSecondColumnName } = + await createTestTable(connectionToTestDB, undefined, undefined, true); + + testTables.push(testTableName); + + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .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, + json_field: [ + { + id: 'PgSAwanAwptE', + url: 'www.example.com', + name: 'test', + type: 'test type', + metadata: {}, + reference: null, + created_at: '2025-09-25T18:51:09.188Z', + updated_at: '2025-09-25T18:51:09.188Z', + description: 'some test field', + }, + ], + jsonb_field: [ + { + id: 'PgSAwanAwptE', + url: 'www.example.com', + name: 'test', + type: 'test type', + metadata: {}, + reference: null, + created_at: '2025-09-25T18:51:09.188Z', + updated_at: '2025-09-25T18:51:09.188Z', + description: 'some test field', + }, + ], + }; + const rowToUpdate = JSON.stringify(row); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=1`) + .send(rowToUpdate) + .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]); + + // add row with json field + const newRow = { + [testTableColumnName]: faker.person.firstName(), + [testTableSecondColumnName]: faker.internet.email(), + json_field: { + id: 'newRowId', + url: 'www.newrow.com', + name: 'new row', + type: 'new type', + metadata: {}, + reference: null, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + description: 'new row description', + }, + }; + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createConnectionRO.id}?tableName=${testTableName}`) + .send(JSON.stringify(newRow)) + .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(typeof addRowInTableRO.row.json_field, 'object'); + + // update the added row + + const updatedNewRow = { + [testTableColumnName]: faker.person.firstName(), + [testTableSecondColumnName]: faker.internet.email(), + json_field: [ + { + id: 'updatedNewRowId', + url: 'www.updatednewrow.com', + name: 'updated new row', + type: 'updated new type', + metadata: {}, + reference: null, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + description: 'updated new row description', + }, + ], + }; + + const updateNewRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&id=${addRowInTableRO.row.id}`) + .send(updatedNewRow) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const updateNewRowInTableRO = JSON.parse(updateNewRowInTableResponse.text); + t.is(updateNewRowInTableResponse.status, 200); + t.is(Object.hasOwn(updateNewRowInTableRO, 'row'), true); + t.is(Object.hasOwn(updateNewRowInTableRO, 'structure'), true); + t.is(Object.hasOwn(updateNewRowInTableRO, 'foreignKeys'), true); + t.is(Object.hasOwn(updateNewRowInTableRO, 'primaryColumns'), true); + t.is(Object.hasOwn(updateNewRowInTableRO, 'readonly_fields'), true); + t.is(updateNewRowInTableRO.row[testTableColumnName], updatedNewRow[testTableColumnName]); + t.is(updateNewRowInTableRO.row[testTableSecondColumnName], updatedNewRow[testTableSecondColumnName]); + t.is(typeof updateNewRowInTableRO.row.json_field, 'object'); + t.is(Array.isArray(updateNewRowInTableRO.row.json_field), true); + t.is(updateNewRowInTableRO.row.json_field[0].id, 'updatedNewRowId'); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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 = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - 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 requestData = { - primaryKeys: [{ id: 1 }, { id: 2 }], - 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=1`) - .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=2`) - .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).connectionToPostgres; + 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 requestData = { + primaryKeys: [{ id: 1 }, { id: 2 }], + 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=1`) + .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=2`) + .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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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'); - - const FoundRowRO = JSON.parse(foundRowInTableResponse.text); - console.log('🚀 ~ test.serial ~ FoundRowRO:', FoundRowRO); - t.is(foundRowInTableResponse.status, 400); - t.is(FoundRowRO.message, Messages.TABLE_NOT_FOUND); + const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + 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'); + + const FoundRowRO = JSON.parse(foundRowInTableResponse.text); + console.log('🚀 ~ test.serial ~ FoundRowRO:', FoundRowRO); + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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 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).connectionToPostgres; + 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 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).connectionToPostgres; - 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 = [ - { - id: 1, - }, - { - id: 10, - }, - { - id: 32, - }, - ]; - 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, - ); - } - - // 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).connectionToPostgres; + 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 = [ + { + id: 1, + }, + { + id: 10, + }, + { + id: 32, + }, + ]; + 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, + ); + } + + // 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); }); test.serial(`${currentTest} should test connection and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - connectionToTestDB.password = '8764323452888'; - 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).connectionToPostgres; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + + connectionToTestDB.password = '8764323452888'; + 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).connectionToPostgres; - 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.log(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).connectionToPostgres; + 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.log(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).connectionToPostgres; - 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).connectionToPostgres; + 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).connectionToPostgres; - 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).connectionToPostgres; + 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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - 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); - - 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, 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); - const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); - t.is(addedRows.length, 2); + const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + 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); + + 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, 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); + const addedRows = getTableRowsRO.rows.filter((row: Record) => row.id > testEntitiesSeedsCount); + t.is(addedRows.length, 2); }); test.serial(`${currentTest} should throw exception whe csv import is disabled`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - 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.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); - - 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).connectionToPostgres; + 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.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); + + 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/saas-tests/table-redis-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts index a41a3a647..61ed8bc5a 100644 --- a/backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts @@ -36,3642 +36,2948 @@ let _testUtils: TestUtils; const testSearchedUserName = 'Vasia'; const _testTables: Array = []; let currentTest; +let firstUserToken: string; +let createdConnectionId: string; +let connectionToTestDB: any; test.before(async () => { - 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); + 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); + + connectionToTestDB = getTestData(mockFactory).redisAgentConnection; + firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const createConnectionResponse = await request(app.getHttpServer()) + .post('/connection') + .send(connectionToTestDB) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + createdConnectionId = createConnectionRO.id; }); 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); + } }); -let testTableName, testTableColumnName, testTableSecondColumnName: string; -let connectionToTestDB; +let testTableName: string; +let testTableColumnName: string; +let testTableSecondColumnName: string; let testEntitiesSeedsCount: number; let insertedSearchedIds: Array = []; + test.beforeEach(async () => { - connectionToTestDB = getTestData(mockFactory).redisAgentConnection; - const connectionToTestDBInDocker = getTestData(mockFactory).redisConnection; - const createTestTableResult = await createTestTable(connectionToTestDBInDocker); - testTableName = createTestTableResult.testTableName; - testTableColumnName = createTestTableResult.testTableColumnName; - testTableSecondColumnName = createTestTableResult.testTableSecondColumnName; - testEntitiesSeedsCount = createTestTableResult.testEntitiesSeedsCount; - insertedSearchedIds = createTestTableResult.insertedSearchedIds; + const connectionToTestDBInDocker = getTestData(mockFactory).redisConnection; + const createTestTableResult = await createTestTable(connectionToTestDBInDocker); + testTableName = createTestTableResult.testTableName; + testTableColumnName = createTestTableResult.testTableColumnName; + testTableSecondColumnName = createTestTableResult.testTableSecondColumnName; + testEntitiesSeedsCount = createTestTableResult.testEntitiesSeedsCount; + insertedSearchedIds = createTestTableResult.insertedSearchedIds; }); currentTest = 'GET /connection/tables/:slug'; test.serial(`${currentTest} should return list of tables in connection`, async (t) => { - try { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${createdConnectionId}`) + .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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${emptyConnectionId}`) + .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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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], 'key'), 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 getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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], 'key'), 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['key'], - 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 === 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(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].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + ['key'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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 === 0).id; + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&search=${searchedDescription}`) + .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); + t.is(getTableRowsRO.rows[0].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['key'], - 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], 'key'), 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, 'key'); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + ['key'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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], 'key'), 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, 'key'); + 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - createConnectionRO.id, - testTableName, - ['key'], - 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], 'key'), 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, 'key'); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + ['key'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + undefined, + undefined, + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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], 'key'), 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, 'key'); + 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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'); - - 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[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, 'key'); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&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[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, 'key'); + 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, 'key'); - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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, 'key'); + 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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].key, 42); - // t.is(getTableRowsRO.rows[1].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 42, + QueryOrderingEnum.DESC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .query({ tableName: testTableName }) + .send(createPersonalTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const createPersonalTableSettingsRO = JSON.parse(createPersonalTableSettingsResponse.text); + console.log('🚀 ~ createPersonalTableSettingsRO:', createPersonalTableSettingsRO); + t.is(createPersonalTableSettingsResponse.status, 200); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post(`/settings?connectionId=${createdConnectionId}&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/${createdConnectionId}?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].key, 42); + // t.is(getTableRowsRO.rows[1].key, 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 age by ASC`, - async (t) => { - try { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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); - - // check that rows are sorted by age in ASC order - for (let i = 1; i < getTableRowsRO.rows.length; i++) { - const currentAge = getTableRowsRO.rows[i].age; - const previousAge = getTableRowsRO.rows[i - 1].age; - t.is(currentAge >= previousAge, true); - } - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + // check that rows are sorted by age in ASC order + for (let i = 1; i < getTableRowsRO.rows.length; i++) { + const currentAge = getTableRowsRO.rows[i].age; + const previousAge = getTableRowsRO.rows[i - 1].age; + t.is(currentAge >= previousAge, 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 ages by DESC and with pagination page=1, perPage=2`, - async (t) => { - try { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - const searchedLastId = insertedSearchedIds.find((id) => id.number === 37).id; - - const preSearchedLastId = 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[1].key, preSearchedLastId); - t.is(getTableRowsRO.rows[0].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 === 37).id; + + const preSearchedLastId = 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[1].key, preSearchedLastId); + t.is(getTableRowsRO.rows[0].key, 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 ages by ASC and with pagination page=1, perPage=2`, - async (t) => { - try { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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); - - 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); - - // check that returned rows are sorted - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ages by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + + 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); + + // check that returned rows are sorted + } catch (e) { + console.error(e); + throw e; + } + }, ); test.skip(`${currentTest} should return all found rows with sorting ages by DESC and with pagination page=2, perPage=3`, async (t) => { - try { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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); - - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37).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, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0].key, searchedFirstId); - t.is(getTableRowsRO.rows[1].key, 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; - } + try { + const createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 === 37).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, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0].key, searchedFirstId); + t.is(getTableRowsRO.rows[1].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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'); - t.is(getTableRowsResponse.status, 200); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37).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].key, searchedFirstId); - t.is(getTableRowsRO.rows[1].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 === 37).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].key, searchedFirstId); + t.is(getTableRowsRO.rows[1].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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=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; - - 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].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 === 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, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 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].key, searchedFirstId); - t.is(getTableRowsRO.rows[1].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].key, searchedFirstId); + t.is(getTableRowsRO.rows[1].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.ASC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 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].key, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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].key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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 = 'key'; - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'key'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + const emptyConnectionId = ''; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${emptyConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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 = 'key'; - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'key'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const fakeConnectionId = faker.string.uuid(); + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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 = 'key'; - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&tableName=${testTableName}`) + .send(createTableSettingsDTO) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createTableSettingsResponse.status, 201); + + const fieldname = 'key'; + const fieldGtvalue = '25'; + const fieldLtvalue = '40'; + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTableRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + 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/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 emptyConnectionId = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${emptyConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(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 fakeConnectionId = faker.string.uuid(); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = ''; + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 tableName = faker.lorem.words(1); + const getTableStructure = await request(app.getHttpServer()) + .get(`/table/structure/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 = { - key: `user_43`, - [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; - - const addedRowIndex = rows.findIndex((r) => r.key === row.key); - - t.is(rows.length, 43); - t.is(rows[addedRowIndex][testTableColumnName], row[testTableColumnName]); - t.is(rows[addedRowIndex][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, 'key'), true); + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + key: `user_43`, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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 addedRowIndex = rows.findIndex((r) => r.key === row.key); + + t.is(rows.length, 43); + t.is(rows[addedRowIndex][testTableColumnName], row[testTableColumnName]); + t.is(rows[addedRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); + + // check that rows adding was logged + + const getLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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, 'key'), true); }); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 = { - key: 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + key: 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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 = { - key: 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); -test.serial(`${currentTest} should throw an exception when row is not passed in request`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const row = { + key: 999, + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?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); - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); + t.is(message, Messages.TABLE_NAME_MISSING); - 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'); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - t.is(addRowInTableResponse.status, 400); - const { message } = JSON.parse(addRowInTableResponse.text); + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(message, Messages.PARAMETER_MISSING); + 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 addRowInTableResponse = await request(app.getHttpServer()) + .post(`/table/row/${createdConnectionId}?tableName=${testTableName}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - //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); + t.is(addRowInTableResponse.status, 400); + const { message } = JSON.parse(addRowInTableResponse.text); - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); + t.is(message, Messages.PARAMETER_MISSING); - t.is(Object.hasOwn(getTableRowsRO, 'rows'), true); - t.is(Object.hasOwn(getTableRowsRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getTableRowsRO, 'pagination'), true); + //checking that the line wasn't added + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?tableName=${testTableName}&page=1&perPage=50`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRowsResponse.status, 200); - const { rows, primaryColumns, pagination } = getTableRowsRO; + const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - t.is(rows.length, 42); + 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 = { - key: 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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + key: 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/${createdConnectionId}?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/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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.key).indexOf(foundIdForUpdate); - t.is(rows.length, 42); - t.is(rows[updateRowIndex][testTableColumnName], row[testTableColumnName]); - t.is(rows[updateRowIndex][testTableSecondColumnName], row[testTableSecondColumnName]); + 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/${createdConnectionId}?tableName=${testTableName}&key=${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/${createdConnectionId}?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.key).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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=1`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 404); + const fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const emptyConnectionId = ''; + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${emptyConnectionId}?tableName=${testTableName}&key=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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?tableName=${testTableName}&key=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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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=&key=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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const fakeConnectionId = faker.string.uuid(); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?tableName=&key=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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=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 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/${createdConnectionId}?tableName=${fakeTableName}&key=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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const row = { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=100000000`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const responseObject = JSON.parse(updateRowInTableResponse.text); - t.is(updateRowInTableResponse.status, 500); - t.is(responseObject.message, 'Failed to update row in table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + 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/${createdConnectionId}?tableName=${testTableName}&key=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const responseObject = JSON.parse(updateRowInTableResponse.text); + t.is(updateRowInTableResponse.status, 500); + t.is(responseObject.message, 'Failed to update row in table. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/update/:connectionId'; test.serial(`${currentTest} should update multiple rows and return result`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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: [{ key: foundFirstIdForUpdate }, { key: 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}&key=${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}&key=${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 fakeName = faker.person.firstName(); + const fakeMail = faker.internet.email(); + + const foundFirstIdForUpdate = insertedSearchedIds[0].id; + const foundSecondIdForUpdate = insertedSearchedIds[1].id; + const requestData = { + primaryKeys: [{ key: foundFirstIdForUpdate }, { key: foundSecondIdForUpdate }], + newValues: { + [testTableColumnName]: fakeName, + [testTableSecondColumnName]: fakeMail, + }, + }; + + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/update/${createdConnectionId}?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/${createdConnectionId}?tableName=${testTableName}&key=${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/${createdConnectionId}?tableName=${testTableName}&key=${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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, true); + const idForDeletion = insertedSearchedIds[0].id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&key=${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/${createdConnectionId}?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.key).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, true); }); test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const idForDeletion = insertedSearchedIds[0].id; + const connectionId = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&key=${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/${createdConnectionId}?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.key).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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const idForDeletion = insertedSearchedIds[0].id; + const connectionId = faker.string.uuid(); + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${connectionId}?tableName=${testTableName}&key=${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/${createdConnectionId}?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.key).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, false); }); test.serial(`${currentTest} should throw an exception when tableName not passed in request`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const idForDeletion = insertedSearchedIds[0].id; + const fakeTableName = ''; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${fakeTableName}&key=${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/${createdConnectionId}?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.key).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, false); }); test.serial(`${currentTest} should throw an exception when tableName passed in request is incorrect`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const idForDeletion = insertedSearchedIds[0].id; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${fakeTableName}&key=${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/${createdConnectionId}?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.key).indexOf(idForDeletion); + t.is(deletedRowIndex < 0, false); }); test.serial(`${currentTest} should throw an exception when primary key not passed in request`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const idForDeletion = insertedSearchedIds[0].id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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.key).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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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.key).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 idForDeletion = insertedSearchedIds[0].id; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?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/${createdConnectionId}?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.key).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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=100000`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - t.is(deleteRowInTableResponse.status, 500); - t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); - }, + `${currentTest} should throw an exception when primary key passed in request has incorrect field value`, + async (t) => { + const deleteRowInTableResponse = await request(app.getHttpServer()) + .delete(`/table/row/${createdConnectionId}?tableName=${testTableName}&key=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + t.is(deleteRowInTableResponse.status, 500); + t.is(deleteRowInTableRO.message, 'Failed to delete row from table. No data returned from agent'); + }, ); currentTest = 'GET /table/row/:slug'; test.serial(`${currentTest} found row`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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.key, idForSearch); - t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); - t.is(Object.keys(foundRowInTableRO.row).length, 6); + const idForSearch = insertedSearchedIds[0].id; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&key=${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.key, 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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(foundRowInTableResponse.status, 404); + const idForSearch = 1; + const emptyConnectionId = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${emptyConnectionId}?tableName=${testTableName}&key=${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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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 idForSearch = 1; + const fakeConnectionId = faker.string.uuid(); + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${fakeConnectionId}?tableName=${testTableName}&key=${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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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 idForSearch = 1; + const fakeTableName = ''; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${fakeTableName}&key=${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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${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 idForSearch = 1; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${fakeTableName}&key=${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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - - const idForSearch = insertedSearchedIds[0].id; - - const foundRowInTableResponse = await request(app.getHttpServer()) - .get(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); - t.is(foundRowInTableResponse.status, 400); - t.is(foundRowInTableRO.message, Messages.PRIMARY_KEY_INVALID); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect name`, + async (t) => { + const idForSearch = insertedSearchedIds[0].id; + + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&fakeKeyName=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const foundRowInTableRO = JSON.parse(foundRowInTableResponse.text); + t.is(foundRowInTableResponse.status, 400); + t.is(foundRowInTableRO.message, Messages.PRIMARY_KEY_INVALID); + }, ); test.serial( - `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, - async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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}&key=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(foundRowInTableResponse.status, 500); - const findRowResponse = JSON.parse(foundRowInTableResponse.text); - t.is(findRowResponse.message, 'Failed to get row by primary key. No data returned from agent'); - }, + `${currentTest} should throw an exception, when primary key passed in request has incorrect value`, + async (t) => { + const idForSearch = '6604197dab8d910eb77783f9'; + const foundRowInTableResponse = await request(app.getHttpServer()) + .get(`/table/row/${createdConnectionId}?tableName=${testTableName}&key=${idForSearch}`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(foundRowInTableResponse.status, 500); + const findRowResponse = JSON.parse(foundRowInTableResponse.text); + t.is(findRowResponse.message, 'Failed to get row by primary key. No data returned from agent'); + }, ); currentTest = 'PUT /table/rows/delete/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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> = [ - { - key: insertedSearchedIds[0].id, - }, - { - key: insertedSearchedIds[1].id, - }, - { - key: insertedSearchedIds[2].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.key === key.key), - -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.key === key.key) >= 0, true); - } + const primaryKeysForDeletion: Array> = [ + { + key: insertedSearchedIds[0].id, + }, + { + key: insertedSearchedIds[1].id, + }, + { + key: insertedSearchedIds[2].id, + }, + ]; + const deleteRowsInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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.key === key.key), + -1, + ); + } + + // check that table deletaion was logged + const tableLogsResponse = await request(app.getHttpServer()) + .get(`/logs/${createdConnectionId}?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); + const onlyDeleteLogs = tableLogsRO.logs.filter((log) => log.operationType === LogOperationTypeEnum.deleteRow); + t.true(onlyDeleteLogs.length >= primaryKeysForDeletion.length); + for (const key of primaryKeysForDeletion) { + t.is(onlyDeleteLogs.findIndex((log) => log.received_data.key === key.key) >= 0, true); + } }); currentTest = 'DELETE /table/rows/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 = [ - { - key: insertedSearchedIds[0].id, - }, - { - key: insertedSearchedIds[1].id, - }, - { - key: insertedSearchedIds[2].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.key === primaryKey.key), - -1, - ); - } + const primaryKeysForDeletion = [ + { + key: insertedSearchedIds[0].id, + }, + { + key: insertedSearchedIds[1].id, + }, + { + key: insertedSearchedIds[2].id, + }, + ]; + const deleteRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/rows/delete/${createdConnectionId}?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/${createdConnectionId}?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.key === primaryKey.key), + -1, + ); + } }); currentTest = 'GET table/csv/:slug'; test.serial(`${currentTest} should return csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .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 getTableCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/export/${createdConnectionId}?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 firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('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, - 'key', - ); - - 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) { - const getTableCsvResponseText = JSON.parse(getTableCsvResponse.text); - console.log(getTableCsvResponseText); - } - 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 deleteIdColumnsInCSVFile(filePatch: string) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - const fileContent = fs.readFileSync(filePatch).toString(); - const rows = fileContent.split('\n'); - const idColumnIndex = rows[0].split(',').indexOf('key'); - const newRows = rows.map((row) => { - const columns = row.split(','); - if (columns.length === 1) { - return row; - } - if (idColumnIndex >= 0) { - columns.splice(idColumnIndex, 1); - } - return columns.join(','); - }); - return newRows.join('\n'); - } - - const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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, 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 createTableSettingsDTO = mockFactory.generateTableSettings( + createdConnectionId, + testTableName, + [testTableColumnName], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); + + const createPersonalTableSettingsDTO = mockFactory.generatePersonalTableSettingsDto( + undefined, + 3, + QueryOrderingEnum.DESC, + 'key', + ); + + const createPersonalTableSettingsResponse = await request(app.getHttpServer()) + .put(`/settings/personal/${createdConnectionId}`) + .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=${createdConnectionId}&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/${createdConnectionId}?tableName=${testTableName}&search=${testSearchedUserName}&page=1&perPage=2`, + ) + .set('Cookie', firstUserToken) + .set('Content-Type', 'text/csv') + .set('Accept', 'text/csv'); + + if (getTableCsvResponse.status !== 201) { + const getTableCsvResponseText = JSON.parse(getTableCsvResponse.text); + console.log(getTableCsvResponseText); + } + 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 deleteIdColumnsInCSVFile(filePatch: string) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const fileContent = fs.readFileSync(filePatch).toString(); + const rows = fileContent.split('\n'); + const idColumnIndex = rows[0].split(',').indexOf('key'); + const newRows = rows.map((row) => { + const columns = row.split(','); + if (columns.length === 1) { + return row; + } + if (idColumnIndex >= 0) { + columns.splice(idColumnIndex, 1); + } + return columns.join(','); + }); + return newRows.join('\n'); + } + + const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); + // eslint-disable-next-line security/detect-non-literal-fs-filename + fs.writeFileSync(downloadedFilePatch, newFileContent); + + const importCsvResponse = await request(app.getHttpServer()) + .post(`/table/csv/import/${createdConnectionId}?tableName=${testTableName}`) + .attach('file', downloadedFilePatch) + .set('Cookie', firstUserToken) + .set('Accept', 'application/json'); + + t.is(importCsvResponse.status, 201); + + //checking that the lines was added + + const getTableRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${createdConnectionId}?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); }); diff --git a/backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts index 57b27a079..933b73657 100644 --- a/backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts @@ -38,3967 +38,3961 @@ const testTables: Array = []; let currentTest; test.before(async () => { - 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); + 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); }); 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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], 'key'), 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).redisConnection; + 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], 'key'), 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).redisConnection; - 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, - ['key'], - 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 === 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); - - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - 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].key, 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).redisConnection; + 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, + ['key'], + 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 === 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(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].key, 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).redisConnection; - 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, - ['key'], - 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], 'key'), 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, 'key'); - 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).redisConnection; + 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, + ['key'], + 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], 'key'), 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, 'key'); + 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).redisConnection; - 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, - ['key'], - 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], 'key'), 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, 'key'); - 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).redisConnection; + 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, + ['key'], + 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], 'key'), 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, 'key'); + 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).redisConnection; - 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'); - - const getTableRowsRO = JSON.parse(getTableRowsResponse.text); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - 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[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, 'key'); - 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).redisConnection; + 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'); + + 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[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, 'key'); + 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).redisConnection; - 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, 'key'); - 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).redisConnection; + 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, 'key'); + 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).redisConnection; - 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, - 'key', - ); - - 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].key, 42); - // t.is(getTableRowsRO.rows[1].key, 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).redisConnection; + 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, + 'key', + ); + + 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].key, 42); + // t.is(getTableRowsRO.rows[1].key, 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 age by ASC`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).redisConnection; - 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, - '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); - - // check that rows are sorted by age in ASC order - for (let i = 1; i < getTableRowsRO.rows.length; i++) { - const currentAge = getTableRowsRO.rows[i].age; - const previousAge = getTableRowsRO.rows[i - 1].age; - t.is(currentAge >= previousAge, true); - } - } catch (e) { - console.error(e); - throw e; - } - }, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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, + '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); + + // check that rows are sorted by age in ASC order + for (let i = 1; i < getTableRowsRO.rows.length; i++) { + const currentAge = getTableRowsRO.rows[i].age; + const previousAge = getTableRowsRO.rows[i - 1].age; + t.is(currentAge >= previousAge, 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 ages by DESC and with pagination page=1, perPage=2`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).redisConnection; - 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, - '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); - - const searchedLastId = insertedSearchedIds.find((id) => id.number === 37).id; - - const preSearchedLastId = 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[1].key, preSearchedLastId); - t.is(getTableRowsRO.rows[0].key, 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).redisConnection; + 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, + '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); + + const searchedLastId = insertedSearchedIds.find((id) => id.number === 37).id; + + const preSearchedLastId = 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[1].key, preSearchedLastId); + t.is(getTableRowsRO.rows[0].key, 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 ages by ASC and with pagination page=1, perPage=2`, - async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).redisConnection; - 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, - 'key', - ); - - 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); - - 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); - - // check that returned rows are sorted - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found rows with sorting ages by ASC and with pagination page=1, perPage=2`, + async (t) => { + try { + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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, + 'key', + ); + + 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); + + 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); + + // check that returned rows are sorted + } catch (e) { + console.error(e); + throw e; + } + }, ); test.skip(`${currentTest} should return all found rows with sorting ages by DESC and with pagination page=2, perPage=3`, async (t) => { - try { - const connectionToTestDB = getTestData(mockFactory).redisConnection; - 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, - '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); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - console.log('🚀 ~ insertedSearchedIds:', insertedSearchedIds); - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37).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, 3); - t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); - t.is(getTableRowsRO.rows[0].key, searchedFirstId); - t.is(getTableRowsRO.rows[1].key, 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; - } + try { + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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, + '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); + + console.log('🚀 ~ insertedSearchedIds:', insertedSearchedIds); + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37).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, 3); + t.is(Object.keys(getTableRowsRO.rows[1]).length, 6); + t.is(getTableRowsRO.rows[0].key, searchedFirstId); + t.is(getTableRowsRO.rows[1].key, 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).redisConnection; - 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, - '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); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - console.log('🚀 ~ insertedSearchedIds:', insertedSearchedIds); - const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37).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].key, searchedFirstId); - t.is(getTableRowsRO.rows[1].key, 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).redisConnection; + 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, + '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); + + console.log('🚀 ~ insertedSearchedIds:', insertedSearchedIds); + const searchedFirstId = insertedSearchedIds.find((id) => id.number === 37).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].key, searchedFirstId); + t.is(getTableRowsRO.rows[1].key, 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).redisConnection; - 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, - '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); - - const searchedFirstId = 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, 1); - t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); - t.is(getTableRowsRO.rows[0].key, 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).redisConnection; + 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, + '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); + + const searchedFirstId = 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, 1); + t.is(Object.keys(getTableRowsRO.rows[0]).length, 6); + t.is(getTableRowsRO.rows[0].key, 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).redisConnection; - 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, - '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 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].key, searchedFirstId); - t.is(getTableRowsRO.rows[1].key, 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).redisConnection; + 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, + '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 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].key, searchedFirstId); + t.is(getTableRowsRO.rows[1].key, 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).redisConnection; - 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, - 'key', - ); - - 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].key, 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).redisConnection; + 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, + 'key', + ); + + 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].key, 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).redisConnection; - 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, - 'key', - ); - - 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].key, 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).redisConnection; + 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, + 'key', + ); + + 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].key, 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).redisConnection; - 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, - 'key', - ); - - 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].key, 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).redisConnection; + 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, + 'key', + ); + + 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].key, 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).redisConnection; - 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, - '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 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); - console.log('🚀 ~ getTableRowsRO:', getTableRowsRO); - - 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].key, 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).redisConnection; + 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, + '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 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].key, 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).redisConnection; - 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, - 'key', - ); - - 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 = 'key'; - 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).redisConnection; + 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, + 'key', + ); + + 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 = 'key'; + 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).redisConnection; - 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, - 'key', - ); - - 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 = 'key'; - 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).redisConnection; + 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, + 'key', + ); + + 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 = 'key'; + 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).redisConnection; - 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, - 'key', - ); - - 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 = 'key'; - 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).redisConnection; + 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, + 'key', + ); + + 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 = 'key'; + 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).redisConnection; - 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 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).redisConnection; + 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 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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 = { - key: `user_43`, - [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; - console.log('🚀 ~ rows:', rows); - - const addedRowIndex = rows.findIndex((r) => r.key === row.key); - - t.is(rows.length, 43); - t.is(rows[addedRowIndex][testTableColumnName], row[testTableColumnName]); - t.is(rows[addedRowIndex][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, 'key'), true); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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 = { + key: `user_43`, + [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; + console.log('🚀 ~ rows:', rows); + + const addedRowIndex = rows.findIndex((r) => r.key === row.key); + + t.is(rows.length, 43); + t.is(rows[addedRowIndex][testTableColumnName], row[testTableColumnName]); + t.is(rows[addedRowIndex][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, 'key'), true); }); test.serial(`${currentTest} should throw an exception when connection id is not passed in request`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).redisConnection; - 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 = { - key: 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).redisConnection; + 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 = { + key: 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).redisConnection; - 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 = { - key: 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).redisConnection; + 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 = { + key: 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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 = { - key: 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).redisConnection; + 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 = { + key: 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).redisConnection; - 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; - console.log('🚀 ~ foundIdForUpdate:', foundIdForUpdate); - const updateRowInTableResponse = await request(app.getHttpServer()) - .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&key=${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); - console.log('🚀 ~ updateRowInTableRO:', updateRowInTableRO); - - 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.key).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).redisConnection; + 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; + console.log('🚀 ~ foundIdForUpdate:', foundIdForUpdate); + const updateRowInTableResponse = await request(app.getHttpServer()) + .put(`/table/row/${createConnectionRO.id}?tableName=${testTableName}&key=${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); + console.log('🚀 ~ updateRowInTableRO:', updateRowInTableRO); + + 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.key).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).redisConnection; - 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}&key=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).redisConnection; + 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}&key=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).redisConnection; - 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}&key=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).redisConnection; + 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}&key=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).redisConnection; - 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=&key=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).redisConnection; + 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=&key=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).redisConnection; - 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}&key=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).redisConnection; + 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}&key=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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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}&key=100000000`) - .send(JSON.stringify(row)) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateRowInTableResponse.status, 400); - const responseObject = JSON.parse(updateRowInTableResponse.text); - t.is(responseObject.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).redisConnection; + 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}&key=100000000`) + .send(JSON.stringify(row)) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + t.is(updateRowInTableResponse.status, 400); + const responseObject = JSON.parse(updateRowInTableResponse.text); + t.is(responseObject.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).redisConnection; - 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: [{ key: foundFirstIdForUpdate }, { key: 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}&key=${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}&key=${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).redisConnection; + 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: [{ key: foundFirstIdForUpdate }, { key: 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}&key=${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}&key=${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).redisConnection; - 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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, true); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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}&key=${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.key).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).redisConnection; - 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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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}&key=${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.key).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).redisConnection; - 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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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}&key=${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.key).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).redisConnection; - 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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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}&key=${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.key).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).redisConnection; - 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}&key=${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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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}&key=${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.key).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).redisConnection; - 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.key).indexOf(idForDeletion); - t.is(deletedRowIndex < 0, false); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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.key).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).redisConnection; - 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.key).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).redisConnection; + 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.key).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).redisConnection; - 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}&key=100000`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); - console.log('🚀 ~ deleteRowInTableRO:', deleteRowInTableRO); - 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).redisConnection; + 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}&key=100000`) + .set('Cookie', firstUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + const deleteRowInTableRO = JSON.parse(deleteRowInTableResponse.text); + console.log('🚀 ~ deleteRowInTableRO:', deleteRowInTableRO); + 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).redisConnection; - 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}&key=${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.key, idForSearch); - t.is(foundRowInTableRO.row[testTableColumnName], testSearchedUserName); - t.is(Object.keys(foundRowInTableRO.row).length, 6); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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}&key=${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.key, 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).redisConnection; - 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}&key=${idForSearch}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(foundRowInTableResponse.status, 404); + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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}&key=${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).redisConnection; - 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}&key=${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).redisConnection; + 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}&key=${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).redisConnection; - 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}&key=${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).redisConnection; + 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}&key=${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).redisConnection; - 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}&key=${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).redisConnection; + 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}&key=${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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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}&key=${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).redisConnection; + 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}&key=${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).redisConnection; - 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> = [ - { - key: insertedSearchedIds[0].id, - }, - { - key: insertedSearchedIds[1].id, - }, - { - key: insertedSearchedIds[2].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.key === key.key), - -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.key === key.key) >= 0, true); - } + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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> = [ + { + key: insertedSearchedIds[0].id, + }, + { + key: insertedSearchedIds[1].id, + }, + { + key: insertedSearchedIds[2].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.key === key.key), + -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.key === key.key) >= 0, true); + } }); currentTest = 'DELETE /table/rows/:slug'; test.serial(`${currentTest} should delete row in table and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).redisConnection; - 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 = [ - { - key: insertedSearchedIds[0].id, - }, - { - key: insertedSearchedIds[1].id, - }, - { - key: insertedSearchedIds[2].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.key === primaryKey.key), - -1, - ); - } + const connectionToTestDB = getTestData(mockFactory).redisConnection; + 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 = [ + { + key: insertedSearchedIds[0].id, + }, + { + key: insertedSearchedIds[1].id, + }, + { + key: insertedSearchedIds[2].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.key === primaryKey.key), + -1, + ); + } }); test.serial(`${currentTest} should test connection and return result`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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).redisConnection; + 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).redisConnection; - 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, - 'key', - ); - - 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).redisConnection; + 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, + 'key', + ); + + 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); + }, ); currentTest = 'POST /table/csv/import/:slug'; test.serial(`${currentTest} should import csv file with table data`, async (t) => { - const connectionToTestDB = getTestData(mockFactory).redisConnection; - 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, - 'key', - ); - - 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) { - const getTableCsvResponseText = JSON.parse(getTableCsvResponse.text); - console.log(getTableCsvResponseText); - } - 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 deleteIdColumnsInCSVFile(filePatch: string) { - // eslint-disable-next-line security/detect-non-literal-fs-filename - const fileContent = fs.readFileSync(filePatch).toString(); - const rows = fileContent.split('\n'); - const idColumnIndex = rows[0].split(',').indexOf('key'); - const newRows = rows.map((row) => { - const columns = row.split(','); - if (columns.length === 1) { - return row; - } - if (idColumnIndex >= 0) { - columns.splice(idColumnIndex, 1); - } - return columns.join(','); - }); - return newRows.join('\n'); - } - - const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); - // eslint-disable-next-line security/detect-non-literal-fs-filename - 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, 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).redisConnection; + 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, + 'key', + ); + + 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) { + const getTableCsvResponseText = JSON.parse(getTableCsvResponse.text); + console.log(getTableCsvResponseText); + } + 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 deleteIdColumnsInCSVFile(filePatch: string) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + const fileContent = fs.readFileSync(filePatch).toString(); + const rows = fileContent.split('\n'); + const idColumnIndex = rows[0].split(',').indexOf('key'); + const newRows = rows.map((row) => { + const columns = row.split(','); + if (columns.length === 1) { + return row; + } + if (idColumnIndex >= 0) { + columns.splice(idColumnIndex, 1); + } + return columns.join(','); + }); + return newRows.join('\n'); + } + + const newFileContent = deleteIdColumnsInCSVFile(downloadedFilePatch); + // eslint-disable-next-line security/detect-non-literal-fs-filename + 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, 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); }); diff --git a/backend/test/utils/drop-test-tables.ts b/backend/test/utils/drop-test-tables.ts index 56e5fd956..353b7fce5 100644 --- a/backend/test/utils/drop-test-tables.ts +++ b/backend/test/utils/drop-test-tables.ts @@ -1,20 +1,21 @@ - import { getTestKnex } from './get-test-knex.js'; export async function dropTestTables(tableNames: Array, connectionParams): Promise { - const connectionParamsCopy = { - ...connectionParams, - }; - if (connectionParams.type === 'mysql') { - connectionParamsCopy.type = 'mysql2'; - } - const foundKnex = getTestKnex(connectionParamsCopy); - await Promise.all( - tableNames.map(async (tableName) => { - if (connectionParamsCopy.schema) { - await foundKnex.schema.withSchema(connectionParamsCopy.schema).dropTableIfExists(tableName); - } - await foundKnex.schema.dropTableIfExists(tableName); - }), - ); + return; + + // const connectionParamsCopy = { + // ...connectionParams, + // }; + // if (connectionParams.type === 'mysql') { + // connectionParamsCopy.type = 'mysql2'; + // } + // const foundKnex = getTestKnex(connectionParamsCopy); + // await Promise.all( + // tableNames.map(async (tableName) => { + // if (connectionParamsCopy.schema) { + // await foundKnex.schema.withSchema(connectionParamsCopy.schema).dropTableIfExists(tableName); + // } + // await foundKnex.schema.dropTableIfExists(tableName); + // }), + // ); } diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-agent.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-agent.ts index ae62581c4..2bd5c0364 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-agent.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-agent.ts @@ -21,918 +21,955 @@ import { Stream, Readable } from 'node:stream'; import * as csv from 'csv'; import PQueue from 'p-queue'; import { - formatOracleDate, - isMSSQLDateOrTimeType, - isMSSQLDateStringByRegexp, - isMySQLDateStringByRegexp, - isMySqlDateOrTimeType, - isOracleDateStringByRegexp, - isPostgresDateOrTimeType, - isPostgresDateStringByRegexp, + formatOracleDate, + isMSSQLDateOrTimeType, + isMSSQLDateStringByRegexp, + isMySQLDateStringByRegexp, + isMySqlDateOrTimeType, + isOracleDateStringByRegexp, + isPostgresDateOrTimeType, + isPostgresDateStringByRegexp, } from '../../helpers/is-database-date.js'; import { ConnectionTypesEnum } from '../../shared/enums/connection-types-enum.js'; export class DataAccessObjectAgent implements IDataAccessObjectAgent { - private readonly connection: ConnectionAgentParams; - private readonly serverAddress: string = process.env.LOCAL_WS_SERVER_ADDRESS || `http://autoadmin-ws.local:8008/`; - constructor(connection: ConnectionAgentParams) { - this.connection = connection; - } - - public async addRowInTable( - tableName: string, - row: Record, - userEmail: string, - ): Promise> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.addRowInTable, - tableName, - row, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async deleteRowInTable( - tableName: string, - primaryKey: Record, - userEmail: string, - ): Promise> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.deleteRowInTable, - tableName, - primaryKey, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getIdentityColumns( - tableName: string, - referencedFieldName: string, - identityColumnName: string, - fieldValues: (string | number)[], - userEmail: string, - ): Promise>> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getIdentityColumns, - tableName, - referencedFieldName, - identityColumnName, - fieldValues, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getRowByPrimaryKey( - tableName: string, - primaryKey: Record, - settings: TableSettingsDS, - userEmail: string, - ): Promise> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getRowByPrimaryKey, - tableName, - primaryKey, - tableSettings: settings, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - if (Array.isArray(commandResult)) { - return commandResult[0]; - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async bulkGetRowsFromTableByPrimaryKeys( - tableName: string, - primaryKeys: Array>, - settings: TableSettingsDS, - userEmail: string, - ): Promise>> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.bulkGetRowsFromTableByPrimaryKeys, - tableName, - primaryKey: primaryKeys, - tableSettings: settings, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getRowsFromTable( - tableName: string, - settings: TableSettingsDS, - page: number, - perPage: number, - searchedFieldValue: string, - filteringFields: FilteringFieldsDS[], - autocompleteFields: AutocompleteFieldsDS, - tableStructure: TableStructureDS[] | null, - userEmail: string, - ): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getRowsFromTable, - tableName, - tableSettings: settings, - page, - perPage, - searchedFieldValue, - filteringFields, - autocompleteFields, - email: userEmail, - tableStructure, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getTableForeignKeys(tableName: string, userEmail: string): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - const cachedForeignKeys = LRUStorage.getTableForeignKeysCache(this.connection, tableName); - if (cachedForeignKeys) { - return cachedForeignKeys; - } - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getTableForeignKeys, - tableName, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - LRUStorage.setTableForeignKeysCache(this.connection, tableName, commandResult); - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getTablePrimaryColumns(tableName: string, userEmail: string): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - const cachedPrimaryColumns = LRUStorage.getTablePrimaryKeysCache(this.connection, tableName); - if (cachedPrimaryColumns) { - return cachedPrimaryColumns; - } - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getTablePrimaryColumns, - tableName, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - LRUStorage.setTablePrimaryKeysCache(this.connection, tableName, commandResult); - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getTablesFromDB(userEmail: string): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getTablesFromDB, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getTableStructure(tableName: string, userEmail: string): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - const cachedTableStructure = LRUStorage.getTableStructureCache(this.connection, tableName); - if (cachedTableStructure) { - return cachedTableStructure; - } - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getTableStructure, - tableName, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - LRUStorage.setTableStructureCache(this.connection, tableName, commandResult); - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async testConnect(userEmail: string = 'unknown'): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.testConnect, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async updateRowInTable( - tableName: string, - row: Record, - primaryKey: Record, - userEmail: string, - ): Promise> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.updateRowInTable, - tableName, - row, - primaryKey, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async bulkUpdateRowsInTable( - tableName: string, - newValues: Record, - primaryKeys: Array>, - userEmail: string, - ): Promise>> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.bulkUpdateRowsInTable, - tableName, - row: newValues, - primaryKey: primaryKeys, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async bulkDeleteRowsInTable( - tableName: string, - primaryKeys: Array>, - userEmail: string, - ): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.bulkDeleteRowsInTable, - tableName, - primaryKey: primaryKeys, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async validateSettings( - settings: ValidateTableSettingsDS, - tableName: string, - userEmail: string, - ): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.validateSettings, - tableName, - tableSettings: settings, - email: userEmail, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getReferencedTableNamesAndColumns( - tableName: string, - userEmail: string, - ): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getReferencedTableNamesAndColumns, - email: userEmail, - tableName, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async isView(tableName: string, userEmail: string): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.isView, - email: userEmail, - tableName, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (commandResult === null || commandResult === undefined) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async getTableRowsStream( - tableName: string, - settings: TableSettingsDS, - page: number, - perPage: number, - searchedFieldValue: string, - filteringFields: Array, - ): Promise> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.getRowsAsStream, - tableName, - tableSettings: settings, - page, - perPage, - searchedFieldValue, - filteringFields, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult?.data; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async importCSVInTable(file: Express.Multer.File, tableName: string, userEmail: string): Promise { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const stream = new Readable(); - stream.push(file.buffer); - stream.push(null); - const parser = stream.pipe(csv.parse({ columns: true })); - const rows: any[] = []; - for await (const record of parser) { - rows.push(record); - } - const rowsWithProcessedDates = await this.processTimeColumnsInRows(rows, tableName, userEmail); - const queue = new PQueue({ concurrency: 3 }); - await Promise.all( - rowsWithProcessedDates.map(async (row) => { - return await queue.add(async () => { - return await this.addRowInTable(tableName, row, userEmail); - }); - }), - ); - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - public async executeRawQuery( - query: string, - tableName: string, - userEmail: string, - ): Promise>> { - const jwtAuthToken = this.generateJWT(this.connection.token); - axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; - - return this.executeWithRetry(async () => { - try { - const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { - operationType: DataAccessObjectCommandsEnum.executeRawQuery, - query, - email: userEmail, - tableName, - }); - - if (commandResult instanceof Error) { - throw new Error(commandResult.message); - } - - if (!commandResult) { - throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); - } - - return commandResult?.data; - } catch (e) { - if (axios.isAxiosError(e)) { - this.checkIsErrorLocalAndThrowException(e); - throw new Error(e.response?.data); - } - throw e; - } - }); - } - - private generateJWT(connectionToken: string): string { - const exp = new Date(); - exp.setDate(exp.getDate() + 60); - const secret = process.env.JWT_SECRET; - return jwt.sign( - { - token: connectionToken, - exp: Math.floor(exp.getTime() / 1000), - }, - secret, - ); - } - - private async executeWithRetry(operationFunction: () => Promise, maxRetries: number = 1): Promise { - let lastError: Error; - for (let attempt = 0; attempt <= maxRetries; attempt++) { - try { - return await operationFunction(); - } catch (e) { - lastError = e as Error; - if (e instanceof Error && e.message === ERROR_MESSAGES.CLIENT_NOT_CONNECTED && attempt < maxRetries) { - console.log(`Retry attempt ${attempt + 1} due to: ${e.message}`); - await new Promise((resolve) => setTimeout(resolve, 500)); - continue; - } - throw e; - } - } - - throw lastError; - } - - private checkIsErrorLocalAndThrowException( - e: Error & { code?: string; hostname?: string; response?: { data?: string } }, - ): void { - if (e?.message === ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT) { - throw new Error(e.message); - } - if (e?.code?.toLowerCase() === 'enotfound' && e?.hostname === 'autoadmin-ws.local') { - throw new Error(ERROR_MESSAGES.CANT_CONNECT_AUTOADMIN_WS); - } - if (e?.response?.data === 'Client is not connected' || e?.response?.data === ERROR_MESSAGES.CLIENT_NOT_CONNECTED) { - throw new Error(ERROR_MESSAGES.CLIENT_NOT_CONNECTED); - } - } - - private async processTimeColumnsInRows( - rows: Array>, - tableName: string, - userEmail: string, - ): Promise>> { - const tableStructure = await this.getTableStructure(tableName, userEmail); - switch (this.connection.type) { - case ConnectionTypesEnum.agent_postgres: { - const timestampColumnNamesPg = tableStructure - .filter((column) => { - return isPostgresDateOrTimeType(column.data_type); - }) - .map((column) => { - return column.column_name; - }); - return this.processPostgresDateColumnsInRows(rows, timestampColumnNamesPg); - } - - case ConnectionTypesEnum.agent_mysql: { - const timestampColumnNamesMySQL = tableStructure - .filter((column) => { - return isMySqlDateOrTimeType(column.data_type); - }) - .map((column) => { - return column.column_name; - }); - return this.processMySQLDateColumnsInRows(rows, timestampColumnNamesMySQL); - } - - case ConnectionTypesEnum.agent_mssql: { - const timestampColumnNamesMSSQL = tableStructure - .filter((column) => { - return isMSSQLDateOrTimeType(column.data_type); - }) - .map((column) => { - return column.column_name; - }); - return this.processMSSQLDateColumnsInRows(rows, timestampColumnNamesMSSQL); - } - - case ConnectionTypesEnum.agent_oracledb: { - const timestampColumnNamesOracle = tableStructure - .filter((column) => { - return isOracleDateStringByRegexp(column.data_type); - }) - .map((column) => { - return column.column_name; - }); - return this.processOracleDateColumnsInRows(rows, timestampColumnNamesOracle); - } - default: - return rows; - } - } - - private processOracleDateColumnsInRows( - rows: Array>, - timestampColumnNames: Array, - ): Array> { - for (const row of rows) { - for (const column of timestampColumnNames) { - if (row[column] && !isOracleDateStringByRegexp(row[column])) { - const date = new Date(Number(row[column])); - row[column] = formatOracleDate(date); - } - } - } - return rows; - } - - private processMySQLDateColumnsInRows( - rows: Array>, - timestampColumnNames: Array, - ): Array> { - for (const row of rows) { - for (const column of timestampColumnNames) { - if (row[column] && !isMySQLDateStringByRegexp(row[column])) { - let dateStr = row[column]; - if (dateStr.endsWith('Z')) { - dateStr = dateStr.slice(0, -1); - } - const date = new Date(dateStr); - const formattedDate = date.toISOString().slice(0, 19).replace('T', ' '); - row[column] = formattedDate; - } - } - } - return rows; - } - - private processMSSQLDateColumnsInRows(rows: Array>, timestampColumnNames: Array) { - for (const row of rows) { - for (const column of timestampColumnNames) { - if (row[column] && !isMSSQLDateStringByRegexp(row[column])) { - const date = new Date(Number(row[column])); - row[column] = date.toISOString(); - } - } - } - return rows; - } - - private processPostgresDateColumnsInRows( - rows: Array>, - timestampColumnNames: Array, - ): Array> { - for (const row of rows) { - for (const column of timestampColumnNames) { - try { - if (row[column] && !isPostgresDateStringByRegexp(row[column])) { - const date = new Date(Number(row[column])); - row[column] = date.toISOString(); - } - } catch (_error) { - } - } - } - return rows; - } + private readonly connection: ConnectionAgentParams; + private readonly serverAddress: string = process.env.LOCAL_WS_SERVER_ADDRESS || `http://autoadmin-ws.local:8008/`; + constructor(connection: ConnectionAgentParams) { + this.connection = connection; + } + + public async addRowInTable( + tableName: string, + row: Record, + userEmail: string, + ): Promise> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.addRowInTable, + tableName, + row, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async deleteRowInTable( + tableName: string, + primaryKey: Record, + userEmail: string, + ): Promise> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.deleteRowInTable, + tableName, + primaryKey, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getIdentityColumns( + tableName: string, + referencedFieldName: string, + identityColumnName: string, + fieldValues: (string | number)[], + userEmail: string, + ): Promise>> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getIdentityColumns, + tableName, + referencedFieldName, + identityColumnName, + fieldValues, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getRowByPrimaryKey( + tableName: string, + primaryKey: Record, + settings: TableSettingsDS, + userEmail: string, + ): Promise> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getRowByPrimaryKey, + tableName, + primaryKey, + tableSettings: settings, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + if (Array.isArray(commandResult)) { + return commandResult[0]; + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async bulkGetRowsFromTableByPrimaryKeys( + tableName: string, + primaryKeys: Array>, + settings: TableSettingsDS, + userEmail: string, + ): Promise>> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.bulkGetRowsFromTableByPrimaryKeys, + tableName, + primaryKey: primaryKeys, + tableSettings: settings, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getRowsFromTable( + tableName: string, + settings: TableSettingsDS, + page: number, + perPage: number, + searchedFieldValue: string, + filteringFields: FilteringFieldsDS[], + autocompleteFields: AutocompleteFieldsDS, + tableStructure: TableStructureDS[] | null, + userEmail: string, + ): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getRowsFromTable, + tableName, + tableSettings: settings, + page, + perPage, + searchedFieldValue, + filteringFields, + autocompleteFields, + email: userEmail, + tableStructure, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getTableForeignKeys(tableName: string, userEmail: string): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + const cachedForeignKeys = LRUStorage.getTableForeignKeysCache(this.connection, tableName); + if (cachedForeignKeys) { + return cachedForeignKeys; + } + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getTableForeignKeys, + tableName, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + LRUStorage.setTableForeignKeysCache(this.connection, tableName, commandResult); + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getTablePrimaryColumns(tableName: string, userEmail: string): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + const cachedPrimaryColumns = LRUStorage.getTablePrimaryKeysCache(this.connection, tableName); + if (cachedPrimaryColumns) { + return cachedPrimaryColumns; + } + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getTablePrimaryColumns, + tableName, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + LRUStorage.setTablePrimaryKeysCache(this.connection, tableName, commandResult); + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getTablesFromDB(userEmail: string): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getTablesFromDB, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getTableStructure(tableName: string, userEmail: string): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + const cachedTableStructure = LRUStorage.getTableStructureCache(this.connection, tableName); + if (cachedTableStructure) { + return cachedTableStructure; + } + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getTableStructure, + tableName, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + LRUStorage.setTableStructureCache(this.connection, tableName, commandResult); + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async testConnect(userEmail: string = 'unknown'): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.testConnect, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async updateRowInTable( + tableName: string, + row: Record, + primaryKey: Record, + userEmail: string, + ): Promise> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.updateRowInTable, + tableName, + row, + primaryKey, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async bulkUpdateRowsInTable( + tableName: string, + newValues: Record, + primaryKeys: Array>, + userEmail: string, + ): Promise>> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.bulkUpdateRowsInTable, + tableName, + row: newValues, + primaryKey: primaryKeys, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async bulkDeleteRowsInTable( + tableName: string, + primaryKeys: Array>, + userEmail: string, + ): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.bulkDeleteRowsInTable, + tableName, + primaryKey: primaryKeys, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async validateSettings( + settings: ValidateTableSettingsDS, + tableName: string, + userEmail: string, + ): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.validateSettings, + tableName, + tableSettings: settings, + email: userEmail, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getReferencedTableNamesAndColumns( + tableName: string, + userEmail: string, + ): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getReferencedTableNamesAndColumns, + email: userEmail, + tableName, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async isView(tableName: string, userEmail: string): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.isView, + email: userEmail, + tableName, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (commandResult === null || commandResult === undefined) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async getTableRowsStream( + tableName: string, + settings: TableSettingsDS, + page: number, + perPage: number, + searchedFieldValue: string, + filteringFields: Array, + ): Promise> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.getRowsAsStream, + tableName, + tableSettings: settings, + page, + perPage, + searchedFieldValue, + filteringFields, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult?.data; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async importCSVInTable(file: Express.Multer.File, tableName: string, userEmail: string): Promise { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const stream = new Readable(); + stream.push(file.buffer); + stream.push(null); + const parser = stream.pipe(csv.parse({ columns: true })); + const rows: any[] = []; + for await (const record of parser) { + rows.push(record); + } + const rowsWithProcessedDates = await this.processTimeColumnsInRows(rows, tableName, userEmail); + const queue = new PQueue({ concurrency: 3 }); + await Promise.all( + rowsWithProcessedDates.map(async (row) => { + return await queue.add(async () => { + return await this.addRowInTable(tableName, row, userEmail); + }); + }), + ); + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + public async executeRawQuery( + query: string, + tableName: string, + userEmail: string, + ): Promise>> { + const jwtAuthToken = this.generateJWT(this.connection.token); + axios.defaults.headers.common.Authorization = `Bearer ${jwtAuthToken}`; + + return this.executeWithRetry(async () => { + try { + const { data: { commandResult } = {} } = await axios.post(this.serverAddress, { + operationType: DataAccessObjectCommandsEnum.executeRawQuery, + query, + email: userEmail, + tableName, + }); + + if (commandResult instanceof Error) { + throw new Error(commandResult.message); + } + + if (!commandResult) { + throw new Error(ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT); + } + + return commandResult?.data; + } catch (e) { + if (axios.isAxiosError(e)) { + this.checkIsErrorLocalAndThrowException(e); + throw new Error(this.extractAxiosErrorMessage(e)); + } + throw e; + } + }); + } + + private generateJWT(connectionToken: string): string { + const exp = new Date(); + exp.setDate(exp.getDate() + 60); + const secret = process.env.JWT_SECRET; + return jwt.sign( + { + token: connectionToken, + exp: Math.floor(exp.getTime() / 1000), + }, + secret, + ); + } + + private async executeWithRetry(operationFunction: () => Promise, maxRetries: number = 1): Promise { + let lastError: Error; + for (let attempt = 0; attempt <= maxRetries; attempt++) { + try { + return await operationFunction(); + } catch (e) { + lastError = e as Error; + if (e instanceof Error && e.message === ERROR_MESSAGES.CLIENT_NOT_CONNECTED && attempt < maxRetries) { + console.log(`Retry attempt ${attempt + 1} due to: ${e.message}`); + await new Promise((resolve) => setTimeout(resolve, 500)); + continue; + } + throw e; + } + } + + throw lastError; + } + + private checkIsErrorLocalAndThrowException( + e: Error & { code?: string; hostname?: string; response?: { data?: string | { error?: string }; status?: number } }, + ): void { + if (e?.message === ERROR_MESSAGES.NO_DATA_RETURNED_FROM_AGENT) { + throw new Error(e.message); + } + if (e?.code?.toLowerCase() === 'enotfound' && e?.hostname === 'autoadmin-ws.local') { + throw new Error(ERROR_MESSAGES.CANT_CONNECT_AUTOADMIN_WS); + } + + const errorMessage = this.extractAxiosErrorMessage(e); + + if (errorMessage === 'Client is not connected' || errorMessage === ERROR_MESSAGES.CLIENT_NOT_CONNECTED) { + throw new Error(ERROR_MESSAGES.CLIENT_NOT_CONNECTED); + } + + if (errorMessage) { + throw new Error(errorMessage); + } + + const status = e?.response?.status; + if (status) { + throw new Error(`Request failed with status ${status}: ${e.message}`); + } + } + + private extractAxiosErrorMessage( + e: Error & { response?: { data?: string | { error?: string; message?: string }; status?: number } }, + ): string { + const responseData = e?.response?.data; + + if (typeof responseData === 'string') { + return responseData; + } + + if (typeof responseData === 'object' && responseData !== null) { + if ('error' in responseData && typeof responseData.error === 'string') { + return responseData.error; + } + if ('message' in responseData && typeof responseData.message === 'string') { + return responseData.message; + } + } + + // Fallback to axios error message or status + if (e?.response?.status) { + return `Request failed with status ${e.response.status}`; + } + + return e?.message || 'Unknown error occurred'; + } + + private async processTimeColumnsInRows( + rows: Array>, + tableName: string, + userEmail: string, + ): Promise>> { + const tableStructure = await this.getTableStructure(tableName, userEmail); + switch (this.connection.type) { + case ConnectionTypesEnum.agent_postgres: { + const timestampColumnNamesPg = tableStructure + .filter((column) => { + return isPostgresDateOrTimeType(column.data_type); + }) + .map((column) => { + return column.column_name; + }); + return this.processPostgresDateColumnsInRows(rows, timestampColumnNamesPg); + } + + case ConnectionTypesEnum.agent_mysql: { + const timestampColumnNamesMySQL = tableStructure + .filter((column) => { + return isMySqlDateOrTimeType(column.data_type); + }) + .map((column) => { + return column.column_name; + }); + return this.processMySQLDateColumnsInRows(rows, timestampColumnNamesMySQL); + } + + case ConnectionTypesEnum.agent_mssql: { + const timestampColumnNamesMSSQL = tableStructure + .filter((column) => { + return isMSSQLDateOrTimeType(column.data_type); + }) + .map((column) => { + return column.column_name; + }); + return this.processMSSQLDateColumnsInRows(rows, timestampColumnNamesMSSQL); + } + + case ConnectionTypesEnum.agent_oracledb: { + const timestampColumnNamesOracle = tableStructure + .filter((column) => { + return isOracleDateStringByRegexp(column.data_type); + }) + .map((column) => { + return column.column_name; + }); + return this.processOracleDateColumnsInRows(rows, timestampColumnNamesOracle); + } + default: + return rows; + } + } + + private processOracleDateColumnsInRows( + rows: Array>, + timestampColumnNames: Array, + ): Array> { + for (const row of rows) { + for (const column of timestampColumnNames) { + if (row[column] && !isOracleDateStringByRegexp(row[column])) { + const date = new Date(Number(row[column])); + row[column] = formatOracleDate(date); + } + } + } + return rows; + } + + private processMySQLDateColumnsInRows( + rows: Array>, + timestampColumnNames: Array, + ): Array> { + for (const row of rows) { + for (const column of timestampColumnNames) { + if (row[column] && !isMySQLDateStringByRegexp(row[column])) { + let dateStr = row[column]; + if (dateStr.endsWith('Z')) { + dateStr = dateStr.slice(0, -1); + } + const date = new Date(dateStr); + const formattedDate = date.toISOString().slice(0, 19).replace('T', ' '); + row[column] = formattedDate; + } + } + } + return rows; + } + + private processMSSQLDateColumnsInRows(rows: Array>, timestampColumnNames: Array) { + for (const row of rows) { + for (const column of timestampColumnNames) { + if (row[column] && !isMSSQLDateStringByRegexp(row[column])) { + const date = new Date(Number(row[column])); + row[column] = date.toISOString(); + } + } + } + return rows; + } + + private processPostgresDateColumnsInRows( + rows: Array>, + timestampColumnNames: Array, + ): Array> { + for (const row of rows) { + for (const column of timestampColumnNames) { + try { + if (row[column] && !isPostgresDateStringByRegexp(row[column])) { + const date = new Date(Number(row[column])); + row[column] = date.toISOString(); + } + } catch (_error) {} + } + } + return rows; + } }