mirror of https://github.com/nocodb/nocodb
Wing-Kam Wong
2 years ago
95 changed files with 0 additions and 247042 deletions
@ -1,53 +0,0 @@
|
||||
{ |
||||
"baseUrl": "http://localhost:3000/", |
||||
"testFiles": [ |
||||
"test/restTableOps.js", |
||||
"test/restViews.js", |
||||
"test/restRoles.js", |
||||
"test/restMisc.js", |
||||
"test/xcdb-restTableOps.js", |
||||
"test/xcdb-restViews.js", |
||||
"test/xcdb-restRoles.js", |
||||
"test/xcdb-restMisc.js", |
||||
"test/pg-restTableOps.js", |
||||
"test/pg-restViews.js", |
||||
"test/pg-restRoles.js", |
||||
"test/pg-restMisc.js", |
||||
"test/quickTest.js", |
||||
"test/db-independent.js" |
||||
], |
||||
"defaultCommandTimeout": 13000, |
||||
"pageLoadTimeout": 600000, |
||||
"viewportWidth": 1980, |
||||
"viewportHeight": 1000, |
||||
"video": false, |
||||
"retries": 0, |
||||
"screenshotOnRunFailure": true, |
||||
"numTestsKeptInMemory": 0, |
||||
"experimentalInteractiveRunEvents": true, |
||||
"env": { |
||||
"testMode": [ |
||||
{ "apiType": "rest", "dbType": "xcdb" }, |
||||
{ "apiType": "rest", "dbType": "mysql" }, |
||||
{ "apiType": "rest", "dbType": "postgres" } |
||||
], |
||||
"db": { |
||||
"host": "127.0.0.1", |
||||
"user": "root", |
||||
"password": "password" |
||||
}, |
||||
"screenshot": false, |
||||
"airtable": { |
||||
"apiKey": "keyn1MR87qgyUsYg4", |
||||
"sharedBase": "https://airtable.com/shr4z0qmh6dg5s3eB" |
||||
} |
||||
}, |
||||
"fixturesFolder": "scripts/cypress/fixtures", |
||||
"integrationFolder": "scripts/cypress/integration", |
||||
"pluginsFile": "scripts/cypress/plugins/index.js", |
||||
"screenshotsFolder": "scripts/cypress/screenshots", |
||||
"videosFolder": "scripts/cypress/videos", |
||||
"downloadsFolder": "scripts/cypress/downloads", |
||||
"supportFile": "scripts/cypress/support/index.js", |
||||
"chromeWebSecurity": false |
||||
} |
@ -1,67 +0,0 @@
|
||||
version: "3.5" |
||||
|
||||
# https://github.com/docker-library/mysql/issues/149 |
||||
# disabling default sql-mode set to only_full_group_by |
||||
services: |
||||
xc-mysql-sakila-db: |
||||
network_mode: host |
||||
image: mysql:8.0 |
||||
command: mysqld --sql_mode="" |
||||
restart: always |
||||
environment: |
||||
MYSQL_ROOT_PASSWORD: password |
||||
volumes: |
||||
- ../../packages/nocodb/tests/mysql-sakila-db:/docker-entrypoint-initdb.d |
||||
|
||||
# xc-cypress-nocodb: |
||||
# network_mode: host |
||||
# image: node:14-alpine |
||||
# environment: |
||||
# - EE=true |
||||
# volumes: |
||||
# - ./packages/nocodb:/home/app |
||||
# command: |
||||
# - /bin/sh |
||||
# - -c |
||||
# - | |
||||
# echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" |
||||
# # cp -r /home/app1/ /home/app/ |
||||
# rm /home/app/package-lock.json |
||||
# rm /home/app/noco.db |
||||
# cd /home/app/ && npm i && EE=true npm run run |
||||
# # cd /home/app/ && npm i && EE=true npm run watch:run |
||||
# xc-cypress-nc-gui: |
||||
# network_mode: host |
||||
# image: node:14-alpine |
||||
# environment: |
||||
# - HOST=0.0.0.0 |
||||
# - PORT=3000 |
||||
# - EE=true |
||||
# volumes: |
||||
# - ./packages/nc-gui:/home/app |
||||
# - ./packages/nc-lib-gui:/home/nc-lib-gui |
||||
# command: |
||||
# - /bin/sh |
||||
# - -c |
||||
# - | |
||||
# echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" |
||||
# apk --update --no-cache add git |
||||
# # cp -r /home/app1/ /home/app/ |
||||
# rm /home/app/package-lock.json |
||||
# cd /home/app/ && npm i && npm run dev |
||||
# # cd /home/app/ && npm i && NODE_ENV=development npm run build && npm start |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,17 +0,0 @@
|
||||
version: "2.1" |
||||
|
||||
services: |
||||
pg96: |
||||
image: postgres:9.6 |
||||
restart: always |
||||
environment: |
||||
POSTGRES_PASSWORD: password |
||||
ports: |
||||
- 5432:5432 |
||||
volumes: |
||||
- ../../packages/nocodb/tests/pg-cy-quick:/docker-entrypoint-initdb.d |
||||
healthcheck: |
||||
test: ["CMD-SHELL", "pg_isready -U postgres"] |
||||
interval: 10s |
||||
timeout: 5s |
||||
retries: 5 |
@ -1,17 +0,0 @@
|
||||
version: "2.1" |
||||
|
||||
services: |
||||
pg96: |
||||
image: postgres:9.6 |
||||
restart: always |
||||
environment: |
||||
POSTGRES_PASSWORD: password |
||||
ports: |
||||
- 5432:5432 |
||||
volumes: |
||||
- ../../packages/nocodb/tests/pg-sakila-db:/docker-entrypoint-initdb.d |
||||
healthcheck: |
||||
test: ["CMD-SHELL", "pg_isready -U postgres"] |
||||
interval: 10s |
||||
timeout: 5s |
||||
retries: 5 |
@ -1,5 +0,0 @@
|
||||
{ |
||||
"name": "Using fixtures to represent data", |
||||
"email": "hello@cypress.io", |
||||
"body": "Fixtures are a great way to mock data for responses to routes" |
||||
} |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 20 KiB |
@ -1,5 +0,0 @@
|
||||
{ |
||||
"country": "Afghanistan", |
||||
"city": ["Kabul"] |
||||
} |
||||
|
@ -1,4 +0,0 @@
|
||||
{ |
||||
"country": "Algeria", |
||||
"city": ["Batna", "Bchar", "Skikda"] |
||||
} |
@ -1,4 +0,0 @@
|
||||
{ |
||||
"country": "Americal Samoa", |
||||
"city": ["Tafuna"] |
||||
} |
@ -1,4 +0,0 @@
|
||||
{ |
||||
"country": "Angola", |
||||
"city": ["Benguela", "Namibe"] |
||||
} |
@ -1,4 +0,0 @@
|
||||
{ |
||||
"country": "Anguilla", |
||||
"city": ["South Hill"] |
||||
} |
@ -1,4 +0,0 @@
|
||||
{ |
||||
"country": "Argentina", |
||||
"city": ["Almirante Brown", "Avellaneda", "Beha Blanca", "Crdoba"] |
||||
} |
Binary file not shown.
@ -1,16 +0,0 @@
|
||||
|
||||
<!DOCTYPE html> |
||||
<html> |
||||
<body> |
||||
|
||||
<iframe |
||||
class="nc-embed" |
||||
src="http://localhost:3000/#/nc/base/7d4b551c-b5e0-41c9-a87b-f3984c21d2c7?embed" |
||||
frameborder="0" |
||||
width="100%" |
||||
height="700" |
||||
style="background: transparent; "></iframe> |
||||
|
||||
</body> |
||||
</html> |
||||
|
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -1,854 +0,0 @@
|
||||
{ |
||||
"name": "nc-xcdb", |
||||
"version": "1.0.0", |
||||
"lockfileVersion": 1, |
||||
"requires": true, |
||||
"dependencies": { |
||||
"@gar/promisify": { |
||||
"version": "1.1.3", |
||||
"resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", |
||||
"integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", |
||||
"optional": true |
||||
}, |
||||
"@mapbox/node-pre-gyp": { |
||||
"version": "1.0.9", |
||||
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", |
||||
"integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", |
||||
"requires": { |
||||
"detect-libc": "^2.0.0", |
||||
"https-proxy-agent": "^5.0.0", |
||||
"make-dir": "^3.1.0", |
||||
"node-fetch": "^2.6.7", |
||||
"nopt": "^5.0.0", |
||||
"npmlog": "^5.0.1", |
||||
"rimraf": "^3.0.2", |
||||
"semver": "^7.3.5", |
||||
"tar": "^6.1.11" |
||||
} |
||||
}, |
||||
"@npmcli/fs": { |
||||
"version": "1.1.1", |
||||
"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", |
||||
"integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", |
||||
"optional": true, |
||||
"requires": { |
||||
"@gar/promisify": "^1.0.1", |
||||
"semver": "^7.3.5" |
||||
} |
||||
}, |
||||
"@npmcli/move-file": { |
||||
"version": "1.1.2", |
||||
"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", |
||||
"integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", |
||||
"optional": true, |
||||
"requires": { |
||||
"mkdirp": "^1.0.4", |
||||
"rimraf": "^3.0.2" |
||||
} |
||||
}, |
||||
"@tootallnate/once": { |
||||
"version": "1.1.2", |
||||
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", |
||||
"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", |
||||
"optional": true |
||||
}, |
||||
"abbrev": { |
||||
"version": "1.1.1", |
||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", |
||||
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" |
||||
}, |
||||
"agent-base": { |
||||
"version": "6.0.2", |
||||
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", |
||||
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", |
||||
"requires": { |
||||
"debug": "4" |
||||
} |
||||
}, |
||||
"agentkeepalive": { |
||||
"version": "4.2.1", |
||||
"resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", |
||||
"integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", |
||||
"optional": true, |
||||
"requires": { |
||||
"debug": "^4.1.0", |
||||
"depd": "^1.1.2", |
||||
"humanize-ms": "^1.2.1" |
||||
} |
||||
}, |
||||
"aggregate-error": { |
||||
"version": "3.1.0", |
||||
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", |
||||
"integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", |
||||
"optional": true, |
||||
"requires": { |
||||
"clean-stack": "^2.0.0", |
||||
"indent-string": "^4.0.0" |
||||
} |
||||
}, |
||||
"ansi-regex": { |
||||
"version": "5.0.1", |
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", |
||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" |
||||
}, |
||||
"aproba": { |
||||
"version": "2.0.0", |
||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", |
||||
"integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" |
||||
}, |
||||
"are-we-there-yet": { |
||||
"version": "2.0.0", |
||||
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", |
||||
"integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", |
||||
"requires": { |
||||
"delegates": "^1.0.0", |
||||
"readable-stream": "^3.6.0" |
||||
} |
||||
}, |
||||
"balanced-match": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", |
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" |
||||
}, |
||||
"brace-expansion": { |
||||
"version": "1.1.11", |
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", |
||||
"requires": { |
||||
"balanced-match": "^1.0.0", |
||||
"concat-map": "0.0.1" |
||||
} |
||||
}, |
||||
"cacache": { |
||||
"version": "15.3.0", |
||||
"resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", |
||||
"integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", |
||||
"optional": true, |
||||
"requires": { |
||||
"@npmcli/fs": "^1.0.0", |
||||
"@npmcli/move-file": "^1.0.1", |
||||
"chownr": "^2.0.0", |
||||
"fs-minipass": "^2.0.0", |
||||
"glob": "^7.1.4", |
||||
"infer-owner": "^1.0.4", |
||||
"lru-cache": "^6.0.0", |
||||
"minipass": "^3.1.1", |
||||
"minipass-collect": "^1.0.2", |
||||
"minipass-flush": "^1.0.5", |
||||
"minipass-pipeline": "^1.2.2", |
||||
"mkdirp": "^1.0.3", |
||||
"p-map": "^4.0.0", |
||||
"promise-inflight": "^1.0.1", |
||||
"rimraf": "^3.0.2", |
||||
"ssri": "^8.0.1", |
||||
"tar": "^6.0.2", |
||||
"unique-filename": "^1.1.1" |
||||
} |
||||
}, |
||||
"chownr": { |
||||
"version": "2.0.0", |
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", |
||||
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" |
||||
}, |
||||
"clean-stack": { |
||||
"version": "2.2.0", |
||||
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", |
||||
"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", |
||||
"optional": true |
||||
}, |
||||
"color-support": { |
||||
"version": "1.1.3", |
||||
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", |
||||
"integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" |
||||
}, |
||||
"concat-map": { |
||||
"version": "0.0.1", |
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", |
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" |
||||
}, |
||||
"console-control-strings": { |
||||
"version": "1.1.0", |
||||
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", |
||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" |
||||
}, |
||||
"debug": { |
||||
"version": "4.3.4", |
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", |
||||
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", |
||||
"requires": { |
||||
"ms": "2.1.2" |
||||
} |
||||
}, |
||||
"delegates": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", |
||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" |
||||
}, |
||||
"depd": { |
||||
"version": "1.1.2", |
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", |
||||
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", |
||||
"optional": true |
||||
}, |
||||
"detect-libc": { |
||||
"version": "2.0.1", |
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", |
||||
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" |
||||
}, |
||||
"emoji-regex": { |
||||
"version": "8.0.0", |
||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", |
||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" |
||||
}, |
||||
"encoding": { |
||||
"version": "0.1.13", |
||||
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", |
||||
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", |
||||
"optional": true, |
||||
"requires": { |
||||
"iconv-lite": "^0.6.2" |
||||
} |
||||
}, |
||||
"env-paths": { |
||||
"version": "2.2.1", |
||||
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", |
||||
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", |
||||
"optional": true |
||||
}, |
||||
"err-code": { |
||||
"version": "2.0.3", |
||||
"resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", |
||||
"integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", |
||||
"optional": true |
||||
}, |
||||
"fs-minipass": { |
||||
"version": "2.1.0", |
||||
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", |
||||
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", |
||||
"requires": { |
||||
"minipass": "^3.0.0" |
||||
} |
||||
}, |
||||
"fs.realpath": { |
||||
"version": "1.0.0", |
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", |
||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" |
||||
}, |
||||
"gauge": { |
||||
"version": "3.0.2", |
||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", |
||||
"integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", |
||||
"requires": { |
||||
"aproba": "^1.0.3 || ^2.0.0", |
||||
"color-support": "^1.1.2", |
||||
"console-control-strings": "^1.0.0", |
||||
"has-unicode": "^2.0.1", |
||||
"object-assign": "^4.1.1", |
||||
"signal-exit": "^3.0.0", |
||||
"string-width": "^4.2.3", |
||||
"strip-ansi": "^6.0.1", |
||||
"wide-align": "^1.1.2" |
||||
} |
||||
}, |
||||
"glob": { |
||||
"version": "7.2.0", |
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", |
||||
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", |
||||
"requires": { |
||||
"fs.realpath": "^1.0.0", |
||||
"inflight": "^1.0.4", |
||||
"inherits": "2", |
||||
"minimatch": "^3.0.4", |
||||
"once": "^1.3.0", |
||||
"path-is-absolute": "^1.0.0" |
||||
} |
||||
}, |
||||
"graceful-fs": { |
||||
"version": "4.2.10", |
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", |
||||
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", |
||||
"optional": true |
||||
}, |
||||
"has-unicode": { |
||||
"version": "2.0.1", |
||||
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", |
||||
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" |
||||
}, |
||||
"http-cache-semantics": { |
||||
"version": "4.1.0", |
||||
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", |
||||
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", |
||||
"optional": true |
||||
}, |
||||
"http-proxy-agent": { |
||||
"version": "4.0.1", |
||||
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", |
||||
"integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", |
||||
"optional": true, |
||||
"requires": { |
||||
"@tootallnate/once": "1", |
||||
"agent-base": "6", |
||||
"debug": "4" |
||||
} |
||||
}, |
||||
"https-proxy-agent": { |
||||
"version": "5.0.1", |
||||
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", |
||||
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", |
||||
"requires": { |
||||
"agent-base": "6", |
||||
"debug": "4" |
||||
} |
||||
}, |
||||
"humanize-ms": { |
||||
"version": "1.2.1", |
||||
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", |
||||
"integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", |
||||
"optional": true, |
||||
"requires": { |
||||
"ms": "^2.0.0" |
||||
} |
||||
}, |
||||
"iconv-lite": { |
||||
"version": "0.6.3", |
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", |
||||
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", |
||||
"optional": true, |
||||
"requires": { |
||||
"safer-buffer": ">= 2.1.2 < 3.0.0" |
||||
} |
||||
}, |
||||
"imurmurhash": { |
||||
"version": "0.1.4", |
||||
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", |
||||
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", |
||||
"optional": true |
||||
}, |
||||
"indent-string": { |
||||
"version": "4.0.0", |
||||
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", |
||||
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", |
||||
"optional": true |
||||
}, |
||||
"infer-owner": { |
||||
"version": "1.0.4", |
||||
"resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", |
||||
"integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", |
||||
"optional": true |
||||
}, |
||||
"inflight": { |
||||
"version": "1.0.6", |
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", |
||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", |
||||
"requires": { |
||||
"once": "^1.3.0", |
||||
"wrappy": "1" |
||||
} |
||||
}, |
||||
"inherits": { |
||||
"version": "2.0.4", |
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", |
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" |
||||
}, |
||||
"ip": { |
||||
"version": "1.1.5", |
||||
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", |
||||
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", |
||||
"optional": true |
||||
}, |
||||
"is-fullwidth-code-point": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", |
||||
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" |
||||
}, |
||||
"is-lambda": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", |
||||
"integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", |
||||
"optional": true |
||||
}, |
||||
"isexe": { |
||||
"version": "2.0.0", |
||||
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", |
||||
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", |
||||
"optional": true |
||||
}, |
||||
"lru-cache": { |
||||
"version": "6.0.0", |
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", |
||||
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", |
||||
"requires": { |
||||
"yallist": "^4.0.0" |
||||
} |
||||
}, |
||||
"make-dir": { |
||||
"version": "3.1.0", |
||||
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", |
||||
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", |
||||
"requires": { |
||||
"semver": "^6.0.0" |
||||
}, |
||||
"dependencies": { |
||||
"semver": { |
||||
"version": "6.3.0", |
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", |
||||
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" |
||||
} |
||||
} |
||||
}, |
||||
"make-fetch-happen": { |
||||
"version": "9.1.0", |
||||
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", |
||||
"integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", |
||||
"optional": true, |
||||
"requires": { |
||||
"agentkeepalive": "^4.1.3", |
||||
"cacache": "^15.2.0", |
||||
"http-cache-semantics": "^4.1.0", |
||||
"http-proxy-agent": "^4.0.1", |
||||
"https-proxy-agent": "^5.0.0", |
||||
"is-lambda": "^1.0.1", |
||||
"lru-cache": "^6.0.0", |
||||
"minipass": "^3.1.3", |
||||
"minipass-collect": "^1.0.2", |
||||
"minipass-fetch": "^1.3.2", |
||||
"minipass-flush": "^1.0.5", |
||||
"minipass-pipeline": "^1.2.4", |
||||
"negotiator": "^0.6.2", |
||||
"promise-retry": "^2.0.1", |
||||
"socks-proxy-agent": "^6.0.0", |
||||
"ssri": "^8.0.0" |
||||
} |
||||
}, |
||||
"minimatch": { |
||||
"version": "3.1.2", |
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", |
||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", |
||||
"requires": { |
||||
"brace-expansion": "^1.1.7" |
||||
} |
||||
}, |
||||
"minipass": { |
||||
"version": "3.1.6", |
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", |
||||
"integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", |
||||
"requires": { |
||||
"yallist": "^4.0.0" |
||||
} |
||||
}, |
||||
"minipass-collect": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", |
||||
"integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", |
||||
"optional": true, |
||||
"requires": { |
||||
"minipass": "^3.0.0" |
||||
} |
||||
}, |
||||
"minipass-fetch": { |
||||
"version": "1.4.1", |
||||
"resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", |
||||
"integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", |
||||
"optional": true, |
||||
"requires": { |
||||
"encoding": "^0.1.12", |
||||
"minipass": "^3.1.0", |
||||
"minipass-sized": "^1.0.3", |
||||
"minizlib": "^2.0.0" |
||||
} |
||||
}, |
||||
"minipass-flush": { |
||||
"version": "1.0.5", |
||||
"resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", |
||||
"integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", |
||||
"optional": true, |
||||
"requires": { |
||||
"minipass": "^3.0.0" |
||||
} |
||||
}, |
||||
"minipass-pipeline": { |
||||
"version": "1.2.4", |
||||
"resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", |
||||
"integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", |
||||
"optional": true, |
||||
"requires": { |
||||
"minipass": "^3.0.0" |
||||
} |
||||
}, |
||||
"minipass-sized": { |
||||
"version": "1.0.3", |
||||
"resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", |
||||
"integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", |
||||
"optional": true, |
||||
"requires": { |
||||
"minipass": "^3.0.0" |
||||
} |
||||
}, |
||||
"minizlib": { |
||||
"version": "2.1.2", |
||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", |
||||
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", |
||||
"requires": { |
||||
"minipass": "^3.0.0", |
||||
"yallist": "^4.0.0" |
||||
} |
||||
}, |
||||
"mkdirp": { |
||||
"version": "1.0.4", |
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", |
||||
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" |
||||
}, |
||||
"ms": { |
||||
"version": "2.1.2", |
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", |
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" |
||||
}, |
||||
"negotiator": { |
||||
"version": "0.6.3", |
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", |
||||
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", |
||||
"optional": true |
||||
}, |
||||
"node-addon-api": { |
||||
"version": "4.3.0", |
||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", |
||||
"integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" |
||||
}, |
||||
"node-fetch": { |
||||
"version": "2.6.7", |
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", |
||||
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", |
||||
"requires": { |
||||
"whatwg-url": "^5.0.0" |
||||
} |
||||
}, |
||||
"node-gyp": { |
||||
"version": "8.4.1", |
||||
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", |
||||
"integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", |
||||
"optional": true, |
||||
"requires": { |
||||
"env-paths": "^2.2.0", |
||||
"glob": "^7.1.4", |
||||
"graceful-fs": "^4.2.6", |
||||
"make-fetch-happen": "^9.1.0", |
||||
"nopt": "^5.0.0", |
||||
"npmlog": "^6.0.0", |
||||
"rimraf": "^3.0.2", |
||||
"semver": "^7.3.5", |
||||
"tar": "^6.1.2", |
||||
"which": "^2.0.2" |
||||
}, |
||||
"dependencies": { |
||||
"are-we-there-yet": { |
||||
"version": "3.0.0", |
||||
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", |
||||
"integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", |
||||
"optional": true, |
||||
"requires": { |
||||
"delegates": "^1.0.0", |
||||
"readable-stream": "^3.6.0" |
||||
} |
||||
}, |
||||
"gauge": { |
||||
"version": "4.0.4", |
||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", |
||||
"integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", |
||||
"optional": true, |
||||
"requires": { |
||||
"aproba": "^1.0.3 || ^2.0.0", |
||||
"color-support": "^1.1.3", |
||||
"console-control-strings": "^1.1.0", |
||||
"has-unicode": "^2.0.1", |
||||
"signal-exit": "^3.0.7", |
||||
"string-width": "^4.2.3", |
||||
"strip-ansi": "^6.0.1", |
||||
"wide-align": "^1.1.5" |
||||
} |
||||
}, |
||||
"npmlog": { |
||||
"version": "6.0.2", |
||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", |
||||
"integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", |
||||
"optional": true, |
||||
"requires": { |
||||
"are-we-there-yet": "^3.0.0", |
||||
"console-control-strings": "^1.1.0", |
||||
"gauge": "^4.0.3", |
||||
"set-blocking": "^2.0.0" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"nopt": { |
||||
"version": "5.0.0", |
||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", |
||||
"integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", |
||||
"requires": { |
||||
"abbrev": "1" |
||||
} |
||||
}, |
||||
"npmlog": { |
||||
"version": "5.0.1", |
||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", |
||||
"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", |
||||
"requires": { |
||||
"are-we-there-yet": "^2.0.0", |
||||
"console-control-strings": "^1.1.0", |
||||
"gauge": "^3.0.0", |
||||
"set-blocking": "^2.0.0" |
||||
} |
||||
}, |
||||
"object-assign": { |
||||
"version": "4.1.1", |
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", |
||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" |
||||
}, |
||||
"once": { |
||||
"version": "1.4.0", |
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", |
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", |
||||
"requires": { |
||||
"wrappy": "1" |
||||
} |
||||
}, |
||||
"p-map": { |
||||
"version": "4.0.0", |
||||
"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", |
||||
"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", |
||||
"optional": true, |
||||
"requires": { |
||||
"aggregate-error": "^3.0.0" |
||||
} |
||||
}, |
||||
"path-is-absolute": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", |
||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" |
||||
}, |
||||
"promise-inflight": { |
||||
"version": "1.0.1", |
||||
"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", |
||||
"integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", |
||||
"optional": true |
||||
}, |
||||
"promise-retry": { |
||||
"version": "2.0.1", |
||||
"resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", |
||||
"integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", |
||||
"optional": true, |
||||
"requires": { |
||||
"err-code": "^2.0.2", |
||||
"retry": "^0.12.0" |
||||
} |
||||
}, |
||||
"readable-stream": { |
||||
"version": "3.6.0", |
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", |
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", |
||||
"requires": { |
||||
"inherits": "^2.0.3", |
||||
"string_decoder": "^1.1.1", |
||||
"util-deprecate": "^1.0.1" |
||||
} |
||||
}, |
||||
"retry": { |
||||
"version": "0.12.0", |
||||
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", |
||||
"integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", |
||||
"optional": true |
||||
}, |
||||
"rimraf": { |
||||
"version": "3.0.2", |
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", |
||||
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", |
||||
"requires": { |
||||
"glob": "^7.1.3" |
||||
} |
||||
}, |
||||
"safe-buffer": { |
||||
"version": "5.2.1", |
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", |
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" |
||||
}, |
||||
"safer-buffer": { |
||||
"version": "2.1.2", |
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", |
||||
"optional": true |
||||
}, |
||||
"semver": { |
||||
"version": "7.3.7", |
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", |
||||
"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", |
||||
"requires": { |
||||
"lru-cache": "^6.0.0" |
||||
} |
||||
}, |
||||
"set-blocking": { |
||||
"version": "2.0.0", |
||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", |
||||
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" |
||||
}, |
||||
"signal-exit": { |
||||
"version": "3.0.7", |
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", |
||||
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" |
||||
}, |
||||
"smart-buffer": { |
||||
"version": "4.2.0", |
||||
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", |
||||
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", |
||||
"optional": true |
||||
}, |
||||
"socks": { |
||||
"version": "2.6.2", |
||||
"resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", |
||||
"integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", |
||||
"optional": true, |
||||
"requires": { |
||||
"ip": "^1.1.5", |
||||
"smart-buffer": "^4.2.0" |
||||
} |
||||
}, |
||||
"socks-proxy-agent": { |
||||
"version": "6.2.0", |
||||
"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", |
||||
"integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", |
||||
"optional": true, |
||||
"requires": { |
||||
"agent-base": "^6.0.2", |
||||
"debug": "^4.3.3", |
||||
"socks": "^2.6.2" |
||||
} |
||||
}, |
||||
"sqlite3": { |
||||
"version": "5.0.3", |
||||
"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.3.tgz", |
||||
"integrity": "sha512-/cDwes7XtTOtKH5zYeJSuiavuaJ6jXxPjebw9lDFxBAwR/DvP0tnJ5MPZQ3zpnNzJBa1G6mPTpB+5O1T+AoSdQ==", |
||||
"requires": { |
||||
"@mapbox/node-pre-gyp": "^1.0.0", |
||||
"node-addon-api": "^4.2.0", |
||||
"node-gyp": "8.x", |
||||
"tar": "^6.1.11" |
||||
} |
||||
}, |
||||
"ssri": { |
||||
"version": "8.0.1", |
||||
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", |
||||
"integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", |
||||
"optional": true, |
||||
"requires": { |
||||
"minipass": "^3.1.1" |
||||
} |
||||
}, |
||||
"string-width": { |
||||
"version": "4.2.3", |
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", |
||||
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", |
||||
"requires": { |
||||
"emoji-regex": "^8.0.0", |
||||
"is-fullwidth-code-point": "^3.0.0", |
||||
"strip-ansi": "^6.0.1" |
||||
} |
||||
}, |
||||
"string_decoder": { |
||||
"version": "1.3.0", |
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", |
||||
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", |
||||
"requires": { |
||||
"safe-buffer": "~5.2.0" |
||||
} |
||||
}, |
||||
"strip-ansi": { |
||||
"version": "6.0.1", |
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", |
||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", |
||||
"requires": { |
||||
"ansi-regex": "^5.0.1" |
||||
} |
||||
}, |
||||
"tar": { |
||||
"version": "6.1.11", |
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", |
||||
"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", |
||||
"requires": { |
||||
"chownr": "^2.0.0", |
||||
"fs-minipass": "^2.0.0", |
||||
"minipass": "^3.0.0", |
||||
"minizlib": "^2.1.1", |
||||
"mkdirp": "^1.0.3", |
||||
"yallist": "^4.0.0" |
||||
} |
||||
}, |
||||
"tr46": { |
||||
"version": "0.0.3", |
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", |
||||
"integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" |
||||
}, |
||||
"unique-filename": { |
||||
"version": "1.1.1", |
||||
"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", |
||||
"integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", |
||||
"optional": true, |
||||
"requires": { |
||||
"unique-slug": "^2.0.0" |
||||
} |
||||
}, |
||||
"unique-slug": { |
||||
"version": "2.0.2", |
||||
"resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", |
||||
"integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", |
||||
"optional": true, |
||||
"requires": { |
||||
"imurmurhash": "^0.1.4" |
||||
} |
||||
}, |
||||
"util-deprecate": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", |
||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" |
||||
}, |
||||
"webidl-conversions": { |
||||
"version": "3.0.1", |
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", |
||||
"integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" |
||||
}, |
||||
"whatwg-url": { |
||||
"version": "5.0.0", |
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", |
||||
"integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", |
||||
"requires": { |
||||
"tr46": "~0.0.3", |
||||
"webidl-conversions": "^3.0.0" |
||||
} |
||||
}, |
||||
"which": { |
||||
"version": "2.0.2", |
||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", |
||||
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", |
||||
"optional": true, |
||||
"requires": { |
||||
"isexe": "^2.0.0" |
||||
} |
||||
}, |
||||
"wide-align": { |
||||
"version": "1.1.5", |
||||
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", |
||||
"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", |
||||
"requires": { |
||||
"string-width": "^1.0.2 || 2 || 3 || 4" |
||||
} |
||||
}, |
||||
"wrappy": { |
||||
"version": "1.0.2", |
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", |
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" |
||||
}, |
||||
"yallist": { |
||||
"version": "4.0.0", |
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", |
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" |
||||
} |
||||
} |
||||
} |
@ -1,14 +0,0 @@
|
||||
{ |
||||
"name": "nc-xcdb", |
||||
"version": "1.0.0", |
||||
"description": "", |
||||
"main": "index.js", |
||||
"scripts": { |
||||
"test": "echo \"Error: no test specified\" && exit 1" |
||||
}, |
||||
"author": "", |
||||
"license": "ISC", |
||||
"dependencies": { |
||||
"sqlite3": "^5.0.3" |
||||
} |
||||
} |
@ -1,6 +0,0 @@
|
||||
#!/bin/bash |
||||
set -v |
||||
|
||||
rm sakila.db |
||||
sqlite3 sakila.db < ./sqlite-sakila-schema.sql |
||||
sqlite3 sakila.db < ./sqlite-sakila-insert-data.sql |
@ -1,45 +0,0 @@
|
||||
/* |
||||
|
||||
Sakila for SQLite is a port of the Sakila example database available for MySQL, which was originally developed by Mike Hillyer of the MySQL AB documentation team. |
||||
This project is designed to help database administrators to decide which database to use for development of new products |
||||
The user can run the same SQL against different kind of databases and compare the performance |
||||
|
||||
License: BSD |
||||
Copyright DB Software Laboratory |
||||
http://www.etl-tools.com |
||||
|
||||
*/ |
||||
|
||||
-- Delete data |
||||
DELETE FROM payment |
||||
; |
||||
DELETE FROM rental |
||||
; |
||||
DELETE FROM customer |
||||
; |
||||
DELETE FROM film_category |
||||
; |
||||
DELETE FROM film_text |
||||
; |
||||
DELETE FROM film_actor |
||||
; |
||||
DELETE FROM inventory |
||||
; |
||||
DELETE FROM film |
||||
; |
||||
DELETE FROM category |
||||
; |
||||
DELETE FROM staff |
||||
; |
||||
DELETE FROM store |
||||
; |
||||
DELETE FROM actor |
||||
; |
||||
DELETE FROM address |
||||
; |
||||
DELETE FROM city |
||||
; |
||||
DELETE FROM country |
||||
; |
||||
DELETE FROM language |
||||
; |
@ -1,70 +0,0 @@
|
||||
/* |
||||
|
||||
Sakila for SQLite is a port of the Sakila example database available for MySQL, which was originally developed by Mike Hillyer of the MySQL AB documentation team. |
||||
This project is designed to help database administrators to decide which database to use for development of new products |
||||
The user can run the same SQL against different kind of databases and compare the performance |
||||
|
||||
License: BSD |
||||
Copyright DB Software Laboratory |
||||
http://www.etl-tools.com |
||||
|
||||
*/ |
||||
|
||||
-- Drop Views |
||||
|
||||
DROP VIEW customer_list |
||||
; |
||||
DROP VIEW film_list |
||||
; |
||||
--DROP VIEW nicer_but_slower_film_list; |
||||
DROP VIEW sales_by_film_category |
||||
; |
||||
DROP VIEW sales_by_store |
||||
; |
||||
DROP VIEW staff_list |
||||
; |
||||
|
||||
-- Drop Tables |
||||
|
||||
DROP TABLE payment |
||||
; |
||||
DROP TABLE rental |
||||
; |
||||
DROP TABLE inventory |
||||
; |
||||
DROP TABLE film_text |
||||
; |
||||
DROP TABLE film_category |
||||
; |
||||
DROP TABLE film_actor |
||||
; |
||||
DROP TABLE film |
||||
; |
||||
DROP TABLE language |
||||
; |
||||
DROP TABLE customer |
||||
; |
||||
DROP TABLE actor |
||||
; |
||||
DROP TABLE category |
||||
; |
||||
DROP TABLE store |
||||
; |
||||
DROP TABLE address |
||||
; |
||||
DROP TABLE staff |
||||
; |
||||
DROP TABLE city |
||||
; |
||||
DROP TABLE country |
||||
; |
||||
|
||||
-- Procedures and views |
||||
--drop procedure film_in_stock; |
||||
--drop procedure film_not_in_stock; |
||||
--drop function get_customer_balance; |
||||
--drop function inventory_held_by_customer; |
||||
--drop function inventory_in_stock; |
||||
--drop procedure rewards_report; |
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,647 +0,0 @@
|
||||
/* |
||||
|
||||
Sakila for SQLite is a port of the Sakila example database available for MySQL, which was originally developed by Mike Hillyer of the MySQL AB documentation team. |
||||
This project is designed to help database administrators to decide which database to use for development of new products |
||||
The user can run the same SQL against different kind of databases and compare the performance |
||||
|
||||
License: BSD |
||||
Copyright DB Software Laboratory |
||||
http://www.etl-tools.com |
||||
|
||||
*/ |
||||
|
||||
-- |
||||
-- Table structure for table actor |
||||
-- |
||||
--DROP TABLE actor; |
||||
|
||||
BEGIN TRANSACTION; |
||||
|
||||
CREATE TABLE actor ( |
||||
actor_id integer PRIMARY KEY AUTOINCREMENT NOT NULL, |
||||
first_name VARCHAR(45) NOT NULL, |
||||
last_name VARCHAR(45) NOT NULL, |
||||
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
||||
) |
||||
; |
||||
|
||||
CREATE INDEX idx_actor_last_name ON actor(last_name) |
||||
; |
||||
|
||||
CREATE TRIGGER actor_trigger_ai AFTER INSERT ON actor |
||||
BEGIN |
||||
UPDATE actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER actor_trigger_au AFTER UPDATE ON actor |
||||
BEGIN |
||||
UPDATE actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table country |
||||
-- |
||||
|
||||
CREATE TABLE country ( |
||||
country_id INTEGER NOT NULL, |
||||
country VARCHAR(50) NOT NULL, |
||||
last_update TIMESTAMP, |
||||
PRIMARY KEY (country_id) |
||||
) |
||||
; |
||||
|
||||
CREATE TRIGGER country_trigger_ai AFTER INSERT ON country |
||||
BEGIN |
||||
UPDATE country SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER country_trigger_au AFTER UPDATE ON country |
||||
BEGIN |
||||
UPDATE country SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table city |
||||
-- |
||||
|
||||
CREATE TABLE city ( |
||||
city_id INTEGER NOT NULL, |
||||
city VARCHAR(50) NOT NULL, |
||||
country_id INTEGER NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (city_id), |
||||
CONSTRAINT fk_city_country FOREIGN KEY (country_id) REFERENCES country (country_id) ON DELETE NO ACTION ON UPDATE CASCADE |
||||
) |
||||
; |
||||
CREATE INDEX idx_fk_country_id ON city(country_id) |
||||
; |
||||
|
||||
CREATE TRIGGER city_trigger_ai AFTER INSERT ON city |
||||
BEGIN |
||||
UPDATE city SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER city_trigger_au AFTER UPDATE ON city |
||||
BEGIN |
||||
UPDATE city SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table address |
||||
-- |
||||
|
||||
CREATE TABLE address ( |
||||
address_id INTEGER NOT NULL, |
||||
address VARCHAR(50) NOT NULL, |
||||
address2 VARCHAR(50) DEFAULT NULL, |
||||
district VARCHAR(20) NOT NULL, |
||||
city_id INTEGER NOT NULL, |
||||
postal_code VARCHAR(10) DEFAULT NULL, |
||||
phone VARCHAR(20) NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (address_id), |
||||
CONSTRAINT fk_address_city FOREIGN KEY (city_id) REFERENCES city (city_id) ON DELETE NO ACTION ON UPDATE CASCADE |
||||
) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_city_id ON address(city_id) |
||||
; |
||||
|
||||
CREATE TRIGGER address_trigger_ai AFTER INSERT ON address |
||||
BEGIN |
||||
UPDATE address SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER address_trigger_au AFTER UPDATE ON address |
||||
BEGIN |
||||
UPDATE address SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table language |
||||
-- |
||||
|
||||
CREATE TABLE language ( |
||||
language_id INTEGER NOT NULL , |
||||
name CHAR(20) NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (language_id) |
||||
) |
||||
; |
||||
|
||||
CREATE TRIGGER language_trigger_ai AFTER INSERT ON language |
||||
BEGIN |
||||
UPDATE language SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER language_trigger_au AFTER UPDATE ON language |
||||
BEGIN |
||||
UPDATE language SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table category |
||||
-- |
||||
|
||||
CREATE TABLE category ( |
||||
category_id INTEGER NOT NULL, |
||||
name VARCHAR(25) NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (category_id) |
||||
); |
||||
|
||||
CREATE TRIGGER category_trigger_ai AFTER INSERT ON category |
||||
BEGIN |
||||
UPDATE category SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER category_trigger_au AFTER UPDATE ON category |
||||
BEGIN |
||||
UPDATE category SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table customer |
||||
-- |
||||
|
||||
CREATE TABLE customer ( |
||||
customer_id INTEGER NOT NULL, |
||||
store_id INTEGER NOT NULL, |
||||
first_name VARCHAR(45) NOT NULL, |
||||
last_name VARCHAR(45) NOT NULL, |
||||
email VARCHAR(50) DEFAULT NULL, |
||||
address_id INTEGER NOT NULL, |
||||
active CHAR(1) DEFAULT 'Y' NOT NULL, |
||||
create_date TIMESTAMP NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (customer_id), |
||||
CONSTRAINT fk_customer_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE NO ACTION ON UPDATE CASCADE, |
||||
CONSTRAINT fk_customer_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE NO ACTION ON UPDATE CASCADE |
||||
) |
||||
; |
||||
|
||||
CREATE INDEX idx_customer_fk_store_id ON customer(store_id) |
||||
; |
||||
CREATE INDEX idx_customer_fk_address_id ON customer(address_id) |
||||
; |
||||
CREATE INDEX idx_customer_last_name ON customer(last_name) |
||||
; |
||||
|
||||
CREATE TRIGGER customer_trigger_ai AFTER INSERT ON customer |
||||
BEGIN |
||||
UPDATE customer SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER customer_trigger_au AFTER UPDATE ON customer |
||||
BEGIN |
||||
UPDATE customer SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table film |
||||
-- |
||||
|
||||
CREATE TABLE film ( |
||||
film_id INTEGER NOT NULL, |
||||
title VARCHAR(255) NOT NULL, |
||||
description BLOB SUB_TYPE TEXT DEFAULT NULL, |
||||
release_year VARCHAR(4) DEFAULT NULL, |
||||
language_id INTEGER NOT NULL, |
||||
original_language_id INTEGER DEFAULT NULL, |
||||
rental_duration INTEGER DEFAULT 3 NOT NULL, |
||||
rental_rate DECIMAL(4,2) DEFAULT 4.99 NOT NULL, |
||||
length INTEGER DEFAULT NULL, |
||||
replacement_cost DECIMAL(5,2) DEFAULT 19.99 NOT NULL, |
||||
rating VARCHAR(10) DEFAULT 'G', |
||||
special_features VARCHAR(100) DEFAULT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (film_id), |
||||
CONSTRAINT CHECK_special_features CHECK(special_features is null or |
||||
special_features like '%Trailers%' or |
||||
special_features like '%Commentaries%' or |
||||
special_features like '%Deleted Scenes%' or |
||||
special_features like '%Behind the Scenes%'), |
||||
CONSTRAINT CHECK_special_rating CHECK(rating in ('G','PG','PG-13','R','NC-17')), |
||||
CONSTRAINT fk_film_language FOREIGN KEY (language_id) REFERENCES language (language_id) , |
||||
CONSTRAINT fk_film_language_original FOREIGN KEY (original_language_id) REFERENCES language (language_id) |
||||
) |
||||
; |
||||
CREATE INDEX idx_fk_language_id ON film(language_id) |
||||
; |
||||
CREATE INDEX idx_fk_original_language_id ON film(original_language_id) |
||||
; |
||||
|
||||
CREATE TRIGGER film_trigger_ai AFTER INSERT ON film |
||||
BEGIN |
||||
UPDATE film SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER film_trigger_au AFTER UPDATE ON film |
||||
BEGIN |
||||
UPDATE film SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table film_actor |
||||
-- |
||||
|
||||
CREATE TABLE film_actor ( |
||||
actor_id INTEGER NOT NULL, |
||||
film_id INTEGER NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (actor_id,film_id), |
||||
CONSTRAINT fk_film_actor_actor FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE NO ACTION ON UPDATE CASCADE, |
||||
CONSTRAINT fk_film_actor_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE NO ACTION ON UPDATE CASCADE |
||||
) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_film_actor_film ON film_actor(film_id) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_film_actor_actor ON film_actor(actor_id) |
||||
; |
||||
|
||||
CREATE TRIGGER film_actor_trigger_ai AFTER INSERT ON film_actor |
||||
BEGIN |
||||
UPDATE film_actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER film_actor_trigger_au AFTER UPDATE ON film_actor |
||||
BEGIN |
||||
UPDATE film_actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
|
||||
-- |
||||
-- Table structure for table film_category |
||||
-- |
||||
|
||||
CREATE TABLE film_category ( |
||||
film_id INTEGER NOT NULL, |
||||
category_id INTEGER NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (film_id, category_id), |
||||
CONSTRAINT fk_film_category_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE NO ACTION ON UPDATE CASCADE, |
||||
CONSTRAINT fk_film_category_category FOREIGN KEY (category_id) REFERENCES category (category_id) ON DELETE NO ACTION ON UPDATE CASCADE |
||||
) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_film_category_film ON film_category(film_id) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_film_category_category ON film_category(category_id) |
||||
; |
||||
|
||||
CREATE TRIGGER film_category_trigger_ai AFTER INSERT ON film_category |
||||
BEGIN |
||||
UPDATE film_category SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER film_category_trigger_au AFTER UPDATE ON film_category |
||||
BEGIN |
||||
UPDATE film_category SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table film_text |
||||
-- |
||||
|
||||
CREATE TABLE film_text ( |
||||
film_id INTEGER NOT NULL, |
||||
title VARCHAR(255) NOT NULL, |
||||
description BLOB SUB_TYPE TEXT, |
||||
PRIMARY KEY (film_id) |
||||
) |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table inventory |
||||
-- |
||||
|
||||
CREATE TABLE inventory ( |
||||
inventory_id INTEGER NOT NULL, |
||||
film_id INTEGER NOT NULL, |
||||
store_id INTEGER NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (inventory_id), |
||||
CONSTRAINT fk_inventory_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE NO ACTION ON UPDATE CASCADE, |
||||
CONSTRAINT fk_inventory_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE NO ACTION ON UPDATE CASCADE |
||||
) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_film_id ON inventory(film_id) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_film_id_store_id ON inventory(store_id,film_id) |
||||
; |
||||
|
||||
CREATE TRIGGER inventory_trigger_ai AFTER INSERT ON inventory |
||||
BEGIN |
||||
UPDATE inventory SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER inventory_trigger_au AFTER UPDATE ON inventory |
||||
BEGIN |
||||
UPDATE inventory SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table staff |
||||
-- |
||||
|
||||
CREATE TABLE staff ( |
||||
staff_id INTEGER NOT NULL, |
||||
first_name VARCHAR(45) NOT NULL, |
||||
last_name VARCHAR(45) NOT NULL, |
||||
address_id INTEGER NOT NULL, |
||||
picture BLOB DEFAULT NULL, |
||||
email VARCHAR(50) DEFAULT NULL, |
||||
store_id INTEGER NOT NULL, |
||||
active INTEGER DEFAULT 1 NOT NULL, |
||||
username VARCHAR(16) NOT NULL, |
||||
password VARCHAR(40) DEFAULT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (staff_id), |
||||
CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE NO ACTION ON UPDATE CASCADE, |
||||
CONSTRAINT fk_staff_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE NO ACTION ON UPDATE CASCADE |
||||
) |
||||
; |
||||
CREATE INDEX idx_fk_staff_store_id ON staff(store_id) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_staff_address_id ON staff(address_id) |
||||
; |
||||
|
||||
CREATE TRIGGER staff_trigger_ai AFTER INSERT ON staff |
||||
BEGIN |
||||
UPDATE staff SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER staff_trigger_au AFTER UPDATE ON staff |
||||
BEGIN |
||||
UPDATE staff SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table store |
||||
-- |
||||
|
||||
CREATE TABLE store ( |
||||
store_id INTEGER NOT NULL, |
||||
manager_staff_id INTEGER NOT NULL, |
||||
address_id INTEGER NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (store_id), |
||||
CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) , |
||||
CONSTRAINT fk_store_address FOREIGN KEY (address_id) REFERENCES address (address_id) |
||||
) |
||||
; |
||||
|
||||
CREATE INDEX idx_store_fk_manager_staff_id ON store(manager_staff_id) |
||||
; |
||||
|
||||
CREATE INDEX idx_fk_store_address ON store(address_id) |
||||
; |
||||
|
||||
CREATE TRIGGER store_trigger_ai AFTER INSERT ON store |
||||
BEGIN |
||||
UPDATE store SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER store_trigger_au AFTER UPDATE ON store |
||||
BEGIN |
||||
UPDATE store SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
-- |
||||
-- Table structure for table payment |
||||
-- |
||||
|
||||
CREATE TABLE payment ( |
||||
payment_id INTEGER NOT NULL, |
||||
customer_id INTEGER NOT NULL, |
||||
staff_id INTEGER NOT NULL, |
||||
rental_id INTEGER DEFAULT NULL, |
||||
amount DECIMAL(5,2) NOT NULL, |
||||
payment_date TIMESTAMP NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (payment_id), |
||||
CONSTRAINT fk_payment_rental FOREIGN KEY (rental_id) REFERENCES rental (rental_id) ON DELETE SET NULL ON UPDATE CASCADE, |
||||
CONSTRAINT fk_payment_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) , |
||||
CONSTRAINT fk_payment_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) |
||||
) |
||||
; |
||||
CREATE INDEX idx_fk_staff_id ON payment(staff_id) |
||||
; |
||||
CREATE INDEX idx_fk_customer_id ON payment(customer_id) |
||||
; |
||||
|
||||
CREATE TRIGGER payment_trigger_ai AFTER INSERT ON payment |
||||
BEGIN |
||||
UPDATE payment SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER payment_trigger_au AFTER UPDATE ON payment |
||||
BEGIN |
||||
UPDATE payment SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TABLE rental ( |
||||
rental_id INTEGER NOT NULL, |
||||
rental_date TIMESTAMP NOT NULL, |
||||
inventory_id INTEGER NOT NULL, |
||||
customer_id INTEGER NOT NULL, |
||||
return_date TIMESTAMP DEFAULT NULL, |
||||
staff_id INTEGER NOT NULL, |
||||
last_update TIMESTAMP NOT NULL, |
||||
PRIMARY KEY (rental_id), |
||||
CONSTRAINT fk_rental_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) , |
||||
CONSTRAINT fk_rental_inventory FOREIGN KEY (inventory_id) REFERENCES inventory (inventory_id) , |
||||
CONSTRAINT fk_rental_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) |
||||
) |
||||
; |
||||
CREATE INDEX idx_rental_fk_inventory_id ON rental(inventory_id) |
||||
; |
||||
CREATE INDEX idx_rental_fk_customer_id ON rental(customer_id) |
||||
; |
||||
CREATE INDEX idx_rental_fk_staff_id ON rental(staff_id) |
||||
; |
||||
CREATE UNIQUE INDEX idx_rental_uq ON rental (rental_date,inventory_id,customer_id) |
||||
; |
||||
|
||||
CREATE TRIGGER rental_trigger_ai AFTER INSERT ON rental |
||||
BEGIN |
||||
UPDATE rental SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
|
||||
CREATE TRIGGER rental_trigger_au AFTER UPDATE ON rental |
||||
BEGIN |
||||
UPDATE rental SET last_update = DATETIME('NOW') WHERE rowid = new.rowid; |
||||
END |
||||
; |
||||
-- |
||||
-- View structure for view customer_list |
||||
-- |
||||
|
||||
CREATE VIEW customer_list |
||||
AS |
||||
SELECT cu.customer_id AS ID, |
||||
cu.first_name||' '||cu.last_name AS name, |
||||
a.address AS address, |
||||
a.postal_code AS zip_code, |
||||
a.phone AS phone, |
||||
city.city AS city, |
||||
country.country AS country, |
||||
case when cu.active=1 then 'active' else '' end AS notes, |
||||
cu.store_id AS SID |
||||
FROM customer AS cu JOIN address AS a ON cu.address_id = a.address_id JOIN city ON a.city_id = city.city_id |
||||
JOIN country ON city.country_id = country.country_id |
||||
; |
||||
-- |
||||
-- View structure for view film_list |
||||
-- |
||||
|
||||
CREATE VIEW film_list |
||||
AS |
||||
SELECT film.film_id AS FID, |
||||
film.title AS title, |
||||
film.description AS description, |
||||
category.name AS category, |
||||
film.rental_rate AS price, |
||||
film.length AS length, |
||||
film.rating AS rating, |
||||
actor.first_name||' '||actor.last_name AS actors |
||||
FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id |
||||
JOIN film_actor ON film.film_id = film_actor.film_id |
||||
JOIN actor ON film_actor.actor_id = actor.actor_id |
||||
; |
||||
|
||||
-- |
||||
-- View structure for view staff_list |
||||
-- |
||||
|
||||
CREATE VIEW staff_list |
||||
AS |
||||
SELECT s.staff_id AS ID, |
||||
s.first_name||' '||s.last_name AS name, |
||||
a.address AS address, |
||||
a.postal_code AS zip_code, |
||||
a.phone AS phone, |
||||
city.city AS city, |
||||
country.country AS country, |
||||
s.store_id AS SID |
||||
FROM staff AS s JOIN address AS a ON s.address_id = a.address_id JOIN city ON a.city_id = city.city_id |
||||
JOIN country ON city.country_id = country.country_id |
||||
; |
||||
-- |
||||
-- View structure for view sales_by_store |
||||
-- |
||||
|
||||
CREATE VIEW sales_by_store |
||||
AS |
||||
SELECT |
||||
s.store_id |
||||
,c.city||','||cy.country AS store |
||||
,m.first_name||' '||m.last_name AS manager |
||||
,SUM(p.amount) AS total_sales |
||||
FROM payment AS p |
||||
INNER JOIN rental AS r ON p.rental_id = r.rental_id |
||||
INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id |
||||
INNER JOIN store AS s ON i.store_id = s.store_id |
||||
INNER JOIN address AS a ON s.address_id = a.address_id |
||||
INNER JOIN city AS c ON a.city_id = c.city_id |
||||
INNER JOIN country AS cy ON c.country_id = cy.country_id |
||||
INNER JOIN staff AS m ON s.manager_staff_id = m.staff_id |
||||
GROUP BY |
||||
s.store_id |
||||
, c.city||','||cy.country |
||||
, m.first_name||' '||m.last_name |
||||
; |
||||
-- |
||||
-- View structure for view sales_by_film_category |
||||
-- |
||||
-- Note that total sales will add up to >100% because |
||||
-- some titles belong to more than 1 category |
||||
-- |
||||
|
||||
CREATE VIEW sales_by_film_category |
||||
AS |
||||
SELECT |
||||
c.name AS category |
||||
, SUM(p.amount) AS total_sales |
||||
FROM payment AS p |
||||
INNER JOIN rental AS r ON p.rental_id = r.rental_id |
||||
INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id |
||||
INNER JOIN film AS f ON i.film_id = f.film_id |
||||
INNER JOIN film_category AS fc ON f.film_id = fc.film_id |
||||
INNER JOIN category AS c ON fc.category_id = c.category_id |
||||
GROUP BY c.name |
||||
; |
||||
|
||||
-- |
||||
-- View structure for view actor_info |
||||
-- |
||||
|
||||
/* |
||||
CREATE VIEW actor_info |
||||
AS |
||||
SELECT |
||||
a.actor_id, |
||||
a.first_name, |
||||
a.last_name, |
||||
GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ', |
||||
(SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ') |
||||
FROM sakila.film f |
||||
INNER JOIN sakila.film_category fc |
||||
ON f.film_id = fc.film_id |
||||
INNER JOIN sakila.film_actor fa |
||||
ON f.film_id = fa.film_id |
||||
WHERE fc.category_id = c.category_id |
||||
AND fa.actor_id = a.actor_id |
||||
) |
||||
) |
||||
ORDER BY c.name SEPARATOR '; ') |
||||
AS film_info |
||||
FROM sakila.actor a |
||||
LEFT JOIN sakila.film_actor fa |
||||
ON a.actor_id = fa.actor_id |
||||
LEFT JOIN sakila.film_category fc |
||||
ON fa.film_id = fc.film_id |
||||
LEFT JOIN sakila.category c |
||||
ON fc.category_id = c.category_id |
||||
GROUP BY a.actor_id, a.first_name, a.last_name; |
||||
*/ |
||||
|
||||
-- TO DO PROCEDURES |
||||
-- TO DO TRIGGERS |
||||
|
||||
END TRANSACTION; |
Binary file not shown.
@ -1,261 +0,0 @@
|
||||
// Cypress test suite: project pre-configurations
|
||||
//
|
||||
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { |
||||
staticProjects, |
||||
roles, |
||||
isTestSuiteActive, |
||||
getCurrentMode, |
||||
isXcdb, |
||||
setProjectString, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
function prepareSqliteQuery(projId) { |
||||
let sqliteQuery = [ |
||||
`ALTER TABLE "actor" RENAME TO "${projId}actor"`, |
||||
`ALTER TABLE "address" RENAME TO "${projId}address"`, |
||||
`ALTER TABLE "category" RENAME TO "${projId}category"`, |
||||
`ALTER TABLE "city" RENAME TO "${projId}city"`, |
||||
`ALTER TABLE "country" RENAME TO "${projId}country"`, |
||||
`ALTER TABLE "customer" RENAME TO "${projId}customer"`, |
||||
`ALTER TABLE "film" RENAME TO "${projId}film"`, |
||||
`ALTER TABLE "film_actor" RENAME TO "${projId}film_actor"`, |
||||
`ALTER TABLE "film_category" RENAME TO "${projId}film_category"`, |
||||
`ALTER TABLE "film_text" RENAME TO "${projId}film_text"`, |
||||
`ALTER TABLE "inventory" RENAME TO "${projId}inventory"`, |
||||
`ALTER TABLE "language" RENAME TO "${projId}language"`, |
||||
`ALTER TABLE "payment" RENAME TO "${projId}payment"`, |
||||
`ALTER TABLE "rental" RENAME TO "${projId}rental"`, |
||||
`ALTER TABLE "staff" RENAME TO "${projId}staff"`, |
||||
`ALTER TABLE "store" RENAME TO "${projId}store"`, |
||||
`CREATE VIEW ${projId}customer_list
|
||||
AS |
||||
SELECT cu.customer_id AS ID, |
||||
cu.first_name||' '||cu.last_name AS name, |
||||
a.address AS address, |
||||
a.postal_code AS zip_code, |
||||
a.phone AS phone, |
||||
"${projId}city".city AS city, |
||||
"${projId}country".country AS country, |
||||
case when cu.active=1 then 'active' else '' end AS notes, |
||||
cu.store_id AS SID |
||||
FROM "${projId}customer" AS cu JOIN "${projId}address" AS a ON cu.address_id = a.address_id JOIN "${projId}city" ON a.city_id = "${projId}city".city_id |
||||
JOIN "${projId}country" ON "${projId}city".country_id = "${projId}country".country_id`,
|
||||
`CREATE VIEW ${projId}film_list
|
||||
AS |
||||
SELECT "${projId}film".film_id AS FID, |
||||
"${projId}film".title AS title, |
||||
"${projId}film".description AS description, |
||||
"${projId}category".name AS category, |
||||
"${projId}film".rental_rate AS price, |
||||
"${projId}film".length AS length, |
||||
"${projId}film".rating AS rating, |
||||
"${projId}actor".first_name||' '||"${projId}actor".last_name AS actors |
||||
FROM "${projId}category" LEFT JOIN "${projId}film_category" ON "${projId}category".category_id = "${projId}film_category".category_id LEFT JOIN "${projId}film" ON "${projId}Film_category".film_id = "${projId}film".film_id |
||||
JOIN "${projId}film_actor" ON "${projId}film".film_id = "${projId}film_actor".film_id |
||||
JOIN "${projId}actor" ON "${projId}film_actor".actor_id = "${projId}actor".actor_id`,
|
||||
`CREATE VIEW ${projId}sales_by_film_category
|
||||
AS |
||||
SELECT |
||||
c.name AS category |
||||
, SUM(p.amount) AS total_sales |
||||
FROM "${projId}payment" AS p |
||||
INNER JOIN "${projId}rental" AS r ON p.rental_id = r.rental_id |
||||
INNER JOIN "${projId}inventory" AS i ON r.inventory_id = i.inventory_id |
||||
INNER JOIN "${projId}film" AS f ON i.film_id = f.film_id |
||||
INNER JOIN "${projId}film_category" AS fc ON f.film_id = fc.film_id |
||||
INNER JOIN "${projId}category" AS c ON fc.category_id = c.category_id |
||||
GROUP BY c.name`,
|
||||
`CREATE VIEW ${projId}sales_by_store
|
||||
AS |
||||
SELECT |
||||
s.store_id |
||||
,c.city||','||cy.country AS store |
||||
,m.first_name||' '||m.last_name AS manager |
||||
,SUM(p.amount) AS total_sales |
||||
FROM "${projId}payment" AS p |
||||
INNER JOIN "${projId}rental" AS r ON p.rental_id = r.rental_id |
||||
INNER JOIN "${projId}inventory" AS i ON r.inventory_id = i.inventory_id |
||||
INNER JOIN "${projId}store" AS s ON i.store_id = s.store_id |
||||
INNER JOIN "${projId}address" AS a ON s.address_id = a.address_id |
||||
INNER JOIN "${projId}city" AS c ON a.city_id = c.city_id |
||||
INNER JOIN "${projId}country" AS cy ON c.country_id = cy.country_id |
||||
INNER JOIN "${projId}staff" AS m ON s.manager_staff_id = m.staff_id |
||||
GROUP BY |
||||
s.store_id |
||||
, c.city||','||cy.country |
||||
, m.first_name||' '||m.last_name`,
|
||||
`CREATE VIEW ${projId}staff_list
|
||||
AS |
||||
SELECT s.staff_id AS ID, |
||||
s.first_name||' '||s.last_name AS name, |
||||
a.address AS address, |
||||
a.postal_code AS zip_code, |
||||
a.phone AS phone, |
||||
"${projId}city".city AS city, |
||||
"${projId}country".country AS country, |
||||
s.store_id AS SID |
||||
FROM "${projId}staff" AS s JOIN "${projId}address" AS a ON s.address_id = a.address_id JOIN "${projId}city" ON a.city_id = "${projId}city".city_id |
||||
JOIN "${projId}country" ON "${projId}city".country_id = "${projId}country".country_id`,
|
||||
// below two are dummy entries to ensure view record exists
|
||||
`CREATE VIEW ${projId}actor_info
|
||||
AS |
||||
SELECT s.staff_id AS ID, |
||||
s.first_name||' '||s.last_name AS name, |
||||
a.address AS address, |
||||
a.postal_code AS zip_code, |
||||
a.phone AS phone, |
||||
"${projId}city".city AS city, |
||||
"${projId}country".country AS country, |
||||
s.store_id AS SID |
||||
FROM "${projId}staff" AS s JOIN "${projId}address" AS a ON s.address_id = a.address_id JOIN "${projId}city" ON a.city_id = "${projId}city".city_id |
||||
JOIN "${projId}country" ON "${projId}city".country_id = "${projId}country".country_id`,
|
||||
`CREATE VIEW ${projId}nice_but_slower_film_list
|
||||
AS |
||||
SELECT s.staff_id AS ID, |
||||
s.first_name||' '||s.last_name AS name, |
||||
a.address AS address, |
||||
a.postal_code AS zip_code, |
||||
a.phone AS phone, |
||||
"${projId}city".city AS city, |
||||
"${projId}country".country AS country, |
||||
s.store_id AS SID |
||||
FROM "${projId}staff" AS s JOIN "${projId}address" AS a ON s.address_id = a.address_id JOIN "${projId}city" ON a.city_id = "${projId}city".city_id |
||||
JOIN "${projId}country" ON "${projId}city".country_id = "${projId}country".country_id`,
|
||||
// `CREATE VIEW ${projId}actor_info
|
||||
// AS
|
||||
// SELECT
|
||||
// a.actor_id AS actor_id,
|
||||
// a.first_name AS first_name,
|
||||
// a.last_name AS last_name,
|
||||
// GROUP_CONCAT(DISTINCT CONCAT(c.name,
|
||||
// ': ',
|
||||
// (SELECT
|
||||
// GROUP_CONCAT(f.title
|
||||
// ORDER BY f.title ASC
|
||||
// SEPARATOR ', ')
|
||||
// FROM
|
||||
// ((${projId}film f
|
||||
// JOIN ${projId}film_category fc ON ((f.film_id = fc.film_id)))
|
||||
// JOIN ${projId}film_actor fa ON ((f.film_id = fa.film_id)))
|
||||
// WHERE
|
||||
// ((fc.category_id = c.category_id)
|
||||
// AND (fa.actor_id = a.actor_id))))
|
||||
// ORDER BY c.name ASC
|
||||
// SEPARATOR '; ') AS ${projId}film_info
|
||||
// FROM
|
||||
// (((actor a
|
||||
// LEFT JOIN ${projId}film_actor fa ON ((a.actor_id = fa.actor_id)))
|
||||
// LEFT JOIN ${projId}film_category fc ON ((fa.film_id = fc.film_id)))
|
||||
// LEFT JOIN ${projId}category c ON ((fc.category_id = c.category_id)))
|
||||
// GROUP BY a.actor_id , a.first_name , a.last_name`,
|
||||
]; |
||||
return sqliteQuery; |
||||
} |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
describe(`Project pre-configurations`, () => { |
||||
before(() => { |
||||
cy.fileHook(); |
||||
}); |
||||
|
||||
it("Admin SignUp", () => { |
||||
cy.task("log", "This will be output to the terminal"); |
||||
loginPage.signUp(roles.owner.credentials); |
||||
}); |
||||
|
||||
function cy_createProjectBlock(proj, apiType, dbType) { |
||||
// click home button
|
||||
cy.getSettled(".nc-noco-brand-icon").click(); |
||||
cy.get(".ant-table-content").then((obj) => { |
||||
// if project already created, open
|
||||
// else, create a new one
|
||||
if (true == obj[0].innerHTML.includes(proj.basic.name)) { |
||||
projectsPage.openProject(proj.basic.name); |
||||
let projId; |
||||
if (dbType === "xcdb") { |
||||
let query = `SELECT prefix from nc_projects_v2 where title = "sampleREST"; `; |
||||
cy.task("sqliteExecReturnValue", query).then((resolve) => { |
||||
cy.log(resolve); |
||||
projId = resolve.prefix; |
||||
setProjectString(projId); |
||||
cy.log(projId); |
||||
}); |
||||
} |
||||
} else { |
||||
projectsPage.createProject(proj.basic, proj.config); |
||||
if (dbType === "xcdb") { |
||||
// store base URL- to re-visit and delete form view later
|
||||
let projId; |
||||
cy.url() |
||||
.then((url) => { |
||||
// project prefix code can include "_"
|
||||
// projId = url.split("_")[1].split("?")[0];
|
||||
let startIdx = url.indexOf("_"); |
||||
let endIdx = url.indexOf("?"); |
||||
projId = url.slice(startIdx + 1, endIdx); |
||||
|
||||
let query = `SELECT prefix from nc_projects_v2 where title = "sampleREST"; `; |
||||
cy.task("sqliteExecReturnValue", query) |
||||
.then((resolve) => { |
||||
cy.log(resolve); |
||||
projId = resolve.prefix; |
||||
cy.log(projId); |
||||
setProjectString(projId); |
||||
}) |
||||
.then(() => { |
||||
let query = prepareSqliteQuery(projId); |
||||
for (let i = 0; i < query.length; i++) { |
||||
cy.task("sqliteExec", query[i]); |
||||
cy.wait(1000); |
||||
} |
||||
}); |
||||
}) |
||||
.then(() => { |
||||
cy.log(projId); |
||||
mainPage.openMetaTab(); |
||||
mainPage.metaSyncValidate( |
||||
`${projId}actor`, |
||||
`New table, New relation added` |
||||
); |
||||
mainPage.closeMetaTab(); |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
const createProject = (proj) => { |
||||
it(`Create ${proj.basic.name} project`, () => { |
||||
if (dbType === "postgres") { |
||||
// wait for docker compose to start
|
||||
cy.task("pgExecTest", `SELECT 1+1`, { timeout: 120000 }).then(() => |
||||
cy_createProjectBlock(proj, apiType, dbType) |
||||
); |
||||
} else { |
||||
cy_createProjectBlock(proj, apiType, dbType); |
||||
} |
||||
|
||||
// close team & auth tab
|
||||
|
||||
// wait for tab to be rendered completely
|
||||
cy.wait(2000); |
||||
cy.closeTableTab(); |
||||
|
||||
// first instance of updating local storage information
|
||||
cy.saveLocalStorage(); |
||||
}); |
||||
}; |
||||
|
||||
if ("xcdb" === dbType) { |
||||
createProject(staticProjects.sampleREST); |
||||
} else if (dbType === "mysql") { |
||||
createProject(staticProjects.externalREST); |
||||
} else if (dbType === "postgres") { |
||||
createProject(staticProjects.pgExternalREST); |
||||
} |
||||
}); |
||||
}; |
@ -1,106 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${ |
||||
dbType === "xcdb" ? "Meta - " : "" |
||||
}${apiType.toUpperCase()} api - Table`, () => {
|
||||
// before(() => {
|
||||
// // standalone test
|
||||
// // loginPage.loginAndOpenProject(apiType, dbType);
|
||||
//
|
||||
// // open a table to work on views
|
||||
// //
|
||||
// // cy.restoreLocalStorage();
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// after(() => {
|
||||
// });
|
||||
|
||||
const name = "tablex"; |
||||
|
||||
// create a new random table
|
||||
it("Create Table", () => { |
||||
cy.createTable(name); |
||||
}); |
||||
|
||||
// delete newly created table
|
||||
it("Delete Table", () => { |
||||
cy.deleteTable(name, dbType); |
||||
}); |
||||
|
||||
const getAuditCell = (row, col) => { |
||||
return cy.get("tbody > tr").eq(row).find("td.ant-table-cell").eq(col); |
||||
}; |
||||
|
||||
describe("Check Audit Tab Cells", () => { |
||||
it("Open Audit tab", () => { |
||||
// http://localhost:8080/api/v1/db/meta/projects/p_bxp57hmks0n5o2/audits?offset=0&limit=25
|
||||
cy.intercept("/**/audits?offset=*&limit=*").as("waitForPageLoad"); |
||||
|
||||
// mainPage.navigationDraw(mainPage.AUDIT).click();
|
||||
settingsPage.openMenu(settingsPage.AUDIT); |
||||
// wait for column headers to appear
|
||||
//
|
||||
cy.get("thead > tr > th.ant-table-cell").should("have.length", 5); |
||||
|
||||
cy.wait("@waitForPageLoad"); |
||||
|
||||
// Audit table entries
|
||||
// [Header] Operation Type, Operation Sub Type, Description, User, Created
|
||||
// [0] TABLE, DELETED, delete table table-x, user@nocodb.com, ...
|
||||
// [1] TABLE, Created, created table table-x, user@nocodb.com, ...
|
||||
|
||||
getAuditCell(0, 0).contains("TABLE").should("exist"); |
||||
getAuditCell(0, 1).contains("DELETED").should("exist"); |
||||
getAuditCell(0, 3).contains("user@nocodb.com").should("exist"); |
||||
|
||||
getAuditCell(1, 0).contains("TABLE").should("exist"); |
||||
getAuditCell(1, 1).contains("CREATED").should("exist"); |
||||
getAuditCell(1, 3).contains("user@nocodb.com").should("exist"); |
||||
}); |
||||
|
||||
after(() => { |
||||
settingsPage.closeMenu(); |
||||
}) |
||||
}) |
||||
|
||||
it("Table Rename operation", () => { |
||||
cy.get(".nc-project-tree-tbl-City").should("exist").click(); |
||||
|
||||
cy.renameTable("City", "CityX"); |
||||
|
||||
// verify
|
||||
// 1. Table name in project tree has changed
|
||||
// cy.get(".nc-tbl-title").contains("CityX").should("exist");
|
||||
cy.get(".nc-project-tree-tbl-CityX").should("exist"); |
||||
|
||||
// 2. Table tab name has changed
|
||||
cy.get(`.ant-tabs-tab:contains('CityX'):visible`).should("exist"); |
||||
|
||||
// Wait for Grid to render
|
||||
cy.gridWait(25); |
||||
|
||||
// 3. contents of the table are valid
|
||||
mainPage |
||||
.getCell(`City`, 1) |
||||
.contains("A Corua (La Corua)") |
||||
.should("exist"); |
||||
|
||||
cy.closeTableTab("CityX"); |
||||
|
||||
// revert re-name operation to not impact rest of test suite
|
||||
cy.renameTable("CityX", "City"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,200 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
function addNewRow(index, cellValue) { |
||||
mainPage.addNewRowExpand("tablex"); |
||||
|
||||
// cy.get("#data-table-form-Title > input").first().type(cellValue);
|
||||
cy.get(".nc-expand-col-Title") |
||||
.find(".nc-cell > input") |
||||
.should("exist") |
||||
.first() |
||||
.clear() |
||||
.type(cellValue); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
cy.toastWait("updated successfully"); |
||||
cy.get("body").type("{esc}"); |
||||
mainPage.getCell("Title", index).contains(cellValue).should("exist"); |
||||
} |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Table Column`, () => { |
||||
const name = "tablex"; |
||||
const colName = "column_name_a"; |
||||
const updatedColName = "updated_column_name"; |
||||
const randVal = "Test@1234.com"; |
||||
const updatedRandVal = "Updated@1234.com"; |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it("Create Table Column", () => { |
||||
cy.createTable(name); |
||||
mainPage.addColumn(colName, name); |
||||
}); |
||||
|
||||
// edit the newly created column
|
||||
it("Edit table column - change datatype", () => { |
||||
if (!isXcdb()) { |
||||
cy.get(`th:contains(${colName}) .nc-icon.ant-dropdown-trigger`) |
||||
.trigger("mouseover", { force: true }) |
||||
.click({ force: true }); |
||||
|
||||
// cy.get(".nc-column-edit").click();
|
||||
// cy.get(".nc-column-edit").should("not.be.visible");
|
||||
cy.getActiveMenu(".nc-dropdown-column-operations") |
||||
.find(".nc-column-edit") |
||||
.click(); |
||||
|
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
// change column type and verify
|
||||
// cy.get(".nc-column-type-input").last().click();
|
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find(".nc-column-type-input") |
||||
.last() |
||||
.click(); |
||||
cy.getActiveSelection(".nc-dropdown-column-type") |
||||
.find(".ant-select-item-option") |
||||
.contains("LongText") |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
|
||||
cy.toastWait("Column updated"); |
||||
} |
||||
}); |
||||
|
||||
// edit the newly created column
|
||||
it("Edit table column - rename", () => { |
||||
cy.get(`th:contains(${colName}) .nc-icon.ant-dropdown-trigger`) |
||||
.trigger("mouseover", { force: true }) |
||||
.click({ force: true }); |
||||
|
||||
// cy.get(".nc-column-edit").click();
|
||||
// cy.get(".nc-column-edit").should("not.be.visible");
|
||||
cy.getActiveMenu(".nc-dropdown-column-operations") |
||||
.find(".nc-column-edit") |
||||
.click(); |
||||
|
||||
// rename column and verify
|
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find("input.nc-column-name-input", { timeout: 3000 }) |
||||
.should("exist") |
||||
.clear() |
||||
.type(updatedColName); |
||||
// cy.get(".ant-btn-primary:visible").contains("Save").click();
|
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
|
||||
cy.toastWait("Column updated"); |
||||
|
||||
cy.get(`th:contains(${colName})`).should("not.exist"); |
||||
cy.get(`th:contains(${updatedColName})`).should("exist"); |
||||
}); |
||||
|
||||
// delete the newly created column
|
||||
it("Delete table column", () => { |
||||
mainPage.deleteColumn(updatedColName); |
||||
}); |
||||
|
||||
it("Add new row", () => { |
||||
addNewRow(1, randVal); |
||||
}); |
||||
|
||||
it("Update row", () => { |
||||
mainPage |
||||
.getRow(1) |
||||
.find(".nc-row-no") |
||||
.should("exist") |
||||
.eq(0) |
||||
.trigger("mouseover", { force: true }) |
||||
.get(".nc-row-expand") |
||||
.click({ force: true }); |
||||
|
||||
// wait for page render to complete
|
||||
cy.get('button:contains("Save row"):visible').should("exist"); |
||||
|
||||
cy.get(".nc-expand-col-Title") |
||||
.find(".nc-cell > input") |
||||
.should("exist") |
||||
.first() |
||||
.clear() |
||||
.type(updatedRandVal); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// partial toast message
|
||||
cy.toastWait("updated successfully"); |
||||
cy.get("body").type("{esc}"); |
||||
|
||||
mainPage.getCell("Title", 1).contains(randVal).should("not.exist"); |
||||
mainPage.getCell("Title", 1).contains(updatedRandVal).should("exist"); |
||||
}); |
||||
|
||||
it("Delete Row", () => { |
||||
mainPage |
||||
.getCell("Title", 1) |
||||
.contains(updatedRandVal) |
||||
.rightclick({ force: true }); |
||||
|
||||
// delete row
|
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.find('.ant-dropdown-menu-item:contains("Delete Row")') |
||||
.first() |
||||
.click({ force: true }); |
||||
cy.get("td").contains(randVal).should("not.exist"); |
||||
}); |
||||
|
||||
it("Select all row check-box validation", () => { |
||||
// add multiple rows
|
||||
addNewRow(1, "a1"); |
||||
addNewRow(2, "a2"); |
||||
addNewRow(3, "a3"); |
||||
addNewRow(4, "a4"); |
||||
addNewRow(5, "a5"); |
||||
|
||||
cy.get(".nc-no-label") |
||||
.should("exist") |
||||
.eq(0) |
||||
.trigger("mouseover", { force: true }); |
||||
cy.get(".ant-checkbox").should("exist").eq(0).click({ force: true }); |
||||
|
||||
// delete selected rows
|
||||
mainPage.getCell("Title", 3).rightclick({ force: true }); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Delete Selected Rows") |
||||
.click({ force: true }); |
||||
|
||||
// verify if everything is wiped off
|
||||
mainPage.getCell("Title", 1).contains("a1").should("not.exist"); |
||||
|
||||
// clean-up
|
||||
cy.deleteTable(name, dbType); |
||||
}); |
||||
}); |
||||
}; |
@ -1,143 +0,0 @@
|
||||
import { |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} SQL Views`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
// before(() => {
|
||||
// cy.fileHook();
|
||||
// mainPage.tabReset();
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it(`XCDB: SQL View Column operations`, () => { |
||||
// Open one of the views & verify validity of first two entries
|
||||
if (isXcdb()) { |
||||
cy.openViewsTab("CustomerList", 25); |
||||
|
||||
// Record-1 validation
|
||||
mainPage.getCell(`ID`, 1).contains("1").should("exist"); |
||||
mainPage.getCell(`Name`, 1).contains("MARY SMITH").should("exist"); |
||||
mainPage |
||||
.getCell(`Address`, 1) |
||||
.contains("1913 Hanoi Way") |
||||
.should("exist"); |
||||
mainPage.getCell(`ZipCode`, 1).contains("35200").should("exist"); |
||||
|
||||
// Record-2 validation
|
||||
mainPage.getCell(`ID`, 2).contains("2").should("exist"); |
||||
mainPage |
||||
.getCell(`Name`, 2) |
||||
.contains("PATRICIA JOHNSON") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell(`Address`, 2) |
||||
.contains("1121 Loja Avenue") |
||||
.should("exist"); |
||||
mainPage.getCell(`ZipCode`, 2).contains("17886").should("exist"); |
||||
|
||||
// Column operations: Hide
|
||||
mainPage.hideField(`ZipCode`); |
||||
mainPage.unhideField(`ZipCode`); |
||||
|
||||
// Column operations: Sort
|
||||
mainPage.sortField("Name", "Z → A"); |
||||
mainPage.getCell(`Name`, 1).contains("ZACHARY HITE").should("exist"); |
||||
mainPage.clearSort(); |
||||
|
||||
// Column operations: Filter
|
||||
mainPage.filterField("Name", "is like", "MARY"); |
||||
mainPage.getCell(`Name`, 1).contains("MARY SMITH").should("exist"); |
||||
mainPage.filterReset(); |
||||
|
||||
cy.closeViewsTab("CustomerList"); |
||||
} |
||||
}); |
||||
|
||||
it(`SQL View Column operations`, () => { |
||||
if (!isXcdb()) { |
||||
// Open one of the views & verify validity of first two entries
|
||||
|
||||
cy.openViewsTab("ActorInfo", 25); |
||||
|
||||
// Record-1 validation
|
||||
mainPage.getCell(`ActorId`, 1).contains("1").should("exist"); |
||||
mainPage.getCell(`FirstName`, 1).contains("PENELOPE").should("exist"); |
||||
mainPage.getCell(`LastName`, 1).contains("GUINESS").should("exist"); |
||||
mainPage |
||||
.getCell(`FilmInfo`, 1) |
||||
.contains("Animation: ANACONDA CONFESSIONS") |
||||
.should("exist"); |
||||
|
||||
// Record-2 validation
|
||||
mainPage.getCell(`ActorId`, 2).contains("2").should("exist"); |
||||
mainPage.getCell(`FirstName`, 2).contains("NICK").should("exist"); |
||||
mainPage.getCell(`LastName`, 2).contains("WAHLBERG").should("exist"); |
||||
mainPage |
||||
.getCell(`FilmInfo`, 2) |
||||
.contains("Action: BULL SHAWSHANK") |
||||
.should("exist"); |
||||
|
||||
// Column operations: Hide
|
||||
mainPage.hideField("FilmInfo"); |
||||
mainPage.unhideField("FilmInfo"); |
||||
|
||||
// Column operations: Sort
|
||||
mainPage.sortField("FirstName", "Z → A"); |
||||
mainPage.getCell(`FirstName`, 1).contains("ZERO").should("exist"); |
||||
mainPage.clearSort(); |
||||
|
||||
// Column operations: Filter
|
||||
mainPage.filterField("FirstName", "is like", "PENELOPE"); |
||||
mainPage.getCell(`FirstName`, 1).contains("PENELOPE").should("exist"); |
||||
mainPage.filterReset(); |
||||
|
||||
cy.closeViewsTab("ActorInfo"); |
||||
} |
||||
}); |
||||
|
||||
it.skip(`SQL View List`, () => { |
||||
// confirm if other views exist
|
||||
//
|
||||
cy.openViewsTab("CustomerList", 25); |
||||
cy.closeViewsTab("CustomerList"); |
||||
|
||||
cy.openViewsTab("FilmList", 25); |
||||
cy.closeViewsTab("FilmList"); |
||||
|
||||
cy.openViewsTab("SalesByFilmCategory", 16); |
||||
cy.closeViewsTab("SalesByFilmCategory"); |
||||
|
||||
if (!isXcdb()) { |
||||
cy.openViewsTab("NicerButSlowerFilmList", 25); |
||||
cy.closeViewsTab("NicerButSlowerFilmList"); |
||||
|
||||
// SalesByStore && StaffList contain no entries. Hence marking row count to 0
|
||||
cy.openViewsTab("SalesByStore", 0); |
||||
cy.closeViewsTab("SalesByStore"); |
||||
|
||||
cy.openViewsTab("StaffList", 0); |
||||
cy.closeViewsTab("StaffList"); |
||||
} else { |
||||
cy.openViewsTab("SalesByStore", 2); |
||||
cy.closeViewsTab("SalesByStore"); |
||||
|
||||
cy.openViewsTab("StaffList", 2); |
||||
cy.closeViewsTab("StaffList"); |
||||
} |
||||
}); |
||||
}); |
||||
}; |
@ -1,147 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
getProjectString, |
||||
isPostgres, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} Table/view drag-drop reorder`, () => { |
||||
function validateTreeField(index, tblName) { |
||||
cy.get(`:nth-child(${index}) > .v-list-item__title > .caption`) |
||||
.contains(tblName) |
||||
.should("exist"); |
||||
} |
||||
|
||||
before(() => { |
||||
cy.fileHook(); |
||||
mainPage.tabReset(); |
||||
}); |
||||
|
||||
/* |
||||
Original order of list items |
||||
Actor, Address, Category, City, Country, Customer, FIlm, FilmText, Language, Payment, Rental Staff |
||||
ActorInfo, Customer List, Film List, NiceButSlowerFilm List, SalesByFilmCategory, SalesByStore, Staff List |
||||
*/ |
||||
|
||||
it(`Table & SQL View list, Drag/drop`, () => { |
||||
// expand tree-view menu
|
||||
// cy.get(".nc-project-tree")
|
||||
// .find(".v-list-item__title:contains(Tables)", { timeout: 10000 })
|
||||
// .should("exist")
|
||||
// .first()
|
||||
// .click({ force: true });
|
||||
|
||||
validateTreeField(1, "Actor"); |
||||
|
||||
// move Actor field down, above Staff (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor").drag( |
||||
".nc-child-draggable-icon-Film" |
||||
); |
||||
|
||||
validateTreeField(7, "Actor"); |
||||
|
||||
// // move ActorInfo (View) field up to first place (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-ActorInfo").drag(
|
||||
// ".nc-child-draggable-icon-Address"
|
||||
// );
|
||||
|
||||
// validateTreeField(1, "ActorInfo");
|
||||
// validateTreeField(2, "Address");
|
||||
// validateTreeField(8, "Actor");
|
||||
|
||||
// // restore ActorInfo field (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-ActorInfo").drag(
|
||||
// ".nc-child-draggable-icon-Staff"
|
||||
// );
|
||||
|
||||
// restore Actor field (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor").drag( |
||||
".nc-child-draggable-icon-Address" |
||||
); |
||||
|
||||
validateTreeField(1, "Actor"); |
||||
validateTreeField(2, "Address"); |
||||
|
||||
// undo project-tree expand operation
|
||||
cy.get(".nc-project-tree") |
||||
.find(".v-list-item__title:contains(Tables)", { |
||||
timeout: 10000, |
||||
}) |
||||
.should("exist") |
||||
.first() |
||||
.click({ force: true }); |
||||
}); |
||||
|
||||
// create new view as specified by 'viewType'
|
||||
// can be - grid/ gallery/ form
|
||||
// wait for toast to appear
|
||||
//
|
||||
function createView(viewType) { |
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
|
||||
cy.snipActiveModal(`Modal_createView_${viewType}`); |
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find("button:contains(Submit)") |
||||
.click(); |
||||
|
||||
cy.toastWait("View created successfully"); |
||||
} |
||||
|
||||
// verify view 'viewName' to be present at position 'index'
|
||||
// index starts from 0
|
||||
function validateViewField(index, viewName) { |
||||
cy.get(".nc-view-item.nc-draggable-child") |
||||
.eq(index) |
||||
.contains(viewName) |
||||
.should("exist"); |
||||
} |
||||
|
||||
it(`View (Gallery/ Grid/ Form) re-order`, () => { |
||||
cy.openTableTab("Actor", 25); |
||||
|
||||
// create 3 views, use default names
|
||||
// Actor1, Actor2, Actor3
|
||||
createView("grid"); |
||||
createView("gallery"); |
||||
createView("form"); |
||||
|
||||
// validate position order
|
||||
validateViewField(0, "Actor"); |
||||
validateViewField(1, "Actor1"); |
||||
validateViewField(2, "Actor2"); |
||||
validateViewField(3, "Actor3"); |
||||
|
||||
// move Actor3 field on top (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor3").drag( |
||||
`.nc-child-draggable-icon-${ |
||||
isXcdb() ? `${getProjectString()}` : `` |
||||
}actor` |
||||
); |
||||
|
||||
// validate new position order, Actor3 on top
|
||||
validateViewField(0, "Actor3"); |
||||
validateViewField(1, "Actor"); |
||||
validateViewField(2, "Actor1"); |
||||
validateViewField(3, "Actor2"); |
||||
|
||||
// delete all created views
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true }); |
||||
cy.toastWait("View deleted successfully"); |
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true }); |
||||
cy.toastWait("View deleted successfully"); |
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true }); |
||||
cy.toastWait("View deleted successfully"); |
||||
|
||||
// wind up
|
||||
cy.closeTableTab("Actor"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,156 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
getProjectString, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} Table/view drag-drop reorder`, () => { |
||||
function validateTreeField(index, tblName) { |
||||
cy.get(`.nc-project-tree-tbl`) |
||||
.eq(index - 1) |
||||
.find(".nc-tbl-title") |
||||
.contains(tblName) |
||||
.should("exist"); |
||||
} |
||||
|
||||
/* |
||||
Original order of list items |
||||
Actor, Address, Category, City, Country, Customer, FIlm, FilmText, Language, Payment, Rental Staff |
||||
ActorInfo, Customer List, Film List, NiceButSlowerFilm List, SalesByFilmCategory, SalesByStore, Staff List |
||||
*/ |
||||
|
||||
before(() => { |
||||
cy.fileHook(); |
||||
mainPage.tabReset(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.fileHook(); |
||||
}); |
||||
|
||||
it(`Table & SQL View list, Drag/drop`, () => { |
||||
// expand tree-view menu
|
||||
// cy.get(".nc-project-tree")
|
||||
// .find(".v-list-item__title:contains(Tables)", { timeout: 10000 })
|
||||
// .should("exist")
|
||||
// .first()
|
||||
// .click({ force: true });
|
||||
|
||||
validateTreeField(1, "Actor"); |
||||
|
||||
// move Actor field down, above Staff (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor").click({ force: true }); |
||||
cy.get(".nc-child-draggable-icon-Actor").should("be.visible"); |
||||
cy.get(".nc-child-draggable-icon-Actor").drag( |
||||
".nc-child-draggable-icon-Staff", |
||||
{ force: true } |
||||
); |
||||
|
||||
validateTreeField(12, "Actor"); |
||||
|
||||
// // move ActorInfo (View) field up to first place (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-ActorInfo").drag(
|
||||
// ".nc-child-draggable-icon-Address"
|
||||
// );
|
||||
//
|
||||
// validateTreeField(1, "ActorInfo");
|
||||
// validateTreeField(2, "Address");
|
||||
// validateTreeField(13, "Actor");
|
||||
//
|
||||
// // restore ActorInfo field (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-ActorInfo").drag(
|
||||
// ".nc-child-draggable-icon-Actor"
|
||||
// );
|
||||
//
|
||||
// // restore Actor field (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-Actor").drag(
|
||||
// ".nc-child-draggable-icon-Address"
|
||||
// );
|
||||
//
|
||||
// validateTreeField(1, "Actor");
|
||||
// validateTreeField(2, "Address");
|
||||
// validateTreeField(12, "Staff");
|
||||
// validateTreeField(13, "ActorInfo");
|
||||
// validateTreeField(14, "CustomerList");
|
||||
//
|
||||
// // undo project-tree expand operation
|
||||
// cy.get(".nc-project-tree")
|
||||
// .should("exist")
|
||||
// .first()
|
||||
// .click({ force: true });
|
||||
}); |
||||
|
||||
// create new view as specified by 'viewType'
|
||||
// can be - grid/ gallery/ form
|
||||
// wait for toast to appear
|
||||
//
|
||||
function createView(viewType) { |
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
|
||||
cy.snipActiveModal(`Modal_createView_${viewType}`); |
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find("button:contains(Submit)") |
||||
.click(); |
||||
|
||||
cy.toastWait("View created successfully"); |
||||
} |
||||
|
||||
// verify view 'viewName' to be present at position 'index'
|
||||
// index starts from 0
|
||||
function validateViewField(index, viewName) { |
||||
cy.get(".nc-view-item.nc-draggable-child") |
||||
.eq(index) |
||||
.contains(viewName) |
||||
.should("exist"); |
||||
} |
||||
|
||||
// exclude@ncv2: to be investigated & fixed
|
||||
it.skip(`View (Gallery/ Grid/ Form) re-order`, () => { |
||||
cy.openTableTab("Actor", 25); |
||||
|
||||
// create 3 views, use default names
|
||||
// Actor1, Actor2, Actor3
|
||||
createView("grid"); |
||||
createView("gallery"); |
||||
createView("form"); |
||||
|
||||
// validate position order
|
||||
validateViewField(0, "Actor"); |
||||
validateViewField(1, "Actor1"); |
||||
validateViewField(2, "Actor2"); |
||||
validateViewField(3, "Actor3"); |
||||
|
||||
// move Actor3 field on top (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor3").drag( |
||||
`.nc-child-draggable-icon-${ |
||||
isXcdb() ? `${getProjectString()}` : `` |
||||
}Actor` |
||||
); |
||||
|
||||
// validate new position order, Actor3 on top
|
||||
validateViewField(0, "Actor3"); |
||||
validateViewField(1, "Actor"); |
||||
validateViewField(2, "Actor1"); |
||||
validateViewField(3, "Actor2"); |
||||
|
||||
// delete all created views
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true }); |
||||
cy.toastWait("View deleted successfully"); |
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true }); |
||||
cy.toastWait("View deleted successfully"); |
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true }); |
||||
cy.toastWait("View deleted successfully"); |
||||
|
||||
// wind up
|
||||
cy.closeTableTab("Actor"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,169 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { |
||||
getCurrentMode, |
||||
getProjectString, |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
let projPrefix = `sakila.`; |
||||
let dbCmd = `queryDb`; |
||||
let tblDisplayPrefix = ``; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Meta Sync`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
if (isXcdb()) { |
||||
cy.log(getProjectString()); |
||||
projPrefix = `${getProjectString()}`; |
||||
dbCmd = `sqliteExec`; |
||||
tblDisplayPrefix = `${getProjectString()}`; |
||||
} |
||||
mainPage.openMetaTab(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it(`Create table`, () => { |
||||
// Create Table
|
||||
cy.task( |
||||
dbCmd, |
||||
`CREATE TABLE ${projPrefix}table1 (id INT NOT NULL, col1 INT NULL, PRIMARY KEY (id))` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`CREATE TABLE ${projPrefix}table2 (id INT NOT NULL, col1 INT NULL, PRIMARY KEY (id))` |
||||
); |
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "New table"); |
||||
}); |
||||
|
||||
it(`Add relation`, () => { |
||||
// working with relations in sqlite requires table to be deleted & recreated
|
||||
//
|
||||
if (!isXcdb()) { |
||||
// Add relation (FK)
|
||||
cy.task( |
||||
dbCmd, |
||||
`ALTER TABLE ${projPrefix}table1 ADD INDEX fk1_idx (col1 ASC) VISIBLE` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`ALTER TABLE ${projPrefix}table1 ADD CONSTRAINT fk1 FOREIGN KEY (col1) REFERENCES ${projPrefix}table2 (id) ON DELETE NO ACTION ON UPDATE NO ACTION` |
||||
); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"New relation added" |
||||
); |
||||
} |
||||
}); |
||||
|
||||
it(`Remove relation`, () => { |
||||
// working with relations in sqlite requires table to be deleted & recreated
|
||||
//
|
||||
if (!isXcdb()) { |
||||
// Remove relation (FK)
|
||||
cy.task(dbCmd, `ALTER TABLE ${projPrefix}table1 DROP FOREIGN KEY fk1`); |
||||
cy.task(dbCmd, `ALTER TABLE ${projPrefix}table1 DROP INDEX fk1_idx`); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"Relation removed" |
||||
); |
||||
} |
||||
}); |
||||
|
||||
it(`Add column`, () => { |
||||
// Add Column
|
||||
let queryString = `ALTER TABLE ${projPrefix}table1 ADD COLUMN newCol VARCHAR(45) NULL AFTER id`; |
||||
if (isXcdb()) |
||||
queryString = `ALTER TABLE ${projPrefix}table1 ADD COLUMN newCol TEXT NULL`; |
||||
cy.task(dbCmd, queryString); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"New column(newCol)" |
||||
); |
||||
}); |
||||
|
||||
it(`Rename column`, () => { |
||||
// Rename Column
|
||||
let queryString = `ALTER TABLE ${projPrefix}table1 CHANGE COLUMN newCol newColName VARCHAR(45) NULL DEFAULT NULL`; |
||||
if (isXcdb()) |
||||
queryString = `ALTER TABLE ${projPrefix}table1 RENAME COLUMN newCol TO newColName`; |
||||
cy.task(dbCmd, queryString); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"New column(newColName), Column removed(newCol)" |
||||
); |
||||
}); |
||||
|
||||
it(`Delete column`, () => { |
||||
// Remove Column
|
||||
// to be fixed for SQLITE
|
||||
if (!isXcdb()) { |
||||
cy.task( |
||||
dbCmd, |
||||
`ALTER TABLE ${projPrefix}table1 DROP COLUMN newColName` |
||||
); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"Column removed(newColName)" |
||||
); |
||||
} |
||||
}); |
||||
|
||||
it(`Delete table`, () => { |
||||
// DROP TABLE
|
||||
cy.task(dbCmd, `DROP TABLE ${projPrefix}table1`); |
||||
cy.task(dbCmd, `DROP TABLE ${projPrefix}table2`); |
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "Table removed"); |
||||
}); |
||||
|
||||
it(`Hide, Filter, Sort`, () => { |
||||
cy.task( |
||||
dbCmd, |
||||
`CREATE TABLE ${projPrefix}table1 (id INT NOT NULL, col1 INT NULL, col2 INT NULL, col3 INT NULL, col4 INT NULL, PRIMARY KEY (id))` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO ${projPrefix}table1 (id, col1, col2, col3, col4) VALUES (1,1,1,1,1), (2,2,2,2,2), (3,3,3,3,3), (4,4,4,4,4), (5,5,5,5,5), (6,6,6,6,6), (7,7,7,7,7), (8,8,8,8,8), (9,9,9,9,9);` |
||||
); |
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "New table"); |
||||
mainPage.closeMetaTab(); |
||||
|
||||
cy.openTableTab("Table1", 9); |
||||
mainPage.hideField("Col1"); |
||||
mainPage.sortField("Col1", "9 → 1"); |
||||
mainPage.filterField(`Col1`, ">=", "5"); |
||||
cy.get(".nc-grid-row").should("have.length", 5); |
||||
cy.closeTableTab("Table1"); |
||||
}); |
||||
|
||||
it(`Verify`, () => { |
||||
mainPage.openMetaTab(); |
||||
// Rename Column
|
||||
let queryString = `ALTER TABLE ${projPrefix}table1 CHANGE COLUMN col1 newCol INT NULL DEFAULT NULL`; |
||||
if (isXcdb()) |
||||
queryString = `ALTER TABLE ${projPrefix}table1 RENAME COLUMN col1 TO newCol`; |
||||
cy.task(dbCmd, queryString); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"New column(newCol), Column removed(col1)" |
||||
); |
||||
mainPage.closeMetaTab(); |
||||
|
||||
cy.openTableTab("Table1", 9); |
||||
cy.deleteTable("Table1", dbType); |
||||
}); |
||||
}); |
||||
}; |
@ -1,182 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { |
||||
getCurrentMode, |
||||
getProjectString, |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
let projPrefix = `sakila.`; |
||||
let dbCmd = `pgExec`; |
||||
let tblDisplayPrefix = ``; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Meta Sync`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
mainPage.openMetaTab(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it(`Create table`, () => { |
||||
cy.log("this works"); |
||||
// Create Table
|
||||
cy.task( |
||||
dbCmd, |
||||
`CREATE TABLE table1( id INT NOT NULL, col1 INT NOT NULL, PRIMARY KEY(id))` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`CREATE TABLE table2( id INT NOT NULL, col1 INT NOT NULL, PRIMARY KEY(id))` |
||||
); |
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "New table"); |
||||
}); |
||||
|
||||
it(`Add relation`, () => { |
||||
// working with relations in sqlite requires table to be deleted & recreated
|
||||
//
|
||||
// Add relation (FK)
|
||||
cy.task( |
||||
dbCmd, |
||||
`ALTER TABLE table1 ADD CONSTRAINT fk_idx FOREIGN KEY (id) REFERENCES table2 (id);` |
||||
); |
||||
// cy.task(
|
||||
// dbCmd,
|
||||
// `ALTER TABLE ${projPrefix}table1 ADD CONSTRAINT fk1 FOREIGN KEY (col1) REFERENCES ${projPrefix}table2 (id) ON DELETE NO ACTION ON UPDATE NO ACTION`
|
||||
// );
|
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"New relation added" |
||||
); |
||||
}); |
||||
|
||||
it(`Remove relation`, () => { |
||||
// working with relations in sqlite requires table to be deleted & recreated
|
||||
//
|
||||
// Remove relation (FK)
|
||||
cy.task(dbCmd, `ALTER TABLE table1 DROP CONSTRAINT fk_idx`); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"Relation removed" |
||||
); |
||||
}); |
||||
|
||||
it(`Add column`, () => { |
||||
// Add Column
|
||||
let queryString = `ALTER TABLE table1 ADD COLUMN newCol INT`; |
||||
cy.task(dbCmd, queryString); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"New column(newcol)" |
||||
); |
||||
}); |
||||
|
||||
it(`Rename column`, () => { |
||||
// Rename Column
|
||||
let queryString = `ALTER TABLE table1 RENAME COLUMN newCol TO newColName`; |
||||
cy.task(dbCmd, queryString); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"New column(newcolname), Column removed(newcol)" |
||||
); |
||||
}); |
||||
|
||||
it(`Delete column`, () => { |
||||
// Remove Column
|
||||
cy.task(dbCmd, `ALTER TABLE table1 DROP COLUMN newColName`); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"Column removed(newcolname)" |
||||
); |
||||
}); |
||||
|
||||
it(`Delete table`, () => { |
||||
// DROP TABLE
|
||||
cy.task(dbCmd, `DROP TABLE IF EXISTS table1`); |
||||
cy.task(dbCmd, `DROP TABLE IF EXISTS table2`); |
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "Table removed"); |
||||
}); |
||||
|
||||
it(`Hide, Filter, Sort`, () => { |
||||
// kludge: bulk insert fail.
|
||||
cy.task( |
||||
dbCmd, |
||||
`CREATE TABLE table1( id INT NOT NULL, col1 INT NOT NULL, col2 INT NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(id))` |
||||
); |
||||
cy.wait(3000); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (1,1,1,1,1)` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (2,2,2,2,2)` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (3,3,3,3,3)` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (4,4,4,4,4)` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (5,5,5,5,5)` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (6,6,6,6,6)` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (7,7,7,7,7)` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (8,8,8,8,8)` |
||||
); |
||||
cy.task( |
||||
dbCmd, |
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (9,9,9,9,9)` |
||||
); |
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "New table"); |
||||
mainPage.closeMetaTab(); |
||||
|
||||
cy.openTableTab("Table1", 9); |
||||
mainPage.hideField("Col1"); |
||||
mainPage.sortField("Col1", "9 → 1"); |
||||
mainPage.filterField(`Col1`, ">=", "5"); |
||||
cy.get(".nc-grid-row").should("have.length", 5); |
||||
cy.closeTableTab("Table1"); |
||||
}); |
||||
|
||||
it(`Verify`, () => { |
||||
mainPage.openMetaTab(); |
||||
// Rename Column
|
||||
let queryString = `ALTER TABLE table1 RENAME COLUMN col1 TO newcol`; |
||||
cy.task(dbCmd, queryString); |
||||
mainPage.metaSyncValidate( |
||||
`${tblDisplayPrefix}table1`, |
||||
"New column(newcol), Column removed(col1)" |
||||
); |
||||
mainPage.closeMetaTab(); |
||||
|
||||
cy.openTableTab("Table1", 9); |
||||
// kludge- delete table triggered post sql backend operations doesnt carry any trigger toast
|
||||
cy.deleteTable("Table1", "mysql"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,118 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Table: belongs to, link record`, () => { |
||||
// before(() => {
|
||||
// cy.restoreLocalStorage();
|
||||
// cy.openTableTab("Country", 25);
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// after(() => {
|
||||
// cy.closeTableTab("City");
|
||||
// });
|
||||
|
||||
it("URL validation", () => { |
||||
cy.openTableTab("Country", 25); |
||||
// column name validation
|
||||
// cy.get(`.project-tab:contains(Country):visible`).should("exist");
|
||||
// URL validation
|
||||
cy.url().should("contain", `table/Country`); |
||||
}); |
||||
|
||||
it("Grid cell chip content validation", () => { |
||||
// grid cell content validation
|
||||
mainPage |
||||
.getCell("City List", 1) |
||||
.find(".nc-virtual-cell > .chips-wrapper > .chips > .group > .name") |
||||
.contains("Kabul") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("City List", 2) |
||||
.find(".nc-virtual-cell > .chips-wrapper > .chips > .group > .name") |
||||
.contains("Batna") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("City List", 2) |
||||
.find(".nc-virtual-cell > .chips-wrapper > .chips > .group > .name") |
||||
.contains("Bchar") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("City List", 2) |
||||
.find(".nc-virtual-cell > .chips-wrapper > .chips > .group > .name") |
||||
.contains("Skikda") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it("Expand has-many column", () => { |
||||
mainPage |
||||
.getCell("City List", 1) |
||||
.should("exist") |
||||
.trigger("mouseover") |
||||
.click(); |
||||
cy.get(".nc-action-icon").eq(0).should("exist").click({ force: true }); |
||||
}); |
||||
|
||||
it("Expand Link record, validate", () => { |
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find("button:contains(Link to 'City')") |
||||
.click() |
||||
.then(() => { |
||||
// Link record form validation
|
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.contains("Link record") |
||||
.should("exist"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".nc-reload") |
||||
.should("exist"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find('button:contains("Add new record")') |
||||
.should("exist"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.eq(0) |
||||
.contains("A Corua (La Corua)") |
||||
.should("exist"); |
||||
|
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find("button.ant-modal-close") |
||||
.click(); |
||||
// .then(() => {
|
||||
// cy.getActiveModal()
|
||||
// .find("button.ant-modal-close")
|
||||
// .click();
|
||||
// });
|
||||
}); |
||||
}); |
||||
|
||||
it("Belongs to column, validate", () => { |
||||
cy.closeTableTab("Country"); |
||||
cy.openTableTab("City", 25); |
||||
cy.url().should("contain", `table/City`); |
||||
|
||||
// grid cell content validation
|
||||
mainPage |
||||
.getCell("Country", 1) |
||||
.find(".nc-virtual-cell > .chips-wrapper > .chips > .group > .name") |
||||
.contains("Spain") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("Country", 2) |
||||
.find(".nc-virtual-cell > .chips-wrapper > .chips > .group > .name") |
||||
.contains("Saudi Arabia") |
||||
.should("exist"); |
||||
|
||||
cy.closeTableTab("City"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,130 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - M2M Column validation`, () => { |
||||
// before(() => {
|
||||
// cy.openTableTab("Actor", 25);
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// after(() => {
|
||||
// cy.closeTableTab("Actor");
|
||||
// });
|
||||
|
||||
it("Table column header, URL validation", () => { |
||||
cy.openTableTab("Actor", 25); |
||||
// column name validation
|
||||
// cy.get(`.project-tab:contains(Actor):visible`).should("exist");
|
||||
// URL validation
|
||||
cy.url().should("contain", `table/Actor`); |
||||
}); |
||||
|
||||
it("M2m chip content validation on grid", () => { |
||||
// grid m2m content validation
|
||||
mainPage |
||||
.getCell("Film List", 1) |
||||
.find(".nc-virtual-cell > .chips-wrapper > .chips > .group > .name") |
||||
.contains("ACADEMY DINOSAUR") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("Film List", 1) |
||||
.find(".nc-virtual-cell > .chips-wrapper > .chips > .group > .name") |
||||
.contains("ANACONDA CONFESSIONS") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it("Expand m2m column", () => { |
||||
// expand first row
|
||||
mainPage |
||||
.getCell("Film List", 1) |
||||
.should("exist") |
||||
.trigger("mouseover") |
||||
.get(".nc-action-icon").eq(0).should("exist").click({ force: true }); |
||||
|
||||
// GUI-v2 Kludge:
|
||||
// validations
|
||||
// cy.getActiveModal().contains("Film").should("exist");
|
||||
// cy.getActiveModal().find("button.mdi-reload").should("exist");
|
||||
// cy.getActiveModal()
|
||||
// .find("button:contains(Link to 'Film')")
|
||||
// .should("exist");
|
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find(".ant-card") |
||||
.eq(0) |
||||
.contains("ACADEMY DINOSAUR") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it('Expand "Link to" record, validate', () => { |
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find("button:contains(Link to 'Film')") |
||||
.click() |
||||
.then(() => { |
||||
// Link record form validation
|
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.contains("Link record") |
||||
.should("exist"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".nc-reload") |
||||
.should("exist"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find('button:contains("Add new record")') |
||||
.should("exist"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.eq(0) |
||||
.contains("ACE GOLDFINGER") |
||||
.should("exist"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find("button.ant-modal-close") |
||||
.click(); |
||||
}); |
||||
}); |
||||
|
||||
it("Expand first linked card, validate", () => { |
||||
// expand first row
|
||||
mainPage |
||||
.getCell("Film List", 1) |
||||
.should("exist") |
||||
.trigger("mouseover") |
||||
.get(".nc-action-icon").eq(0).should("exist").click({ force: true }); |
||||
|
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find(".ant-card") |
||||
.eq(0) |
||||
.contains("ACADEMY DINOSAUR", { timeout: 2000 }) |
||||
.click() |
||||
.then(() => { |
||||
// Link card validation
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".text-lg") |
||||
.contains("ACADEMY DINOSAUR") |
||||
.should("exist"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find('button:contains("Save row")') |
||||
.should("exist"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find('button:contains("Cancel")') |
||||
.should("exist"); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find('button:contains("Cancel")') |
||||
.should("exist") |
||||
.click(); |
||||
cy.getActiveModal().find("button.ant-modal-close").click(); |
||||
}); |
||||
|
||||
cy.closeTableTab("Actor"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,198 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Grid operations`, () => { |
||||
// before(() => {
|
||||
// // loginPage.loginAndOpenProject(apiType, dbType);
|
||||
//
|
||||
// // open country table
|
||||
// cy.openTableTab("Country", 25);
|
||||
// });
|
||||
//
|
||||
// after(() => {
|
||||
// cy.closeTableTab("Country");
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it("Check country table - Pagination", () => { |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
cy.get(".nc-pagination").should("exist"); |
||||
|
||||
// verify > pagination option
|
||||
mainPage.getPagination(">").click(); |
||||
mainPage |
||||
.getPagination(2) |
||||
.should("have.class", "ant-pagination-item-active"); |
||||
|
||||
// verify < pagination option
|
||||
mainPage.getPagination("<").click(); |
||||
mainPage |
||||
.getPagination(1) |
||||
.should("have.class", "ant-pagination-item-active"); |
||||
}); |
||||
|
||||
// create new row using + button in header
|
||||
//
|
||||
it("Add row using tool header button", () => { |
||||
// http://localhost:8080/api/v1/db/meta/audits/comments/count?ids[]=101&ids[]=102&ids[]=103&ids[]=104&ids[]=105&ids[]=106&ids[]=107&ids[]=108&ids[]=109&fk_model_id=md_zfkb9v3mzky958
|
||||
cy.intercept("/api/v1/db/meta/audits/comments/count*").as( |
||||
"waitForPageLoad" |
||||
); |
||||
|
||||
// add a row to end of Country table
|
||||
mainPage.addNewRowExpand("Country"); |
||||
cy.get(".nc-expand-col-Country") |
||||
.find(".nc-cell > input") |
||||
.first() |
||||
.type("Test Country"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".ant-btn-primary") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// cy.get("#data-table-form-Country > input")
|
||||
// .first()
|
||||
// .type("Test Country");
|
||||
// cy.contains("Save row").filter("button").click();
|
||||
|
||||
cy.toastWait("updated successfully"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".ant-btn") |
||||
.contains("Cancel") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// verify
|
||||
mainPage.getPagination(5).click(); |
||||
cy.wait("@waitForPageLoad"); |
||||
|
||||
mainPage.getCell("Country", 10).contains("Test Country").should("exist"); |
||||
}); |
||||
|
||||
// delete single row
|
||||
//
|
||||
it("Delete Row", () => { |
||||
// delete row added in previous step
|
||||
mainPage.getCell("Country", 10).rightclick(); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Delete Row") |
||||
.click(); |
||||
|
||||
// cy.toastWait('Deleted row successfully')
|
||||
|
||||
// verify
|
||||
cy.get(`:nth-child(10) > [data-title="Country"]`).should("not.exist"); |
||||
|
||||
mainPage.getPagination(1).click(); |
||||
}); |
||||
|
||||
// create new row using right click menu option
|
||||
//
|
||||
it.skip("Add row using rightclick menu option", () => { |
||||
// Temporary
|
||||
mainPage.getPagination(5).click(); |
||||
|
||||
mainPage.getCell("Country", 9).rightclick({ force: true }); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Insert New Row") |
||||
.click({ force: true }); |
||||
mainPage |
||||
.getCell("Country", 10) |
||||
.dblclick() |
||||
.find("input") |
||||
.type("Test Country-1{enter}"); |
||||
|
||||
mainPage.getCell("Country", 10).rightclick({ force: true }); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Insert New Row") |
||||
.click({ force: true }); |
||||
mainPage |
||||
.getCell("Country", 11) |
||||
.dblclick() |
||||
.find("input") |
||||
.type("Test Country-2{enter}"); |
||||
|
||||
// GUI-v2 Kludge:
|
||||
// to move cursor away from input field; enter key is not recognized
|
||||
// mainPage.getCell("Country", 10).click()
|
||||
|
||||
// verify
|
||||
mainPage |
||||
.getCell("Country", 10) |
||||
.contains("Test Country-1") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("Country", 11) |
||||
.contains("Test Country-2") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
// delete selected rows (multiple)
|
||||
//
|
||||
it.skip("Delete Selected", () => { |
||||
cy.get(".ant-checkbox").should("exist").eq(10).click({ force: true }); |
||||
cy.get(".ant-checkbox").should("exist").eq(11).click({ force: true }); |
||||
|
||||
mainPage.getCell("Country", 10).rightclick({ force: true }); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Delete Selected Rows") |
||||
.click({ force: true }); |
||||
|
||||
// verify
|
||||
// mainPage.getCell("Country", 10).should("not.exist");
|
||||
// mainPage.getCell("Country", 11).should("not.exist");
|
||||
cy.get(`:nth-child(10) > [data-title="Country"]`).should("not.exist"); |
||||
cy.get(`:nth-child(11) > [data-title="Country"]`).should("not.exist"); |
||||
|
||||
mainPage.getPagination(1).click(); |
||||
}); |
||||
|
||||
it("Enable sort", () => { |
||||
mainPage.sortField("Country", "Z → A"); |
||||
cy.contains("Zambia").should("exist"); |
||||
}); |
||||
|
||||
it("Disable sort", () => { |
||||
mainPage.clearSort(); |
||||
cy.contains("Zambia").should("not.exist"); |
||||
}); |
||||
|
||||
it("Hide field", () => { |
||||
mainPage.hideField("LastUpdate"); |
||||
}); |
||||
|
||||
it("Show field", () => { |
||||
mainPage.unhideField("LastUpdate"); |
||||
}); |
||||
|
||||
it("Create Filter", () => { |
||||
mainPage.filterField("Country", "is equal", "India"); |
||||
// cy.get("td:contains(India)").should("exist");
|
||||
mainPage.getCell("Country", 1).contains("India").should("exist"); |
||||
}); |
||||
|
||||
it("Delete Filter", () => { |
||||
// remove sort and check
|
||||
mainPage.filterReset(); |
||||
mainPage.getCell("Country", 1).contains("India").should("not.exist"); |
||||
// cy.contains("td:contains(India)").should("not.exist");
|
||||
|
||||
cy.closeTableTab("Country"); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
|
@ -1,369 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - FORMULA`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
// before(() => {
|
||||
// // loginPage.loginAndOpenProject(apiType, dbType)
|
||||
// cy.openTableTab("City", 25);
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// after(() => {
|
||||
// cy.closeTableTab("City");
|
||||
// });
|
||||
|
||||
// Given rowname & expected result for first 10 entries, validate
|
||||
// NOTE: Scroll issue with Cypress automation, to fix
|
||||
// validating partial data, row number 5 to 9
|
||||
//
|
||||
const rowValidation = (rowName, result) => { |
||||
// scroll back
|
||||
// cy.get(
|
||||
// `tbody > :nth-child(1) > [data-col="City"]`
|
||||
// ).scrollIntoView();
|
||||
|
||||
// for (let i = 0; i < 10; i++)
|
||||
for (let i = 3; i < 5; i++) |
||||
mainPage |
||||
.getCell(rowName, i + 1) |
||||
.contains(result[i].toString()) |
||||
.should("exist"); |
||||
// cy.get(`tbody > :nth-child(${i + 1}) > [data-col="${rowName}"]`)
|
||||
// .contains(result[i].toString())
|
||||
// .should("exist");
|
||||
}; |
||||
|
||||
// Routine to create a new look up column
|
||||
//
|
||||
const addFormulaBasedColumn = (columnName, formula) => { |
||||
cy.get(".nc-grid tr > th:last .nc-icon").click({ |
||||
force: true, |
||||
}); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find("input.nc-column-name-input", { timeout: 3000 }) |
||||
.should("exist") |
||||
.clear() |
||||
.type(columnName); |
||||
// cy.get(".nc-column-type-input").last().click().type("Formula");
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".nc-column-type-input") |
||||
.last() |
||||
.click() |
||||
.type("Formula"); |
||||
cy.getActiveSelection(".nc-dropdown-column-type") |
||||
.find(".ant-select-item-option") |
||||
.contains("Formula") |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find("textarea.nc-formula-input") |
||||
.click() |
||||
.type(formula, { parseSpecialCharSequences: false }); |
||||
// cy.get(".ant-btn-primary").contains("Save").should('exist').click();
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
|
||||
// cy.toastWait(`Column created`);
|
||||
cy.closeTableTab("City"); |
||||
cy.openTableTab("City", 25); |
||||
cy.get(`th[data-title="${columnName}"]`).should("exist"); |
||||
}; |
||||
|
||||
// routine to delete column
|
||||
//
|
||||
const deleteColumnByName = (columnName) => { |
||||
mainPage.deleteColumn(columnName); |
||||
}; |
||||
|
||||
// routine to edit column
|
||||
//
|
||||
const editColumnByName = (oldName, newName, newFormula) => { |
||||
cy.get(`th:contains(${oldName}) .nc-icon.ant-dropdown-trigger`) |
||||
.trigger("mouseover", { force: true }) |
||||
.click({ force: true }); |
||||
|
||||
// cy.get(".nc-column-edit").click();
|
||||
// cy.get(".nc-column-edit").should("not.be.visible");
|
||||
cy.getActiveMenu(".nc-dropdown-column-operations") |
||||
.find(".nc-column-edit") |
||||
.click(); |
||||
|
||||
if (newName !== oldName) { |
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find("input.nc-column-name-input", { timeout: 3000 }) |
||||
.should("exist") |
||||
.clear() |
||||
.type(newName); |
||||
} |
||||
|
||||
cy.get("textarea.nc-formula-input") |
||||
.click() |
||||
.clear() |
||||
.type(newFormula, { parseSpecialCharSequences: false }); |
||||
|
||||
cy.get(".ant-form-item-explain-error").should('not.exist'); |
||||
|
||||
cy.get(".ant-btn-primary").contains("Save").should("exist").click(); |
||||
// cy.toastWait(`Column created`);
|
||||
if (newName !== oldName) { |
||||
cy.get(`th[data-title="${oldName}"]`).should("not.exist"); |
||||
} |
||||
cy.get(`th[data-title="${newName}"]`).should("exist"); |
||||
}; |
||||
|
||||
// routine to edit a column with Circular Reference
|
||||
//
|
||||
const editCircularColumnByName = (columnName, newFormula) => { |
||||
cy.get(`th:contains(${columnName}) .nc-icon.ant-dropdown-trigger`) |
||||
.trigger("mouseover", { force: true }) |
||||
.click({ force: true }); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-column-operations") |
||||
.find(".nc-column-edit") |
||||
.click(); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find("input.nc-column-name-input", { timeout: 3000 }) |
||||
.should("exist"); |
||||
|
||||
cy.get("textarea.nc-formula-input") |
||||
.click() |
||||
.clear() |
||||
.type(newFormula, { parseSpecialCharSequences: false }); |
||||
|
||||
// clicking the Save button, should NOT submit the form
|
||||
cy.get(".ant-btn-primary").contains("Save").click(); |
||||
// therefore we can see the error
|
||||
cy.get(".ant-form-item-explain-error").contains("Can’t save field because it causes a circular reference"); |
||||
// then close the form without saving
|
||||
cy.get(".ant-btn").contains("Cancel").click(); |
||||
}; |
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
|
||||
// On City table (from Sakila DB), first 10 entries recorded here for verification
|
||||
let cityId = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; |
||||
let countryId = [87, 82, 101, 60, 97, 31, 107, 44, 44, 50]; |
||||
let city = [ |
||||
"A corua (La Corua)", |
||||
"Abha", |
||||
"Abu Dhabi", |
||||
"Acua", |
||||
"Adana", |
||||
"Addis Abeba", |
||||
"Aden", |
||||
"Adoni", |
||||
"Ahmadnagar", |
||||
"Akishima", |
||||
]; |
||||
|
||||
// Temporary locally computed expected results
|
||||
let RESULT_STRING = []; |
||||
let RESULT_MATH_0 = []; |
||||
let RESULT_MATH_1 = []; |
||||
let RESULT_MATH_2 = []; |
||||
let RESULT_MATH_3 = []; |
||||
let RESULT_WEEKDAY_0 = []; |
||||
let RESULT_WEEKDAY_1 = []; |
||||
let RESULT_CIRC_REF_0 = []; |
||||
let RESULT_CIRC_REF_1 = []; |
||||
let RESULT_CIRC_REF_2 = []; |
||||
let RESULT_CIRC_REF_0_FINAL = []; |
||||
let RESULT_CIRC_REF_2_FINAL = []; |
||||
|
||||
for (let i = 0; i < 10; i++) { |
||||
// CONCAT, LOWER, UPPER, TRIM
|
||||
RESULT_STRING[i] = `${city[i].toUpperCase()}${city[ |
||||
i |
||||
].toLowerCase()}trimmed`;
|
||||
|
||||
// ADD, AVG, LEN
|
||||
RESULT_MATH_0[i] = |
||||
cityId[i] + |
||||
countryId[i] + |
||||
(cityId[i] + countryId[i]) / 2 + |
||||
city[i].length; |
||||
|
||||
// CEILING, FLOOR, ROUND, MOD, MIN, MAX
|
||||
RESULT_MATH_1[i] = |
||||
Math.ceil(1.4) + |
||||
Math.floor(1.6) + |
||||
Math.round(2.5) + |
||||
(cityId[i] % 3) + |
||||
Math.min(cityId[i], countryId[i]) + |
||||
Math.max(cityId[i], countryId[i]); |
||||
|
||||
RESULT_MATH_2[i] = |
||||
1.23 + Math.min(2.34, 3.45) + Math.max(2.34, 3.45); |
||||
|
||||
// LOG, EXP, POWER, SQRT
|
||||
// only integer verification being computed, hence trunc
|
||||
RESULT_MATH_3[i] = Math.trunc( |
||||
Math.log(cityId[i]) + |
||||
Math.exp(cityId[i]) + |
||||
Math.pow(cityId[i], 3) + |
||||
Math.sqrt(countryId[i]) |
||||
); |
||||
|
||||
// WEEKDAY: starts from Monday
|
||||
RESULT_WEEKDAY_0[i] = 1; |
||||
// WEEKDAY: starts from Sunday
|
||||
RESULT_WEEKDAY_1[i] = 2; |
||||
|
||||
RESULT_CIRC_REF_0[i] = city[i] |
||||
RESULT_CIRC_REF_1[i] = city[i] |
||||
RESULT_CIRC_REF_2[i] = city[i] + city[i] |
||||
RESULT_CIRC_REF_0_FINAL[i] = city[i] + city[i] |
||||
RESULT_CIRC_REF_2_FINAL[i] = city[i] + city[i] + city[i] + city[i] |
||||
} |
||||
|
||||
it("Formula: ADD, AVG, LEN", () => { |
||||
cy.openTableTab("City", 25); |
||||
|
||||
addFormulaBasedColumn( |
||||
"NC_MATH_0", |
||||
"ADD({CityId}, {CountryId}) + AVG({CityId}, {CountryId}) + LEN({City})" |
||||
); |
||||
rowValidation("NC_MATH_0", RESULT_MATH_0); |
||||
}); |
||||
|
||||
it.skip("Formula: WEEKDAY", () => { |
||||
editColumnByName("NC_MATH_0", "NC_WEEKDAY_0", `WEEKDAY("2022-07-19")`); |
||||
rowValidation("NC_WEEKDAY_0", RESULT_WEEKDAY_0); |
||||
|
||||
editColumnByName( |
||||
"NC_WEEKDAY_0", |
||||
"NC_WEEKDAY_1", |
||||
`WEEKDAY("2022-07-19", "sunday")` |
||||
); |
||||
rowValidation("NC_WEEKDAY_1", RESULT_WEEKDAY_1); |
||||
}); |
||||
|
||||
it("Formula: CONCAT, LOWER, UPPER, TRIM", () => { |
||||
editColumnByName( |
||||
// "NC_WEEKDAY_1",
|
||||
"NC_MATH_0", |
||||
"NC_STR_1", |
||||
`CONCAT(UPPER({City}), LOWER({City}), TRIM(' trimmed '))` |
||||
); |
||||
rowValidation("NC_STR_1", RESULT_STRING); |
||||
}); |
||||
|
||||
it("Formula: CEILING, FLOOR, ROUND, MOD, MIN, MAX", () => { |
||||
editColumnByName( |
||||
"NC_STR_1", |
||||
"NC_MATH_1", |
||||
`CEILING(1.4) + FLOOR(1.6) + ROUND(2.5) + MOD({CityId}, 3) + MIN({CityId}, {CountryId}) + MAX({CityId}, {CountryId})` |
||||
); |
||||
rowValidation("NC_MATH_1", RESULT_MATH_1); |
||||
}); |
||||
|
||||
it("Formula: ROUND with decimals, MIN, MAX", () => { |
||||
editColumnByName( |
||||
"NC_MATH_1", |
||||
"NC_MATH_2", |
||||
`ROUND(1.2345, 2) + MIN(2.34, 3.45) + MAX(2.34, 3.45)` |
||||
); |
||||
rowValidation("NC_MATH_2", RESULT_MATH_2) |
||||
}) |
||||
|
||||
it("Formula: LOG, EXP, POWER, SQRT", () => { |
||||
// if (!isXcdb()) {
|
||||
if (dbType === "mysql") { |
||||
// SQLITE doesnt support LOG, EXP, POWER SQRT construct
|
||||
editColumnByName( |
||||
"NC_MATH_2", |
||||
"NC_MATH_3", |
||||
`LOG({CityId}) + EXP({CityId}) + POWER({CityId}, 3) + SQRT({CountryId})` |
||||
); |
||||
rowValidation("NC_MATH_3", RESULT_MATH_3); |
||||
} |
||||
}); |
||||
|
||||
it("Formula: NOW, EDIT & Delete column", () => { |
||||
// if (!isXcdb()) editColumnByName("NC_MATH_2", "NC_NOW", `NOW()`);
|
||||
if (dbType === "mysql") editColumnByName("NC_MATH_3", "NC_NOW", `NOW()`); |
||||
else editColumnByName("NC_MATH_2", "NC_NOW", `NOW()`); |
||||
deleteColumnByName("NC_NOW"); |
||||
|
||||
cy.closeTableTab("City"); |
||||
}); |
||||
|
||||
it("Formula: Circular references", () => { |
||||
cy.openTableTab("City", 25); |
||||
|
||||
addFormulaBasedColumn( |
||||
"NC_CIRC_REF_0", |
||||
"{City}" |
||||
); |
||||
addFormulaBasedColumn( |
||||
"NC_CIRC_REF_1", |
||||
"{NC_CIRC_REF_0}" |
||||
); |
||||
editCircularColumnByName( |
||||
"NC_CIRC_REF_0", |
||||
"{NC_CIRC_REF_1}" |
||||
); |
||||
|
||||
deleteColumnByName("NC_CIRC_REF_1"); |
||||
deleteColumnByName("NC_CIRC_REF_0"); |
||||
|
||||
cy.closeTableTab("City"); |
||||
}); |
||||
|
||||
it("Formula: Duplicated dependencies (neighbours)", () => { |
||||
cy.openTableTab("City", 25); |
||||
|
||||
addFormulaBasedColumn( |
||||
"NC_CIRC_REF_0", |
||||
"{City}" |
||||
); |
||||
addFormulaBasedColumn( |
||||
"NC_CIRC_REF_1", |
||||
"{NC_CIRC_REF_0}" |
||||
); |
||||
addFormulaBasedColumn( |
||||
"NC_CIRC_REF_2", |
||||
"CONCAT({NC_CIRC_REF_1},{NC_CIRC_REF_1})" |
||||
); |
||||
|
||||
rowValidation("NC_CIRC_REF_0", RESULT_CIRC_REF_0); |
||||
rowValidation("NC_CIRC_REF_1", RESULT_CIRC_REF_1); |
||||
rowValidation("NC_CIRC_REF_2", RESULT_CIRC_REF_2); |
||||
|
||||
editColumnByName( |
||||
"NC_CIRC_REF_0", |
||||
"NC_CIRC_REF_0", |
||||
"CONCAT({City},{City})" |
||||
); |
||||
|
||||
rowValidation("NC_CIRC_REF_0", RESULT_CIRC_REF_0_FINAL); |
||||
rowValidation("NC_CIRC_REF_2", RESULT_CIRC_REF_2_FINAL); |
||||
|
||||
deleteColumnByName("NC_CIRC_REF_2"); |
||||
deleteColumnByName("NC_CIRC_REF_1"); |
||||
deleteColumnByName("NC_CIRC_REF_0"); |
||||
|
||||
cy.closeTableTab("City"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,110 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - LookUp column`, () => { |
||||
// to retrieve few v-input nodes from their label
|
||||
//
|
||||
const fetchParentFromLabel = (label) => { |
||||
cy.get("label").contains(label).parents(".ant-row").click(); |
||||
}; |
||||
|
||||
// before(() => {
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// after(() => {
|
||||
// cy.closeTableTab("City");
|
||||
// });
|
||||
|
||||
// Routine to create a new look up column
|
||||
//
|
||||
const addLookUpColumn = (childTable, childCol) => { |
||||
cy.get(".nc-grid tr > th:last .nc-icon").click({ |
||||
force: true, |
||||
}); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find("input.nc-column-name-input") |
||||
.should("exist") |
||||
.clear() |
||||
.type(childCol); |
||||
// cy.get(".nc-column-type-input").last().click().type("Lookup");
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".nc-column-type-input") |
||||
.last() |
||||
.click() |
||||
.type("Lookup"); |
||||
cy.getActiveSelection(".nc-dropdown-column-type") |
||||
.find(".ant-select-item-option") |
||||
.contains("Lookup") |
||||
.click(); |
||||
|
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
// Configure Child table & column names
|
||||
fetchParentFromLabel("Child table"); |
||||
cy.getActiveSelection(".nc-dropdown-relation-table") |
||||
.find(".ant-select-item-option") |
||||
.contains(childTable) |
||||
.click(); |
||||
|
||||
fetchParentFromLabel("Child column"); |
||||
cy.getActiveSelection(".nc-dropdown-relation-column") |
||||
.find(".ant-select-item-option") |
||||
.contains(childCol) |
||||
.click(); |
||||
|
||||
// cy.get(".ant-btn-primary").contains("Save").should('exist').click();
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
cy.toastWait(`Column created`); |
||||
|
||||
cy.get(`th[data-title="${childCol}"]`).should("exist"); |
||||
}; |
||||
|
||||
// routine to delete column
|
||||
//
|
||||
const deleteColumnByName = (childCol) => { |
||||
mainPage.deleteColumn(childCol); |
||||
}; |
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
|
||||
it("Add Lookup column (Address, PostalCode) & Delete", () => { |
||||
cy.openTableTab("City", 25); |
||||
|
||||
addLookUpColumn("Address", "PostalCode"); |
||||
|
||||
// Verify first entry, will be displayed as alias here 'childColumn (from childTable)'
|
||||
mainPage.getCell("PostalCode", 1).contains("4166").should("exist"); |
||||
|
||||
deleteColumnByName("PostalCode"); |
||||
|
||||
cy.closeTableTab("City"); |
||||
}); |
||||
|
||||
it.skip("Add Lookup column (Country, CountryId) & Delete", () => { |
||||
addLookUpColumn("Country", "CountryId"); |
||||
|
||||
// Verify first entry, will be displayed as alias here 'childColumn (from childTable)'
|
||||
cy.get(`tbody > :nth-child(1) > [data-col="CountryId"]`) |
||||
.contains("87") |
||||
.should("exist"); |
||||
|
||||
deleteColumnByName("CountryId"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,147 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - RollUp column`, () => { |
||||
// to retrieve few v-input nodes from their label
|
||||
//
|
||||
const fetchParentFromLabel = (label) => { |
||||
cy.get("label").contains(label).parents(".ant-row").click(); |
||||
}; |
||||
|
||||
// before(() => {
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// after(() => {
|
||||
// cy.closeTableTab("Country");
|
||||
// });
|
||||
|
||||
// Routine to create a new look up column
|
||||
//
|
||||
const addRollUpColumn = ( |
||||
columnName, |
||||
childTable, |
||||
childCol, |
||||
aggregateFunc |
||||
) => { |
||||
cy.get(".nc-grid tr > th:last .nc-icon").click({ |
||||
force: true, |
||||
}); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find("input.nc-column-name-input") |
||||
.should("exist") |
||||
.clear() |
||||
.type(columnName); |
||||
// cy.get(".nc-column-type-input").last().click().type("RollUp");
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".nc-column-type-input") |
||||
.last() |
||||
.click() |
||||
.type("RollUp"); |
||||
cy.getActiveSelection(".nc-dropdown-column-type") |
||||
.find(".ant-select-item-option") |
||||
.contains("Rollup") |
||||
.click(); |
||||
|
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
// Configure Child table & column names
|
||||
fetchParentFromLabel("Child table"); |
||||
cy.getActiveSelection(".nc-dropdown-relation-table") |
||||
.find(".ant-select-item-option") |
||||
.contains(childTable) |
||||
.click(); |
||||
|
||||
fetchParentFromLabel("Child column"); |
||||
cy.getActiveSelection(".nc-dropdown-relation-column") |
||||
.find(".ant-select-item-option") |
||||
.contains(childCol) |
||||
.click(); |
||||
|
||||
fetchParentFromLabel("Aggregate function"); |
||||
cy.getActiveSelection(".nc-dropdown-rollup-function") |
||||
.find(".ant-select-item-option") |
||||
.contains(aggregateFunc) |
||||
.click(); |
||||
|
||||
// cy.get(".ant-btn-primary").contains("Save").should('exist').click();
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
cy.toastWait(`Column created`); |
||||
|
||||
cy.get(`th[data-title="${columnName}"]`).should("exist"); |
||||
}; |
||||
|
||||
// routine to delete column
|
||||
//
|
||||
const deleteColumnByName = (columnName) => { |
||||
mainPage.deleteColumn(columnName); |
||||
}; |
||||
|
||||
// routine to edit column
|
||||
//
|
||||
// const editColumnByName = (oldName, newName) => {
|
||||
// // verify if column exists before delete
|
||||
// cy.get(`th:contains(${oldName})`).should("exist");
|
||||
//
|
||||
// // delete opiton visible on mouse-over
|
||||
// cy.get(`th:contains(${oldName}) .mdi-menu-down`)
|
||||
// .trigger("mouseover")
|
||||
// .click();
|
||||
//
|
||||
// // edit/ save on pop-up
|
||||
// cy.get(".nc-column-edit").click();
|
||||
// cy.get(".nc-column-name-input input").clear().type(newName);
|
||||
// cy.get(".nc-col-create-or-edit-card").contains("Save").click();
|
||||
//
|
||||
// cy.toastWait("Successfully updated alias");
|
||||
//
|
||||
// // validate if deleted (column shouldnt exist)
|
||||
// cy.get(`th:contains(${oldName})`).should("not.exist");
|
||||
// cy.get(`th:contains(${newName})`).should("exist");
|
||||
// };
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
|
||||
it("Add Rollup column (City, City, count) & Delete", () => { |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
addRollUpColumn("RollUpCol", "City", "City", "count"); |
||||
|
||||
// Verify first entry, will be displayed as alias here 'childColumn (from childTable)'
|
||||
// intentionally verifying 4th item, as initial items are being masked out by list scroll down
|
||||
mainPage.getCell("RollUpCol", 4).contains("2").should("exist"); |
||||
|
||||
// editColumnByName("RollUpCol_2", "RollUpCol_New");
|
||||
deleteColumnByName("RollUpCol"); |
||||
|
||||
cy.closeTableTab("Country"); |
||||
}); |
||||
|
||||
it.skip("Add Rollup column (City, CountryId, count) & Delete", () => { |
||||
addRollUpColumn("RollUpCol_1", "City", "CountryId", "count"); |
||||
|
||||
// Verify first entry, will be displayed as alias here 'childColumn (from childTable)'
|
||||
cy.get(`tbody > :nth-child(4) > [data-col="RollUpCol_1"]`) |
||||
.contains("2") |
||||
.should("exist"); |
||||
|
||||
// editColumnByName("RollUpCol_1", "RollUpCol_New");
|
||||
deleteColumnByName("RollUpCol_New"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,296 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - DURATION`, () => { |
||||
const tableName = "DurationTable"; |
||||
|
||||
// to retrieve few v-input nodes from their label
|
||||
//
|
||||
const fetchParentFromLabel = (label) => { |
||||
cy.get("label").contains(label).parents(".ant-row").first().click(); |
||||
}; |
||||
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.createTable(tableName); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// Run once before test- create table
|
||||
//
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.deleteTable(tableName); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// Routine to create a new look up column
|
||||
//
|
||||
const addDurationColumn = (columnName, durationFormat) => { |
||||
cy.get(".nc-grid tr > th:last .nc-icon").click({ |
||||
force: true, |
||||
}); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find("input.nc-column-name-input", { timeout: 3000 }) |
||||
.should("exist") |
||||
.clear() |
||||
.type(columnName); |
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".nc-column-type-input") |
||||
.last() |
||||
.click() |
||||
.type("Duration"); |
||||
cy.getActiveSelection(".nc-dropdown-column-type") |
||||
.find(".ant-select-item-option") |
||||
.contains("Duration") |
||||
.click(); |
||||
|
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
// Configure Duration format
|
||||
fetchParentFromLabel("Duration Format"); |
||||
cy.getActiveSelection(".nc-dropdown-duration-option") |
||||
.find(".ant-select-item-option") |
||||
.contains(durationFormat) |
||||
.click(); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
cy.toastWait(`Column created`); |
||||
|
||||
cy.get(`th[data-title="${columnName}"]`).should("exist"); |
||||
}; |
||||
|
||||
// routine to delete column
|
||||
//
|
||||
const deleteColumnByName = (columnName) => { |
||||
mainPage.deleteColumn(columnName); |
||||
}; |
||||
|
||||
// routine to edit column
|
||||
//
|
||||
const editColumnByName = (oldName, newName, newDurationFormat) => { |
||||
cy.get(`th:contains(${oldName}) .nc-icon.ant-dropdown-trigger`) |
||||
.trigger("mouseover", { force: true }) |
||||
.click({ force: true }); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-column-operations") |
||||
.find(".nc-column-edit") |
||||
.click(); |
||||
|
||||
// rename column and verify
|
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find("input.nc-column-name-input", { timeout: 3000 }) |
||||
.should("exist") |
||||
.clear() |
||||
.type(newName); |
||||
|
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
// Configure Duration format
|
||||
fetchParentFromLabel("Duration Format"); |
||||
cy.getActiveSelection(".nc-dropdown-duration-option") |
||||
.find(".ant-select-item-option") |
||||
.contains(newDurationFormat) |
||||
.click(); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
|
||||
cy.toastWait("Column updated"); |
||||
|
||||
cy.get(`th:contains(${oldName})`).should("not.exist"); |
||||
cy.get(`th:contains(${newName})`).should("exist"); |
||||
}; |
||||
|
||||
const addDurationData = ( |
||||
colName, |
||||
index, |
||||
cellValue, |
||||
expectedValue, |
||||
isNewRow = false |
||||
) => { |
||||
if (isNewRow) { |
||||
mainPage.addNewRowExpand("DurationTable"); |
||||
} else { |
||||
// mainPage.getRow(index).find(".nc-row-expand-icon").click({ force: true });
|
||||
cy.get(".nc-row-expand") |
||||
.eq(index - 1) |
||||
.click({ force: true }); |
||||
} |
||||
cy.get(".duration-cell-wrapper > input") |
||||
.first() |
||||
.should("exist") |
||||
.type(cellValue); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
cy.toastWait("Row updated successfully"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Cancel") |
||||
.should("exist") |
||||
.click(); |
||||
mainPage.getCell(colName, index).contains(expectedValue).should("exist"); |
||||
}; |
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
{ |
||||
// Duration: h:mm
|
||||
it("Duration: h:mm", () => { |
||||
addDurationColumn("NC_DURATION_0", "h:mm (e.g. 1:23)"); |
||||
addDurationData("NC_DURATION_0", 1, "1:30", "01:30", true); |
||||
addDurationData("NC_DURATION_0", 2, "30", "00:30", true); |
||||
addDurationData("NC_DURATION_0", 3, "60", "01:00", true); |
||||
addDurationData("NC_DURATION_0", 4, "80", "01:20", true); |
||||
addDurationData("NC_DURATION_0", 5, "12:34", "12:34", true); |
||||
addDurationData("NC_DURATION_0", 6, "15:130", "17:10", true); |
||||
addDurationData("NC_DURATION_0", 7, "123123", "2052:03", true); |
||||
}); |
||||
|
||||
it("Duration: Edit Column NC_DURATION_0", () => { |
||||
editColumnByName( |
||||
"NC_DURATION_0", |
||||
"NC_DURATION_EDITED_0", |
||||
"h:mm:ss (e.g. 3:45, 1:23:40)" |
||||
); |
||||
}); |
||||
|
||||
it("Duration: Delete column", () => { |
||||
deleteColumnByName("NC_DURATION_EDITED_0"); |
||||
}); |
||||
} |
||||
|
||||
{ |
||||
// Duration: h:mm:ss
|
||||
it("Duration: h:mm:ss", () => { |
||||
addDurationColumn("NC_DURATION_1", "h:mm:ss (e.g. 3:45, 1:23:40)"); |
||||
addDurationData("NC_DURATION_1", 1, "11:22:33", "11:22:33"); |
||||
addDurationData("NC_DURATION_1", 2, "1234", "00:20:34"); |
||||
addDurationData("NC_DURATION_1", 3, "50", "00:00:50"); |
||||
addDurationData("NC_DURATION_1", 4, "1:1111", "00:19:31"); |
||||
addDurationData("NC_DURATION_1", 5, "1:11:1111", "01:29:31"); |
||||
addDurationData("NC_DURATION_1", 6, "15:130", "00:17:10"); |
||||
addDurationData("NC_DURATION_1", 7, "123123", "34:12:03"); |
||||
}); |
||||
|
||||
it("Duration: Edit Column NC_DURATION_1", () => { |
||||
editColumnByName( |
||||
"NC_DURATION_1", |
||||
"NC_DURATION_EDITED_1", |
||||
"h:mm:ss.s (e.g. 3:34.6, 1:23:40.0)" |
||||
); |
||||
}); |
||||
|
||||
it("Duration: Delete column", () => { |
||||
deleteColumnByName("NC_DURATION_EDITED_1"); |
||||
}); |
||||
} |
||||
|
||||
{ |
||||
// h:mm:ss.s
|
||||
it("Duration: h:mm:ss.s", () => { |
||||
addDurationColumn( |
||||
"NC_DURATION_2", |
||||
"h:mm:ss.s (e.g. 3:34.6, 1:23:40.0)" |
||||
); |
||||
addDurationData("NC_DURATION_2", 1, "1234", "00:20:34.0"); |
||||
addDurationData("NC_DURATION_2", 2, "12:34", "00:12:34.0"); |
||||
addDurationData("NC_DURATION_2", 3, "12:34:56", "12:34:56.0"); |
||||
addDurationData("NC_DURATION_2", 4, "12:34:999", "12:50:39.0"); |
||||
addDurationData("NC_DURATION_2", 5, "12:999:56", "28:39:56.0"); |
||||
addDurationData("NC_DURATION_2", 6, "12:34:56.12", "12:34:56.1"); |
||||
addDurationData("NC_DURATION_2", 7, "12:34:56.199", "12:34:56.2"); |
||||
}); |
||||
|
||||
it("Duration: Edit Column NC_DURATION_2", () => { |
||||
editColumnByName( |
||||
"NC_DURATION_2", |
||||
"NC_DURATION_EDITED_2", |
||||
"h:mm:ss (e.g. 3:45, 1:23:40)" |
||||
); |
||||
}); |
||||
|
||||
it("Duration: Delete column", () => { |
||||
deleteColumnByName("NC_DURATION_EDITED_2"); |
||||
}); |
||||
} |
||||
|
||||
{ |
||||
// h:mm:ss.ss
|
||||
it("Duration: h:mm:ss.ss", () => { |
||||
addDurationColumn( |
||||
"NC_DURATION_3", |
||||
"h:mm:ss.ss (e.g. 3.45.67, 1:23:40.00)" |
||||
); |
||||
addDurationData("NC_DURATION_3", 1, "1234", "00:20:34.00"); |
||||
addDurationData("NC_DURATION_3", 2, "12:34", "00:12:34.00"); |
||||
addDurationData("NC_DURATION_3", 3, "12:34:56", "12:34:56.00"); |
||||
addDurationData("NC_DURATION_3", 4, "12:34:999", "12:50:39.00"); |
||||
addDurationData("NC_DURATION_3", 5, "12:999:56", "28:39:56.00"); |
||||
addDurationData("NC_DURATION_3", 6, "12:34:56.12", "12:34:56.12"); |
||||
addDurationData("NC_DURATION_3", 7, "12:34:56.199", "12:34:56.20"); |
||||
}); |
||||
|
||||
it("Duration: Edit Column NC_DURATION_3", () => { |
||||
editColumnByName( |
||||
"NC_DURATION_3", |
||||
"NC_DURATION_EDITED_3", |
||||
"h:mm:ss.ss (e.g. 3.45.67, 1:23:40.00)" |
||||
); |
||||
}); |
||||
|
||||
it("Duration: Delete column", () => { |
||||
deleteColumnByName("NC_DURATION_EDITED_3"); |
||||
}); |
||||
} |
||||
|
||||
{ |
||||
// h:mm:ss.sss
|
||||
it("Duration: h:mm:ss.sss", () => { |
||||
addDurationColumn( |
||||
"NC_DURATION_4", |
||||
"h:mm:ss.sss (e.g. 3.45.678, 1:23:40.000)" |
||||
); |
||||
addDurationData("NC_DURATION_4", 1, "1234", "00:20:34.000"); |
||||
addDurationData("NC_DURATION_4", 2, "12:34", "00:12:34.000"); |
||||
addDurationData("NC_DURATION_4", 3, "12:34:56", "12:34:56.000"); |
||||
addDurationData("NC_DURATION_4", 4, "12:34:999", "12:50:39.000"); |
||||
addDurationData("NC_DURATION_4", 5, "12:999:56", "28:39:56.000"); |
||||
addDurationData("NC_DURATION_4", 6, "12:34:56.12", "12:34:56.012"); |
||||
addDurationData("NC_DURATION_4", 7, "12:34:56.199", "12:34:56.199"); |
||||
}); |
||||
|
||||
it("Duration: Edit Column NC_DURATION_4", () => { |
||||
editColumnByName( |
||||
"NC_DURATION_4", |
||||
"NC_DURATION_EDITED_4", |
||||
"h:mm (e.g. 1:23)" |
||||
); |
||||
}); |
||||
|
||||
it("Duration: Delete column", () => { |
||||
deleteColumnByName("NC_DURATION_EDITED_4"); |
||||
}); |
||||
} |
||||
}); |
||||
}; |
@ -1,380 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
// tbd: this needs a proper fix
|
||||
let waitTime = 0; |
||||
let clear; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Link to another record`, () => { |
||||
function fetchParentFromLabel(label) { |
||||
cy.get("label").contains(label).parents(".ant-row").click(); |
||||
} |
||||
|
||||
// Insert new row
|
||||
function addRow(index, cellValue) { |
||||
cy.get(".nc-grid-add-new-cell").should("exist").click(); |
||||
mainPage |
||||
.getCell("Title", index) |
||||
.dblclick() |
||||
.then(($el) => { |
||||
cy.wrap($el).find("input").clear().type(`${cellValue}{enter}`); |
||||
}); |
||||
mainPage.getCell("Title", index).contains(cellValue).should("exist"); |
||||
} |
||||
|
||||
// Insert LTAR column
|
||||
//
|
||||
function addLtarColumn(columnName, foreignTable, relationType) { |
||||
// + icon
|
||||
cy.get(".nc-grid tr > th:last .nc-icon").click(); |
||||
|
||||
// Column name
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find("input.nc-column-name-input", { timeout: 3000 }) |
||||
.should("exist") |
||||
.clear() |
||||
.type(columnName); |
||||
|
||||
// Column type
|
||||
// cy.get(".nc-column-type-input").last()
|
||||
// .click()
|
||||
// .type("Link");
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".nc-column-type-input") |
||||
.last() |
||||
.click() |
||||
.type("Link"); |
||||
cy.getActiveSelection(".nc-dropdown-column-type") |
||||
.find(".ant-select-item-option") |
||||
.contains("LinkToAnotherRecord") |
||||
.click(); |
||||
|
||||
// relation type (hm/ mm)
|
||||
cy.get(".nc-ltar-relation-type") |
||||
.find(".ant-radio") |
||||
.eq(relationType === "hm" ? 0 : 1) |
||||
.click(); |
||||
|
||||
// Foreign table
|
||||
fetchParentFromLabel("Child table"); |
||||
cy.get(".nc-ltar-child-table").last().click().type(foreignTable); |
||||
cy.getActiveSelection(".nc-dropdown-ltar-child-table") |
||||
.find(".ant-select-item-option") |
||||
.contains(foreignTable) |
||||
.click(); |
||||
|
||||
// Save
|
||||
// cy.get(".ant-btn-primary")
|
||||
// .contains("Save")
|
||||
// .should('exist')
|
||||
// .click();
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
|
||||
// Toast
|
||||
cy.toastWait(`Column created`); |
||||
|
||||
// Verify
|
||||
cy.get(`th[data-title="${columnName}"]`).should("exist"); |
||||
} |
||||
|
||||
// Content verification for LTAR cell
|
||||
// Validates only 1st chip contents
|
||||
//
|
||||
function verifyLtarCell(columnName, index, cellValue) { |
||||
cy.get(`:nth-child(${index}) > [data-title="${columnName}"]`) |
||||
.find(".chip") |
||||
.eq(0) |
||||
.contains(cellValue) |
||||
.should("exist"); |
||||
} |
||||
|
||||
// Unlink LTAR cell
|
||||
//
|
||||
function ltarUnlink(columnName, index) { |
||||
// http://localhost:8080/api/v1/db/meta/audits/comments/count?ids[]=1&fk_model_id=md_f4y7jp89pe8vkt
|
||||
cy.intercept("GET", `/api/v1/db/meta/audits/comments/count?**`).as( |
||||
"unlinkCount" |
||||
); |
||||
|
||||
// Click on cell to enable unlink icon
|
||||
cy.get(`:nth-child(${index}) > [data-title="${columnName}"]`) |
||||
.last() |
||||
.click(); |
||||
|
||||
// Click on unlink icon
|
||||
cy.get(`:nth-child(${index}) > [data-title="${columnName}"]`) |
||||
.last() |
||||
.find(".unlink-icon") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// Glitch; hence wait
|
||||
cy.wait("@unlinkCount"); |
||||
} |
||||
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
// Cleanup
|
||||
//
|
||||
cy.restoreLocalStorage(); |
||||
|
||||
cy.openTableTab("Sheet1", 0); |
||||
mainPage.deleteColumn("Link1-2hm"); |
||||
mainPage.deleteColumn("Link1-2mm"); |
||||
mainPage.deleteColumn("Sheet2"); |
||||
cy.deleteTable("Sheet1"); |
||||
|
||||
cy.deleteTable("Sheet2"); |
||||
cy.saveLocalStorage(); |
||||
|
||||
Cypress.LocalStorage.clear = clear; |
||||
}); |
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
|
||||
it("Create Link columns", () => { |
||||
cy.createTable("Sheet1"); |
||||
cy.createTable("Sheet2"); |
||||
|
||||
cy.openTableTab("Sheet1", 0); |
||||
addRow(1, "1a"); |
||||
addRow(2, "1b"); |
||||
addRow(3, "1c"); |
||||
addLtarColumn("Link1-2hm", "Sheet2", "hm"); |
||||
addLtarColumn("Link1-2mm", "Sheet2", "mm"); |
||||
cy.closeTableTab("Sheet1"); |
||||
|
||||
cy.openTableTab("Sheet2", 0); |
||||
addLtarColumn("Link2-1hm", "Sheet1", "hm"); |
||||
cy.closeTableTab("Sheet2"); |
||||
|
||||
// Sheet2 now has all 3 column categories : HM, BT, MM
|
||||
//
|
||||
}); |
||||
|
||||
// Expand form [Add new row]
|
||||
//
|
||||
it("Add HM, BT, MM Link, Expand form", () => { |
||||
// http://localhost:8080/api/v1/db/data/noco/p_0l53e1xgsxlecb/md_mn4xgb2jnq16a7?limit=10&offset=0&where=&fields[]=Title&fields[]=Id
|
||||
cy.intercept("GET", `/api/v1/db/data/noco/**`).as("waitForCardLoad"); |
||||
|
||||
cy.openTableTab("Sheet2", 0); |
||||
|
||||
// Click on `Add new row` button
|
||||
mainPage.addNewRowExpand("Sheet2"); |
||||
|
||||
// Title
|
||||
cy.get(".nc-expand-col-Title") |
||||
.find(".nc-cell > input") |
||||
.should("exist") |
||||
.first() |
||||
.clear() |
||||
.type("2a"); |
||||
|
||||
// trigger("mouseover") is required to show the + icon
|
||||
// didn't seem to work. As a kludge, used click with {force:true}
|
||||
// additional delay ensures card contents are available before clicking
|
||||
//
|
||||
|
||||
// BT
|
||||
cy.get(".nc-expand-col-Sheet1") |
||||
.find(".nc-action-icon") |
||||
.should("exist") |
||||
.click({ force: true }); |
||||
cy.wait("@waitForCardLoad"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.should("exist") |
||||
.eq(0) |
||||
.click(); |
||||
|
||||
// MM
|
||||
cy.get(".nc-expand-col-Sheet1.List").find(".ant-btn-primary").click(); |
||||
cy.wait("@waitForCardLoad"); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.should("exist") |
||||
.eq(0) |
||||
.click(); |
||||
|
||||
// HM
|
||||
cy.get(".nc-expand-col-Link2-1hm").find(".ant-btn-primary").click(); |
||||
cy.wait("@waitForCardLoad"); |
||||
cy.getActiveModal().find(".ant-card").should("exist").eq(0).click(); |
||||
|
||||
// Save row
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// Toast
|
||||
cy.toastWait("updated successfully"); |
||||
|
||||
// Close modal
|
||||
cy.get("body").type("{esc}"); |
||||
}); |
||||
|
||||
// In cell insert
|
||||
it("Add HM, BT, MM Link, In cell form", () => { |
||||
// Insert row with `Title` field, rest of links are empty
|
||||
addRow(2, "2b"); |
||||
|
||||
// BT
|
||||
mainPage |
||||
.getCell("Sheet1", 2) |
||||
.find(".nc-action-icon") |
||||
.click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.should("exist") |
||||
.eq(1) |
||||
.click(); |
||||
|
||||
// MM
|
||||
mainPage |
||||
.getCell("Sheet1 List", 2) |
||||
.find(".nc-action-icon") |
||||
.last() |
||||
.click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.should("exist") |
||||
.eq(1) |
||||
.click(); |
||||
|
||||
// HM
|
||||
mainPage |
||||
.getCell("Link2-1hm", 2) |
||||
.find(".nc-action-icon") |
||||
.last() |
||||
.click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.should("exist") |
||||
.eq(1) |
||||
.click(); |
||||
}); |
||||
|
||||
// Existing row, expand record
|
||||
it("Add HM, BT, MM Link, expand record", () => { |
||||
// http://localhost:8080/api/v1/db/data/noco/p_0l53e1xgsxlecb/md_mn4xgb2jnq16a7?limit=10&offset=0&where=&fields[]=Title&fields[]=Id
|
||||
cy.intercept("GET", `/api/v1/db/data/noco/**`).as("waitForCardLoad"); |
||||
|
||||
addRow(3, "2c"); |
||||
// kludge; remove empty record in the end
|
||||
mainPage.getCell("Title", 3).click(); |
||||
mainPage.getCell("Title", 4).rightclick(); |
||||
// delete row
|
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.find('.ant-dropdown-menu-item:contains("Delete Row")') |
||||
.first() |
||||
.click(); |
||||
|
||||
cy.get(".nc-row-expand").eq(2).click({ force: true }); |
||||
|
||||
// wait for page render to complete
|
||||
cy.get('button:contains("Save row"):visible').should("exist"); |
||||
|
||||
// BT
|
||||
cy.get(".nc-expand-col-Sheet1") |
||||
.find(".nc-action-icon") |
||||
.should("exist") |
||||
.click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.should("exist") |
||||
.eq(2) |
||||
.click(); |
||||
|
||||
// MM
|
||||
cy.get(".nc-expand-col-Sheet1.List").find(".ant-btn-primary").click(); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.should("exist") |
||||
.eq(2) |
||||
.click(); |
||||
|
||||
// HM
|
||||
cy.get(".nc-expand-col-Link2-1hm").find(".ant-btn-primary").click(); |
||||
cy.getActiveModal(".nc-modal-link-record") |
||||
.find(".ant-card") |
||||
.should("exist") |
||||
.eq(2) |
||||
.click(); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// cy.toastWait("updated successfully");
|
||||
cy.toastWait("No columns to update"); |
||||
cy.get("body").type("{esc}"); |
||||
|
||||
verifyLtarCell("Sheet1", 1, "1a"); |
||||
verifyLtarCell("Sheet1", 2, "1b"); |
||||
verifyLtarCell("Sheet1", 3, "1c"); |
||||
verifyLtarCell("Sheet1 List", 1, "1a"); |
||||
verifyLtarCell("Sheet1 List", 2, "1b"); |
||||
verifyLtarCell("Sheet1 List", 3, "1c"); |
||||
verifyLtarCell("Link2-1hm", 1, "1a"); |
||||
verifyLtarCell("Link2-1hm", 2, "1b"); |
||||
verifyLtarCell("Link2-1hm", 3, "1c"); |
||||
|
||||
cy.closeTableTab("Sheet2"); |
||||
}); |
||||
|
||||
it("Verification", () => { |
||||
cy.openTableTab("Sheet1", 3); |
||||
verifyLtarCell("Link1-2hm", 1, "2a"); |
||||
verifyLtarCell("Link1-2hm", 2, "2b"); |
||||
verifyLtarCell("Link1-2hm", 3, "2c"); |
||||
verifyLtarCell("Link1-2mm", 1, "2a"); |
||||
verifyLtarCell("Link1-2mm", 2, "2b"); |
||||
verifyLtarCell("Link1-2mm", 3, "2c"); |
||||
verifyLtarCell("Sheet2", 1, "2a"); |
||||
verifyLtarCell("Sheet2", 2, "2b"); |
||||
verifyLtarCell("Sheet2", 3, "2c"); |
||||
cy.closeTableTab("Sheet1"); |
||||
}); |
||||
|
||||
it("Unlink", () => { |
||||
cy.openTableTab("Sheet1", 3); |
||||
ltarUnlink("Link1-2hm", 1); |
||||
ltarUnlink("Link1-2hm", 2); |
||||
ltarUnlink("Link1-2hm", 3); |
||||
ltarUnlink("Link1-2mm", 1); |
||||
ltarUnlink("Link1-2mm", 2); |
||||
ltarUnlink("Link1-2mm", 3); |
||||
ltarUnlink("Sheet2", 1); |
||||
ltarUnlink("Sheet2", 2); |
||||
ltarUnlink("Sheet2", 3); |
||||
cy.closeTableTab("Sheet1"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,95 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
function capitalizeFirstLetter(string) { |
||||
return string.charAt(0).toUpperCase() + string.slice(1); |
||||
} |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Table views: Create/Edit/Delete`, () => { |
||||
const name = "Test" + Date.now(); |
||||
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.openTableTab("Country", 25); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Country"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => { |
||||
it(`Create ${viewType} view`, () => { |
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find(".ant-btn-primary") |
||||
.click(); |
||||
cy.toastWait("View created successfully"); |
||||
|
||||
// validate if view was created && contains default name 'Country1'
|
||||
cy.get(`.nc-${viewType}-view-item`) |
||||
.contains(`${capitalizeFirstLetter(viewType)}-1`) |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Edit ${viewType} view name`, () => { |
||||
// click on edit-icon (becomes visible on hovering mouse)
|
||||
cy.get(`.nc-${viewType}-view-item`).last().dblclick(); |
||||
|
||||
// feed new name
|
||||
cy.get(`.nc-${viewType}-view-item input`) |
||||
.clear() |
||||
.type(`${viewType}View-1{enter}`); |
||||
cy.toastWait("View renamed successfully"); |
||||
|
||||
// validate
|
||||
cy.get(`.nc-${viewType}-view-item`) |
||||
.contains(`${viewType}View-1`) |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Delete ${viewType} view`, () => { |
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2); |
||||
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-view-delete") |
||||
.find(".ant-btn-dangerous") |
||||
.click(); |
||||
cy.toastWait("View deleted successfully"); |
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1); |
||||
}); |
||||
}; |
||||
|
||||
// below four scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("grid"); // grid view
|
||||
viewTest("gallery"); // gallery view
|
||||
viewTest("form"); // form view
|
||||
}); |
||||
}; |
@ -1,120 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
|
||||
let storedURL = ""; |
||||
let linkText = ""; |
||||
|
||||
const generateLinkWithPwd = () => { |
||||
mainPage.shareView().click(); |
||||
cy.getActiveModal(".nc-modal-share-view") |
||||
.find(".ant-modal-title") |
||||
.contains("This view is shared via a private link") |
||||
.should("be.visible"); |
||||
|
||||
// enable checkbox & feed pwd, save
|
||||
cy.get('[data-cy="nc-modal-share-view__with-password"]').click(); |
||||
cy.get('[data-cy="nc-modal-share-view__password"]').clear().type('1') |
||||
cy.get('[data-cy="nc-modal-share-view__save-password"]').click(); |
||||
cy.toastWait("Successfully updated"); |
||||
|
||||
// copy link text, visit URL
|
||||
cy.get('[data-cy="nc-modal-share-view__link"]').then(($el) => { |
||||
linkText = $el.text(); |
||||
// todo: visit url?
|
||||
cy.log(linkText); |
||||
}) |
||||
}; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Shared VIEWs (GRID)`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.openTableTab("City", 25); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("City"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it("Generate link with password", () => { |
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => { |
||||
storedURL = url; |
||||
}); |
||||
generateLinkWithPwd(); |
||||
|
||||
cy.signOut(); |
||||
}); |
||||
|
||||
it("Share view with incorrect password", () => { |
||||
cy.visit(linkText, { |
||||
baseUrl: null, |
||||
}); |
||||
|
||||
cy.getActiveModal(".nc-modal-shared-view-password-dlg").should("exist"); |
||||
|
||||
// feed password
|
||||
cy.getActiveModal(".nc-modal-shared-view-password-dlg") |
||||
.find('input[type="password"]') |
||||
.clear() |
||||
.type("a"); |
||||
cy.getActiveModal(".nc-modal-shared-view-password-dlg") |
||||
.find('button:contains("Unlock")') |
||||
.click(); |
||||
|
||||
// if pwd is incorrect, active modal requesting to feed in password again will persist
|
||||
cy.getActiveModal(".nc-modal-shared-view-password-dlg") |
||||
.find('button:contains("Unlock")') |
||||
.should("exist"); |
||||
}); |
||||
|
||||
// fallover test- use previously opened view & continue verification instead of opening again
|
||||
it("Share view with correct password", () => { |
||||
// feed password
|
||||
cy.getActiveModal(".nc-modal-shared-view-password-dlg") |
||||
.find('input[type="password"]') |
||||
.clear() |
||||
.type("1"); |
||||
cy.getActiveModal(".nc-modal-shared-view-password-dlg") |
||||
.find('button:contains("Unlock")') |
||||
.click(); |
||||
|
||||
// if pwd is incorrect, active modal requesting to feed in password again will persist
|
||||
// cy.getActiveModal().find('button:contains("Unlock")').should('not.exist');
|
||||
// cy.get(".ant-modal-content:visible").should("not.exist")
|
||||
|
||||
cy.wait(1000); |
||||
|
||||
// Verify Download as CSV is here
|
||||
mainPage.downloadCsv().should("exist"); |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
|
||||
mainPage.downloadExcel().should("exist"); |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
}); |
||||
|
||||
it("Delete view", () => { |
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
cy.openTableTab("City", 25); |
||||
|
||||
// wait for page load to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 25); |
||||
mainPage.deleteCreatedViews(); |
||||
}); |
||||
}); |
||||
}; |
@ -1,406 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
|
||||
let formViewURL; |
||||
|
||||
function verifyFormDrawerFieldLocation(fieldName, position) { |
||||
cy.get(".nc-editable.item").eq(position).contains(fieldName).should("exist"); |
||||
} |
||||
|
||||
function verifyFormDrawerHideObjectCount(count) { |
||||
if (count) { |
||||
cy.get(".nc-form") |
||||
.find(".nc-field-remove-icon") |
||||
.its("length") |
||||
.should("eq", count); |
||||
} else { |
||||
cy.get(".nc-form").find(".nc-field-remove-icon").should("not.exist"); |
||||
} |
||||
} |
||||
|
||||
function verifyFormMenuDrawerCardCount(cardCount) { |
||||
if (cardCount) { |
||||
cy.get(".nc-form-left-drawer") |
||||
.find(".ant-card") |
||||
.should("have.length", cardCount); |
||||
} else { |
||||
cy.get(".nc-form-left-drawer").find(".ant-card").should("not.exist"); |
||||
} |
||||
} |
||||
|
||||
function validateFormHeader() { |
||||
cy.get(".nc-form").should("exist"); |
||||
|
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Form Title"]') |
||||
.should("exist") |
||||
.then(($el) => { |
||||
cy.log($el); |
||||
expect($el.val()).to.equal("A B C D"); |
||||
}); |
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Add form description"]') |
||||
.should("exist") |
||||
.then(($el) => { |
||||
cy.log($el); |
||||
expect($el.val()).to.equal("Some description about form comes here"); |
||||
}); |
||||
} |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - FORM view`, () => { |
||||
const name = "Test" + Date.now(); |
||||
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
// standalone test
|
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.restoreLocalStorage(); |
||||
cy.openTableTab("Country", 25); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Country"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => { |
||||
it(`Create ${viewType} view`, () => { |
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find("button:contains(Submit)") |
||||
.click(); |
||||
|
||||
cy.toastWait("View created successfully"); |
||||
|
||||
// validate if view was creted && contains default name 'Form-1'
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Validate ${viewType} view: Drag & drop for re-order items`, () => { |
||||
// default order: Country, LastUpdate, Country => City
|
||||
verifyFormDrawerFieldLocation("Country", 0); |
||||
verifyFormDrawerFieldLocation("LastUpdate", 1); |
||||
|
||||
// move Country field down (drag, drop)
|
||||
cy.get(".nc-form-drag-LastUpdate").drag(".nc-form-drag-Country"); |
||||
cy.wait(1000); |
||||
|
||||
// Verify if order is: LastUpdate, Country, Country => City
|
||||
verifyFormDrawerFieldLocation("LastUpdate", 0); |
||||
verifyFormDrawerFieldLocation("Country", 1); |
||||
}); |
||||
|
||||
it(`Validate ${viewType} view: Drag & drop for add/remove items`, () => { |
||||
// default, only one item in menu-bar; ensure LastUpdate field was present in form view
|
||||
verifyFormMenuDrawerCardCount(0); |
||||
verifyFormDrawerFieldLocation("LastUpdate", 0); |
||||
|
||||
// drag 'LastUpdate' & drop into menu bar drag-drop box
|
||||
cy.get(".nc-form-drag-LastUpdate").drag(".nc-drag-n-drop-to-hide"); |
||||
|
||||
// validate- fields count in menu bar to be increased by 1 &&
|
||||
// first member in 'formView' is Country
|
||||
verifyFormDrawerFieldLocation("Country", 0); |
||||
verifyFormMenuDrawerCardCount(1); |
||||
}); |
||||
|
||||
it(`Validate ${viewType} view: Inverted order field member addition from menu`, () => { |
||||
cy.get(".nc-form-remove-all").click(); |
||||
verifyFormMenuDrawerCardCount(2); |
||||
|
||||
// click fields in inverted order: LastUpdate, Country => City
|
||||
cy.get(".nc-form-left-drawer").find(".ant-card").eq(1).click(); |
||||
|
||||
verifyFormMenuDrawerCardCount(1); |
||||
cy.get(".nc-form-left-drawer").find(".ant-card").eq(0).click(); |
||||
|
||||
// verify if order of appearance in form is right
|
||||
// Country was never removed as its required field. Other two will appear in inverted order
|
||||
verifyFormMenuDrawerCardCount(0); |
||||
verifyFormDrawerFieldLocation("Country", 0); |
||||
verifyFormDrawerFieldLocation("City List", 1); |
||||
verifyFormDrawerFieldLocation("LastUpdate", 2); |
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Form header & description validation`, () => { |
||||
// Header & description should exist
|
||||
cy.get(".nc-form").find('[placeholder="Form Title"]').should("exist"); |
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Add form description"]') |
||||
.should("exist"); |
||||
|
||||
// Update header & add some description, verify
|
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Form Title"]') |
||||
.clear() |
||||
.type("A B C D"); |
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Add form description"]') |
||||
.type("Some description about form comes here"); |
||||
|
||||
cy.get(".nc-form").click(); |
||||
|
||||
// validate new contents
|
||||
validateFormHeader(); |
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Add all, Remove all validation`, () => { |
||||
// ensure buttons exist on left hand menu
|
||||
cy.get(".nc-form-left-drawer") |
||||
.find(".nc-form-add-all") |
||||
.should("not.exist"); |
||||
cy.get(".nc-form-left-drawer") |
||||
.find(".nc-form-remove-all") |
||||
.should("be.visible"); |
||||
|
||||
// click: remove-all
|
||||
cy.get(".nc-form-left-drawer").find(".nc-form-remove-all").click(); |
||||
cy.wait(1000); |
||||
// form should not contain any "field remove icons"
|
||||
verifyFormDrawerHideObjectCount(0); |
||||
// menu bar should contain 2 .pointer.item (LastUpdate, County->City)
|
||||
verifyFormMenuDrawerCardCount(2); |
||||
|
||||
// click: Add all
|
||||
cy.get(".nc-form-left-drawer") |
||||
.find(".nc-form-add-all") |
||||
.should("be.visible") |
||||
.click(); |
||||
cy.get(".nc-form-left-drawer") |
||||
.find(".nc-form-remove-all") |
||||
.should("be.visible"); |
||||
|
||||
// form should contain "field remove icons"
|
||||
verifyFormDrawerHideObjectCount(2); |
||||
|
||||
// menu bar should not contain .pointer.item (column name/ field name add options)
|
||||
verifyFormMenuDrawerCardCount(0); |
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Submit default, empty show this message textbox`, () => { |
||||
// fill up mandatory fields
|
||||
cy.get(".nc-form-input-Country").type("_abc"); |
||||
cy.get(".nc-form-input-LastUpdate").click(); |
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click(); |
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click(); |
||||
|
||||
// default message, no update
|
||||
|
||||
// submit button & validate
|
||||
cy.get(".nc-form").find("button").contains("Submit").click(); |
||||
|
||||
cy.get( |
||||
".ant-alert-message :contains('Successfully submitted form data')" |
||||
).should("exist"); |
||||
|
||||
// end of test removes newly added rows from table. that step validates if row was successfully added.
|
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Submit default, with valid Show message entry`, () => { |
||||
// clicking again on view name shows blank still. work around- toggling between two views
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.click(); |
||||
|
||||
// fill up mandatory fields
|
||||
cy.get(".nc-form-input-Country").should("exist").type("_abc"); |
||||
cy.get(".nc-form-input-LastUpdate").click(); |
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click(); |
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click(); |
||||
|
||||
// add message
|
||||
cy.get("textarea.nc-form-after-submit-msg").type("Congratulations!"); |
||||
|
||||
// submit button & validate
|
||||
cy.get(".nc-form").find("button").contains("Submit").click(); |
||||
cy.get(".ant-alert-message :contains('Congratulations!')").should( |
||||
"exist" |
||||
); |
||||
|
||||
// end of test removes newly added rows from table. that step validates if row was successfully added.
|
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Submit default, Enable checkbox "Submit another form`, () => { |
||||
// clicking again on view name shows blank still. work around- toggling between two views
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.click(); |
||||
|
||||
// fill up mandatory fields
|
||||
cy.get(".nc-form-input-Country").type("_abc"); |
||||
cy.get(".nc-form-input-LastUpdate").click(); |
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click(); |
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click(); |
||||
|
||||
// enable "Submit another form" check box
|
||||
cy.get("button.nc-form-checkbox-submit-another-form").click(); |
||||
|
||||
// submit button & validate
|
||||
cy.get(".nc-form").find("button").contains("Submit").click(); |
||||
cy.get(".ant-alert-message :contains('Congratulations!')").should( |
||||
"exist" |
||||
); |
||||
cy.get("button") |
||||
.contains("Submit Another Form") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// New form appeared? Header & description should exist
|
||||
validateFormHeader(); |
||||
|
||||
// end of test removes newly added rows from table. that step validates if row was successfully added.
|
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Submit default, Enable checkbox "blank form after 5 seconds"`, () => { |
||||
cy.get(".nc-form-input-Country").type("_abc"); |
||||
cy.get(".nc-form-input-LastUpdate").click(); |
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click(); |
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click(); |
||||
|
||||
// enable "New form after 5 seconds" button
|
||||
cy.get("button.nc-form-checkbox-submit-another-form").click(); |
||||
cy.get("button.nc-form-checkbox-show-blank-form").click(); |
||||
|
||||
// submit button & validate
|
||||
cy.get(".nc-form").find("button").contains("Submit").click(); |
||||
cy.get(".ant-alert-message :contains('Congratulations!')") |
||||
.should("exist") |
||||
.then(() => { |
||||
// validate if form has appeared again
|
||||
validateFormHeader(); |
||||
}); |
||||
|
||||
// end of test removes newly added rows from table. that step validates if row was successfully added.
|
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Email me verification, without SMTP configuration`, () => { |
||||
// open formview & enable "email me" option
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.click(); |
||||
|
||||
// validate if form has appeared again
|
||||
cy.wait(1000); |
||||
validateFormHeader(); |
||||
cy.get(".nc-form-remove-all").click(); |
||||
|
||||
cy.get(".nc-form-checkbox-send-email").click(); |
||||
// validate if toaster pops up requesting to activate SMTP
|
||||
cy.toastWait( |
||||
"Please activate SMTP plugin in App store for enabling email notification" |
||||
); |
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Email me verification, with SMTP configuration`, () => { |
||||
// activate SMTP, dummy profile
|
||||
settingsPage.openMenu(settingsPage.APPSTORE); |
||||
mainPage.configureSMTP("admin@ex.com", "smtp.ex.com", "8080", "TLS"); |
||||
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.click(); |
||||
|
||||
// validate if form has appeared again
|
||||
validateFormHeader(); |
||||
|
||||
cy.get(".nc-form-checkbox-send-email").click(); |
||||
|
||||
settingsPage.openMenu(settingsPage.APPSTORE); |
||||
mainPage.resetSMTP(); |
||||
}); |
||||
|
||||
it(`Validate ${viewType}: Add/ remove field verification"`, () => { |
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.click(); |
||||
cy.get(".nc-form-add-all").click(); |
||||
|
||||
cy.wait(300); |
||||
|
||||
// validate if form has appeared again
|
||||
validateFormHeader(); |
||||
|
||||
cy.get(".nc-form-input-LastUpdate").should("exist"); |
||||
// remove "LastUpdate field"
|
||||
cy.get(".nc-form").find(".nc-field-remove-icon").eq(1).click(); |
||||
cy.get(".nc-form-input-LastUpdate").should("not.exist"); |
||||
|
||||
cy.get(".nc-form-left-drawer") |
||||
.find(".ant-card") |
||||
.contains("LastUpdate") |
||||
.should("exist") |
||||
.click(); |
||||
cy.get(".nc-form-input-LastUpdate").should("exist"); |
||||
|
||||
cy.wait(300); |
||||
}); |
||||
|
||||
it(`Validate ${viewType}: URL verification`, () => { |
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.click(); |
||||
|
||||
// validate if form has appeared again
|
||||
validateFormHeader(); |
||||
}); |
||||
|
||||
it(`Delete ${viewType} view`, () => { |
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2); |
||||
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-view-delete") |
||||
.find(".ant-btn-dangerous") |
||||
.click(); |
||||
cy.toastWait("View deleted successfully"); |
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1); |
||||
|
||||
// clean up newly added rows into Country table operations
|
||||
// this auto verifies successfull addition of rows to table as well
|
||||
mainPage.getPagination(5).click(); |
||||
|
||||
cy.get(".nc-grid-row").should("have.length", 13); |
||||
cy.get(".ant-checkbox").should("exist").eq(10).click({ force: true }); |
||||
cy.get(".ant-checkbox").should("exist").eq(11).click({ force: true }); |
||||
cy.get(".ant-checkbox").should("exist").eq(12).click({ force: true }); |
||||
cy.get(".ant-checkbox").should("exist").eq(13).click({ force: true }); |
||||
|
||||
mainPage.getCell("Country", 10).rightclick({ force: true }); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Delete Selected Rows") |
||||
.click({ force: true }); |
||||
}); |
||||
}; |
||||
|
||||
// below scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("form"); |
||||
}); |
||||
}; |
@ -1,107 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Lock view`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.openTableTab("Country", 25); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Country"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
const lockViewTest = (enabled) => { |
||||
it(`Grid: lock view set to ${enabled}: validation`, () => { |
||||
let vString = enabled ? "not." : ""; |
||||
let menuOption = enabled ? "Locked View" : "Collaborative View"; |
||||
|
||||
// on menu, collaboration view appears first (at index 0)
|
||||
// followed by Locked view (at index 1)
|
||||
cy.get(".nc-actions-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-submenu") |
||||
.eq(0) |
||||
.click(); |
||||
cy.wait(1000); |
||||
cy.get(".nc-locked-menu-item") |
||||
.contains(menuOption) |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// cy.get(".nc-sidebar-lock-menu")
|
||||
// .click();
|
||||
// cy.getActiveMenu()
|
||||
// .find('.nc-menu-item:visible')
|
||||
// .eq(menuOption)
|
||||
// .click();
|
||||
|
||||
if (enabled) { |
||||
cy.toastWait("Successfully Switched to locked view"); |
||||
cy.get(".nc-icon-locked").should("exist"); |
||||
} else { |
||||
cy.toastWait("Successfully Switched to collaborative view"); |
||||
cy.get(".nc-icon-collaborative").should("exist"); |
||||
} |
||||
|
||||
// expected toolbar for Lock view: Only lock-view menu, reload, toggle-nav-drawer to be enabled
|
||||
//
|
||||
// cy.get(".nc-sidebar-lock-menu:enabled")
|
||||
// .should("exist");
|
||||
|
||||
cy.get(".nc-toolbar-reload-btn").should("exist"); |
||||
cy.get(".nc-add-new-row-btn > .cursor-pointer").should( |
||||
`${vString}exist` |
||||
); |
||||
cy.get(".nc-fields-menu-btn:enabled").should(`${vString}exist`); |
||||
cy.get(".nc-sort-menu-btn:enabled").should(`${vString}exist`); |
||||
cy.get(".nc-filter-menu-btn:enabled").should(`${vString}exist`); |
||||
|
||||
// dblClick on a cell & see if we can edit
|
||||
mainPage.getCell("Country", 1).dblclick(); |
||||
mainPage.getCell("Country", 1).find("input").should(`${vString}exist`); |
||||
|
||||
// the expand button should be always enabled
|
||||
cy.get(".nc-row-expand").should("exist"); |
||||
|
||||
// check if add/ expand options available for 'has many' column type
|
||||
// GUI-v2: TBD
|
||||
mainPage |
||||
.getCell("City List", 1) |
||||
.click() |
||||
.find(".nc-action-icon.nc-plus") |
||||
.should(`${vString}exist`); |
||||
mainPage |
||||
.getCell("City List", 1) |
||||
.click() |
||||
.find(".nc-action-icon.nc-arrow-expand") |
||||
.should(`${vString}exist`); |
||||
|
||||
// update row option (right click) - should not be available for Lock view
|
||||
mainPage.getCell("City List", 1).rightclick(); |
||||
cy.get(".ant-dropdown-content").should(`${vString}be.visible`); |
||||
}); |
||||
}; |
||||
|
||||
// Locked view
|
||||
lockViewTest(true); |
||||
|
||||
// collaboration view
|
||||
lockViewTest(false); |
||||
}); |
||||
}; |
@ -1,226 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
|
||||
let storedURL = ""; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - FORM view (Share)`, () => { |
||||
const name = "Test" + Date.now(); |
||||
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.restoreLocalStorage(); |
||||
cy.openTableTab("City", 25); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("City"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => { |
||||
it(`Create ${viewType} view`, () => { |
||||
0; |
||||
|
||||
// click on create grid view button
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find("button:contains(Submit)") |
||||
.click(); |
||||
|
||||
cy.toastWait("View created successfully"); |
||||
|
||||
// validate if view was creted && contains default name 'Country1'
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.should("exist"); |
||||
|
||||
// Prepare form
|
||||
// add header, description
|
||||
// add post submission message
|
||||
// swap position for City, LastUpdate fields
|
||||
// remove City=>Address field
|
||||
// enable "Submit another form" check box
|
||||
cy.get("button.nc-form-checkbox-show-blank-form").click(); |
||||
|
||||
// [kludge] CI-CD: title is being rendered initially in disabled state
|
||||
cy.wait(2000); |
||||
|
||||
// Update header & add some description, verify
|
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Form Title"]') |
||||
.clear() |
||||
.type("A B C D"); |
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Add form description"]') |
||||
.type("Some description about form comes here"); |
||||
|
||||
// add message
|
||||
cy.get("textarea.nc-form-after-submit-msg").type("Congratulations!"); |
||||
|
||||
// move Country field down (drag, drop)
|
||||
cy.get(".nc-form-drag-LastUpdate").drag(".nc-form-drag-City"); |
||||
|
||||
cy.get('[title="Address List"]').drag(".nc-drag-n-drop-to-hide"); |
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => { |
||||
storedURL = url; |
||||
}); |
||||
}); |
||||
|
||||
it(`Share form view`, () => { |
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Form-1") |
||||
.click(); |
||||
|
||||
cy.wait(2000); |
||||
mainPage.shareView().click(); |
||||
// copy link text, visit URL
|
||||
cy.getActiveModal(".nc-modal-share-view") |
||||
.should("exist") |
||||
.find(".share-link-box") |
||||
.contains("/nc/form/", { timeout: 10000 }) |
||||
.should("exist") |
||||
.then(($obj) => { |
||||
// http://localhost:8080/api/v1/db/public/shared-view/761f0200-e72c-487a-85bf-615d0d277054/rows?offset=0&filterArrJson=[]&sortArrJson=[]
|
||||
cy.intercept("/api/v1/db/public/shared-view/**").as( |
||||
"waitForPageLoad" |
||||
); |
||||
|
||||
let linkText = $obj.text().trim(); |
||||
cy.log(linkText); |
||||
|
||||
cy.signOut(); |
||||
|
||||
cy.visit(linkText, { |
||||
baseUrl: null, |
||||
}); |
||||
cy.wait(["@waitForPageLoad"], { times: 2 }); |
||||
|
||||
// wait for share view page to load!
|
||||
|
||||
cy.get(".nc-form").should("exist"); |
||||
|
||||
// New form appeared? Header & description should exist
|
||||
cy.get(".nc-form-view", { timeout: 10000 }) |
||||
.find("h1") |
||||
.contains("A B C D") |
||||
.should("exist"); |
||||
cy.get(".nc-form-view", { timeout: 10000 }) |
||||
.find("h2") |
||||
.contains("Some description about form comes here") |
||||
.should("exist"); |
||||
|
||||
// all fields, barring removed field should exist
|
||||
cy.get('[title="City"]').should("exist"); |
||||
cy.get('[title="LastUpdate"]').should("exist"); |
||||
cy.get('[title="Country"]').should("exist"); |
||||
cy.get('[title="Address List"]').should("not.exist"); |
||||
|
||||
// order of LastUpdate & City field is retained
|
||||
cy.get(".nc-form-column-label") |
||||
.eq(0) |
||||
.contains("LastUpdate") |
||||
.should("exist"); |
||||
cy.get(".nc-form-column-label") |
||||
.eq(1) |
||||
.contains("City") |
||||
.should("exist"); |
||||
|
||||
// submit form, to read message
|
||||
cy.get(".nc-form-input-City").type("_abc"); |
||||
cy.get(".nc-form-input-LastUpdate").click(); |
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click(); |
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click(); |
||||
|
||||
// cy.get('.nc-form-field-Country')
|
||||
// .trigger('mouseover')
|
||||
// .click()
|
||||
// .find('.nc-action-icon')
|
||||
// .click();
|
||||
// // cy.get("button").contains("Link to 'Country'").click();
|
||||
// cy.getActiveModal()
|
||||
// .find(".ant-card")
|
||||
// .contains("Afghanistan")
|
||||
// .click();
|
||||
//
|
||||
// // submit button & validate
|
||||
// cy.get(".nc-form")
|
||||
// .find("button")
|
||||
// .contains("Submit")
|
||||
// .click();
|
||||
//
|
||||
// cy.get(".ant-alert-message")
|
||||
// .contains("Congratulations")
|
||||
// .should("exist")
|
||||
// .then(() => {
|
||||
// cy.get(".nc-form").should("exist");
|
||||
//
|
||||
// // validate if form has appeared again
|
||||
// cy.get(".nc-share-form-title")
|
||||
// .contains("A B C D")
|
||||
// .should("exist");
|
||||
// cy.get(".nc-share-form-desc")
|
||||
// .contains("Some description about form comes here")
|
||||
// .should("exist");
|
||||
// });
|
||||
}); |
||||
}); |
||||
|
||||
it(`Delete ${viewType} view`, () => { |
||||
// go back to base page
|
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
cy.openTableTab("City", 25); |
||||
|
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2); |
||||
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").click({ force: true }); |
||||
cy.wait(1000); |
||||
cy.getActiveModal(".nc-modal-view-delete") |
||||
.find(".ant-btn-dangerous") |
||||
.should("exist") |
||||
.click(); |
||||
cy.toastWait("View deleted successfully"); |
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1); |
||||
|
||||
// // clean up newly added rows into Country table operations
|
||||
// // this auto verifies successfull addition of rows to table as well
|
||||
// mainPage.getPagination(25).click();
|
||||
//
|
||||
// cy.get(".nc-grid-row").should("have.length", 1);
|
||||
// cy.get(".ant-checkbox").should('exist').eq(1).click({ force: true });
|
||||
// mainPage.getCell("Country", 1).rightclick({ force: true });
|
||||
// cy.getActiveMenu()
|
||||
// .contains("Delete Selected Rows")
|
||||
// .click({ force: true });
|
||||
}); |
||||
}; |
||||
|
||||
// below scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("form"); |
||||
}); |
||||
}; |
@ -1,477 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
|
||||
let storedURL = ""; |
||||
|
||||
// 0: all enabled
|
||||
// 1: field hide
|
||||
// 2: field sort
|
||||
// 3: field filter
|
||||
// 4: default (address table): for view operation validation
|
||||
// 5: default (country table): for update row/column validation
|
||||
let viewURL = {}; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
const generateViewLink = (viewName) => { |
||||
mainPage.shareView().click(); |
||||
|
||||
cy.wait(1000); |
||||
|
||||
// wait, as URL initially will be /undefined
|
||||
cy.getActiveModal(".nc-modal-share-view") |
||||
.find(".share-link-box") |
||||
.contains("/nc/view/", { timeout: 10000 }) |
||||
.should("exist"); |
||||
|
||||
// copy link text, visit URL
|
||||
cy.getActiveModal(".nc-modal-share-view") |
||||
.find(".share-link-box") |
||||
.contains("/nc/view/", { timeout: 10000 }) |
||||
.then(($obj) => { |
||||
// cy.get("body").type("{esc}");
|
||||
cy.closeActiveModal(".nc-modal-share-view"); |
||||
// viewURL.push($obj.text())
|
||||
viewURL[viewName] = $obj.text().trim(); |
||||
}); |
||||
|
||||
cy.getActiveModal(".nc-modal-share-view").should("not.be.visible"); |
||||
}; |
||||
|
||||
let clear; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - GRID view (Share)`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.openTableTab("Address", 25); |
||||
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
// close table
|
||||
// mainPage.deleteCreatedViews()
|
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Address"); |
||||
cy.saveLocalStorage(); |
||||
|
||||
Cypress.LocalStorage.clear = clear; |
||||
}); |
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => { |
||||
it(`Create ${viewType.toUpperCase()} view`, () => { |
||||
// create a normal public view
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find("button:contains(Submit)") |
||||
.click(); |
||||
cy.toastWait("View created successfully"); |
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => { |
||||
storedURL = url; |
||||
}); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} hide, sort, filter & verify`, () => { |
||||
cy.intercept("/api/v1/db/meta/audits/comments/**").as( |
||||
"waitForPageLoad" |
||||
); |
||||
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Grid-1") |
||||
.click(); |
||||
mainPage.hideField("Address2"); |
||||
mainPage.sortField("District", "Z → A"); |
||||
mainPage.filterField("Address", "is like", "Ab"); |
||||
generateViewLink("combined"); |
||||
cy.log(viewURL["combined"]); |
||||
|
||||
cy.wait(["@waitForPageLoad"]); |
||||
// kludge: additional wait to ensure page load is completed
|
||||
cy.wait(2000); |
||||
}); |
||||
|
||||
it(`Share GRID view : ensure we have only one link even if shared multiple times`, () => { |
||||
// generate view link multiple times
|
||||
generateViewLink("combined"); |
||||
generateViewLink("combined"); |
||||
|
||||
// verify if only one link exists in table
|
||||
mainPage.shareViewList().click(); |
||||
|
||||
cy.get('th:contains("View Link")').should("exist"); |
||||
|
||||
cy.get('th:contains("View Link")') |
||||
.parent() |
||||
.parent() |
||||
.next() |
||||
.find("tr") |
||||
.its("length") |
||||
.should("eq", 1) |
||||
.then(() => { |
||||
cy.get("button.ant-modal-close:visible").click(); |
||||
}); |
||||
|
||||
cy.signOut(); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Visit URL, Verify title`, () => { |
||||
// visit public view
|
||||
cy.visit(viewURL["combined"], { |
||||
baseUrl: null, |
||||
}); |
||||
cy.wait(5000); |
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 18); |
||||
|
||||
// verify title
|
||||
cy.get(".nc-shared-view-title").contains("Grid-1").should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify fields hidden/open`, () => { |
||||
// verify column headers
|
||||
cy.get('[data-title="Address"]').should("exist"); |
||||
cy.get('[data-title="Address2"]').should("not.exist"); |
||||
cy.get('[data-title="District"]').should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify fields sort/ filter`, () => { |
||||
// country column content verification before sort
|
||||
mainPage |
||||
.getCell("District", 1) |
||||
.contains("West Bengali") |
||||
.should("exist"); |
||||
mainPage.getCell("District", 2).contains("Tutuila").should("exist"); |
||||
mainPage.getCell("District", 3).contains("Tamil Nadu").should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify download CSV`, () => { |
||||
mainPage.hideField("LastUpdate"); |
||||
const verifyCsv = (retrievedRecords) => { |
||||
// expected output, statically configured
|
||||
let storedRecords = [ |
||||
`Address,District,PostalCode,Phone,Location,Customer List,Staff List,City,Staff List`, |
||||
`1013 Tabuk Boulevard,West Bengali,96203,158399646978,[object Object],2,,Kanchrapara,`, |
||||
`1892 Nabereznyje Telny Lane,Tutuila,28396,478229987054,[object Object],2,,Tafuna,`, |
||||
`1993 Tabuk Lane,Tamil Nadu,64221,648482415405,[object Object],2,,Tambaram,`, |
||||
`1661 Abha Drive,Tamil Nadu,14400,270456873752,[object Object],1,,Pudukkottai,`, |
||||
]; |
||||
|
||||
for (let i = 0; i < storedRecords.length; i++) { |
||||
let strCol = storedRecords[i].split(","); |
||||
let retCol = retrievedRecords[i].split(","); |
||||
for (let j = 0; j < 4; j++) { |
||||
expect(strCol[j]).to.be.equal(retCol[j]); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
// download & verify
|
||||
mainPage.downloadAndVerifyCsvFromSharedView( |
||||
`Address_exported_1.csv`, |
||||
verifyCsv |
||||
); |
||||
mainPage.unhideField("LastUpdate"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Disable sort`, () => { |
||||
// remove sort and validate
|
||||
mainPage.clearSort(); |
||||
mainPage |
||||
.getCell("District", 1) |
||||
.contains("West Bengali") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Enable sort`, () => { |
||||
// Sort menu operations (Country Column, Z → A)
|
||||
mainPage.sortField("District", "Z → A"); |
||||
mainPage |
||||
.getCell("District", 1) |
||||
.contains("West Bengali") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Create Filter`, () => { |
||||
// add filter & validate
|
||||
mainPage.filterField("District", "is like", "Tamil"); |
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 2); |
||||
mainPage.getCell("District", 1).contains("Tamil").should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify download CSV after local filter`, () => { |
||||
mainPage.hideField("LastUpdate"); |
||||
const verifyCsv = (retrievedRecords) => { |
||||
// expected output, statically configured
|
||||
let storedRecords = [ |
||||
`Address,District,PostalCode,Phone,Location,Customer List,Staff List,City,Staff List`, |
||||
`1993 Tabuk Lane,Tamil Nadu,64221,648482415405,[object Object],2,,Tambaram,`, |
||||
`1661 Abha Drive,Tamil Nadu,14400,270456873752,[object Object],1,,Pudukkottai,`, |
||||
]; |
||||
|
||||
// for (let i = 0; i < storedRecords.length; i++) {
|
||||
// expect(retrievedRecords[i]).to.be.equal(storedRecords[i])
|
||||
// }
|
||||
|
||||
// ncv2@fixme
|
||||
// for (let i = 0; i < storedRecords.length; i++) {
|
||||
// let strCol = storedRecords[i].split(",");
|
||||
// let retCol = retrievedRecords[i].split(",");
|
||||
// for (let j = 0; j < 4; j++) {
|
||||
// expect(strCol[j]).to.be.equal(retCol[j]);
|
||||
// }
|
||||
// }
|
||||
}; |
||||
mainPage.downloadAndVerifyCsvFromSharedView( |
||||
`Address_exported_1.csv`, |
||||
verifyCsv |
||||
); |
||||
mainPage.unhideField("LastUpdate"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Delete Filter`, () => { |
||||
// Remove sort and Validate
|
||||
mainPage.filterReset(); |
||||
mainPage |
||||
.getCell("District", 1) |
||||
.contains("West Bengali") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share GRID view : Virtual column validation > has many`, () => { |
||||
// verify column headers
|
||||
cy.get('[data-title="Customer List"]').should("exist"); |
||||
cy.get('[data-title="Staff List"]').should("exist"); |
||||
cy.get('[data-title="City"]').should("exist"); |
||||
cy.get('[data-title="Staff List"]').should("exist"); |
||||
|
||||
// has many field validation
|
||||
mainPage |
||||
.getCell("Customer List", 3) |
||||
.click() |
||||
.find(".nc-icon.nc-unlink-icon") |
||||
.should("not.exist"); |
||||
mainPage |
||||
.getCell("Customer List", 3) |
||||
.click() |
||||
.find(".nc-icon.nc-action-icon.nc-plus") |
||||
.should("not.exist"); |
||||
|
||||
// mainPage
|
||||
// .getCell("Customer List", 3)
|
||||
// .click()
|
||||
// .find(".nc-icon.nc-action-icon.nc-arrow-expand")
|
||||
// .click({ force: true });
|
||||
//
|
||||
// // reload button
|
||||
// cy.getActiveModal().find(".nc-icon").should("exist");
|
||||
// cy.getActiveModal()
|
||||
// .find("button")
|
||||
// .contains("Link to")
|
||||
// .should("not.exist");
|
||||
// cy.getActiveModal()
|
||||
// .find(".ant-card")
|
||||
// .contains("2")
|
||||
// .should("exist");
|
||||
// cy.getActiveModal()
|
||||
// .find(".ant-card")
|
||||
// .find("button")
|
||||
// .should("not.exist");
|
||||
// cy.get('button.ant-modal-close').click();
|
||||
}); |
||||
|
||||
it(`Share GRID view : Virtual column validation > belongs to`, () => { |
||||
// belongs to field validation
|
||||
mainPage |
||||
.getCell("City", 1) |
||||
.click() |
||||
.find(".nc-icon.nc-unlink-icon") |
||||
.should("not.exist"); |
||||
|
||||
mainPage |
||||
.getCell("City", 1) |
||||
.click() |
||||
.find(".nc-icon.nc-action-icon.nc-arrow-expand") |
||||
.should("not.exist"); |
||||
mainPage |
||||
.getCell("City", 1) |
||||
.find(".chips") |
||||
.contains("Kanchrapara") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share GRID view : Virtual column validation > many to many`, () => { |
||||
// many-to-many field validation
|
||||
mainPage |
||||
.getCell("Staff List", 1) |
||||
.click() |
||||
.find(".nc-icon.nc-unlink-icon") |
||||
.should("not.exist"); |
||||
mainPage |
||||
.getCell("Staff List", 1) |
||||
.click() |
||||
.find(".nc-icon.nc-action-icon.nc-plus") |
||||
.should("not.exist"); |
||||
|
||||
mainPage |
||||
.getCell("Staff List", 1) |
||||
.click() |
||||
.find(".nc-icon.nc-action-icon.nc-arrow-expand") |
||||
.click({ force: true }); |
||||
|
||||
// // reload button
|
||||
// Fix me : ncv2@fixme
|
||||
// cy.getActiveModal().find(".nc-icon").should("exist");
|
||||
// cy.getActiveModal()
|
||||
// .find("button")
|
||||
// .contains("Link to")
|
||||
// .should("not.exist");
|
||||
// cy.get('button.ant-modal-close:visible').last().click();
|
||||
}); |
||||
|
||||
it(`Delete ${viewType.toUpperCase()} view`, () => { |
||||
// go back to base page
|
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
cy.openTableTab("Address", 25); |
||||
|
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2); |
||||
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-view-delete") |
||||
.find(".ant-btn-dangerous") |
||||
.click(); |
||||
cy.toastWait("View deleted successfully"); |
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1); |
||||
}); |
||||
}; |
||||
|
||||
// below scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("grid"); |
||||
}); |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Grid view/ row-column update verification`, () => { |
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
// Address table has belongs to, has many & many-to-many
|
||||
cy.openTableTab("Country", 25); |
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => { |
||||
storedURL = url; |
||||
generateViewLink("rowColUpdate"); |
||||
}); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Country"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it(`Generate default Shared GRID view URL`, () => { |
||||
// add row
|
||||
mainPage.addNewRowExpand("Country"); |
||||
cy.get(".nc-expand-col-Country") |
||||
.find(".nc-cell > input") |
||||
.should("exist") |
||||
.first() |
||||
.clear({ force: true }) |
||||
.type("a"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
cy.toastWait("updated successfully"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Cancel") |
||||
.should("exist") |
||||
.click(); |
||||
// add column
|
||||
mainPage.addColumn("dummy", "Country"); |
||||
|
||||
cy.signOut(); |
||||
|
||||
// visit public view
|
||||
cy.log(viewURL["rowColUpdate"]); |
||||
cy.visit(viewURL["rowColUpdate"], { |
||||
baseUrl: null, |
||||
}); |
||||
cy.wait(5000); |
||||
|
||||
// wait for public view page to load!
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 25); |
||||
}); |
||||
|
||||
it(`Share GRID view : new row visible`, () => { |
||||
// verify row
|
||||
// cy.get(`.v-pagination > li:contains('5') button`).click();
|
||||
cy.get( |
||||
`.nc-pagination > .ant-pagination-item.ant-pagination-item-5` |
||||
).click(); |
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10); |
||||
mainPage.getCell("Country", 10).contains("a").should("exist"); |
||||
}); |
||||
|
||||
it(`Share GRID view : new column visible`, () => { |
||||
// verify column headers
|
||||
cy.get('[data-title="dummy"]').should("exist"); |
||||
}); |
||||
|
||||
it(`Clean up`, () => { |
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
// delete row
|
||||
mainPage.getPagination(5).click(); |
||||
// kludge: flicker on load
|
||||
cy.wait(3000); |
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10); |
||||
mainPage.getCell("Country", 10).rightclick(); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.find('.ant-dropdown-menu-item:contains("Delete Row")') |
||||
.first() |
||||
.click(); |
||||
|
||||
// delete column
|
||||
mainPage.deleteColumn("dummy"); |
||||
mainPage.deleteCreatedViews(); |
||||
}); |
||||
}); |
||||
}; |
@ -1,504 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
|
||||
let storedURL = ""; |
||||
|
||||
// 0: all enabled
|
||||
// 1: field hide
|
||||
// 2: field sort
|
||||
// 3: field filter
|
||||
// 4: default (address table): for view operation validation
|
||||
// 5: default (country table): for update row/column validation
|
||||
let viewURL = {}; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
function verifyLtarCell(columnName, index, cellValue, options) { |
||||
if (cellValue !== "") |
||||
cy.get(`:nth-child(${index}) > [data-title="${columnName}"]`) |
||||
.find(".chip") |
||||
.eq(0) |
||||
.contains(cellValue) |
||||
.should("exist"); |
||||
|
||||
mainPage |
||||
.getCell(columnName, index) |
||||
.click() |
||||
.find(".nc-icon.nc-unlink-icon") |
||||
.should(`${options.unlink ? "exist" : "not.exist"}`); |
||||
mainPage |
||||
.getCell(columnName, index) |
||||
.click() |
||||
.find(".nc-icon.nc-plus") |
||||
.should(`${options.plus ? "exist" : "not.exist"}`); |
||||
mainPage |
||||
.getCell(columnName, index) |
||||
.click() |
||||
.find(".nc-icon.nc-arrow-expand") |
||||
.should(`${options.expand ? "exist" : "not.exist"}`); |
||||
} |
||||
|
||||
function actionLtarCell(columnName, index, button) { |
||||
mainPage |
||||
.getCell(columnName, index) |
||||
.click() |
||||
.find(`.nc-icon${button}`) |
||||
.click({ force: true }); |
||||
} |
||||
|
||||
function verifyChildListCard(cardValue, options) { |
||||
// reload button
|
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find(`[data-cy="nc-child-list-reload"]`) |
||||
.should(`${options.reload ? "exist" : "not.exist"}`); |
||||
|
||||
// link-to button
|
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find(`[data-cy="nc-child-list-button-link-to"]`) |
||||
.should(`${options.linkTo ? "exist" : "not.exist"}`); |
||||
|
||||
// child card
|
||||
// - contents : should exist
|
||||
// - link-to button : should not exist
|
||||
// - delete button : should not exist
|
||||
if (cardValue !== "") { |
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find(".ant-card") |
||||
.contains(cardValue) |
||||
.should("exist"); |
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find(".ant-card") |
||||
.find(`[data-cy="nc-child-list-icon-unlink"]`) |
||||
.should(`${options.unlink ? "exist" : "not.exist"}`); |
||||
cy.getActiveModal(".nc-modal-child-list") |
||||
.find(".ant-card") |
||||
.find(`[data-cy="nc-child-list-icon-delete"]`) |
||||
.should(`${options.delete ? "exist" : "not.exist"}`); |
||||
} |
||||
} |
||||
|
||||
const generateViewLink = (viewName) => { |
||||
mainPage.shareView().click(); |
||||
|
||||
cy.wait(1000); |
||||
|
||||
// wait, as URL initially will be /undefined
|
||||
cy.getActiveModal(".nc-modal-share-view") |
||||
.find(".share-link-box") |
||||
.contains("/nc/view/", { timeout: 10000 }) |
||||
.should("exist"); |
||||
|
||||
// copy link text, visit URL
|
||||
cy.getActiveModal(".nc-modal-share-view") |
||||
.find(".share-link-box") |
||||
.contains("/nc/view/", { timeout: 10000 }) |
||||
.then(($obj) => { |
||||
// cy.get("body").type("{esc}");
|
||||
cy.closeActiveModal(".nc-modal-share-view"); |
||||
viewURL[viewName] = $obj.text().trim(); |
||||
}); |
||||
}; |
||||
|
||||
let clear; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - GRID view (Share)`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.openTableTab("Address", 25); |
||||
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
// close table
|
||||
// mainPage.deleteCreatedViews()
|
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Address"); |
||||
cy.saveLocalStorage(); |
||||
|
||||
Cypress.LocalStorage.clear = clear; |
||||
}); |
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => { |
||||
it(`Create ${viewType.toUpperCase()} view`, () => { |
||||
// create a normal public view
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find("button:contains(Submit)") |
||||
.click(); |
||||
cy.toastWait("View created successfully"); |
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => { |
||||
storedURL = url; |
||||
}); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} hide, sort, filter & verify`, () => { |
||||
cy.intercept("/api/v1/db/meta/audits/comments/**").as( |
||||
"waitForPageLoad" |
||||
); |
||||
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`) |
||||
.contains("Grid-1") |
||||
.click(); |
||||
mainPage.hideField("Address2"); |
||||
mainPage.sortField("Address", "Z → A"); |
||||
mainPage.filterField("Address", "is like", "Ab"); |
||||
generateViewLink("combined"); |
||||
cy.log(viewURL["combined"]); |
||||
|
||||
cy.wait(["@waitForPageLoad"]); |
||||
// kludge: additional wait to ensure page load is completed
|
||||
cy.wait(2000); |
||||
}); |
||||
|
||||
it(`Share GRID view : ensure we have only one link even if shared multiple times`, () => { |
||||
// generate view link multiple times
|
||||
generateViewLink("combined"); |
||||
generateViewLink("combined"); |
||||
|
||||
// verify if only one link exists in table
|
||||
mainPage.shareViewList().click(); |
||||
|
||||
cy.get('th:contains("View Link")').should("exist"); |
||||
|
||||
cy.get('th:contains("View Link")') |
||||
.parent() |
||||
.parent() |
||||
.next() |
||||
.find("tr") |
||||
.its("length") |
||||
.should("eq", 1) |
||||
.then(() => { |
||||
cy.get("button.ant-modal-close:visible").click(); |
||||
}); |
||||
|
||||
cy.signOut(); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Visit URL, Verify title`, () => { |
||||
// visit public view
|
||||
cy.visit(viewURL["combined"], { |
||||
baseUrl: null, |
||||
}); |
||||
cy.wait(5000); |
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 18); |
||||
|
||||
// verify title
|
||||
cy.get(".nc-shared-view-title").contains("Grid-1").should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify fields hidden/open`, () => { |
||||
// verify column headers
|
||||
cy.get('[data-title="Address"]').should("exist"); |
||||
cy.get('[data-title="Address2"]').should("not.exist"); |
||||
cy.get('[data-title="District"]').should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify fields sort/ filter`, () => { |
||||
// country column content verification before sort
|
||||
mainPage |
||||
.getCell("Address", 1) |
||||
.contains("669 Firozabad Loop") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("Address", 2) |
||||
.contains("48 Maracabo Place") |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("Address", 3) |
||||
.contains("44 Najafabad Way") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify download CSV`, () => { |
||||
mainPage.hideField("LastUpdate"); |
||||
const verifyCsv = (retrievedRecords) => { |
||||
// expected output, statically configured
|
||||
let storedRecords = [ |
||||
`Address,District,PostalCode,Phone`, |
||||
`669 Firozabad Loop,,92265,,[object Object],2,,Kanchrapara,`, |
||||
`48 Maracabo Place,,1570,,[object Object],2,,Tafuna,`, |
||||
`44 Najafabad Way,,61391,,[object Object],2,,Tambaram,`, |
||||
`381 Kabul Way,,87272,,[object Object],1,,Pudukkottai,`, |
||||
]; |
||||
|
||||
for (let i = 0; i < storedRecords.length; i++) { |
||||
let strCol = storedRecords[i].split(","); |
||||
let retCol = retrievedRecords[i].split(","); |
||||
expect(strCol[0]).to.be.equal(retCol[0]); |
||||
expect(strCol[2]).to.be.equal(retCol[2]); |
||||
// expect(retrievedRecords[i]).to.be.equal(storedRecords[i])
|
||||
} |
||||
}; |
||||
|
||||
// download & verify
|
||||
mainPage.downloadAndVerifyCsvFromSharedView( |
||||
`Address_exported_1.csv`, |
||||
verifyCsv |
||||
); |
||||
mainPage.unhideField("LastUpdate"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Disable sort`, () => { |
||||
// remove sort and validate
|
||||
mainPage.clearSort(); |
||||
mainPage |
||||
.getCell("Address", 1) |
||||
.contains("669 Firozabad Loop") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Enable sort`, () => { |
||||
// Sort menu operations (Country Column, Z->A)
|
||||
mainPage.sortField("Address", "A → Z"); |
||||
mainPage |
||||
.getCell("Address", 1) |
||||
.contains("1013 Tabuk Boulevard") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Create Filter`, () => { |
||||
// add filter & validate
|
||||
mainPage.filterField("Address", "is like", "drive"); |
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 3); |
||||
mainPage |
||||
.getCell("Address", 1) |
||||
.contains("1294 Firozabad Drive") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify download CSV after local filter`, () => { |
||||
mainPage.hideField("LastUpdate"); |
||||
const verifyCsv = (retrievedRecords) => { |
||||
// expected output, statically configured
|
||||
let storedRecords = [ |
||||
`Address,District,PostalCode,Phone,Location,Customer List,Staff List,City,Staff List`, |
||||
`1294 Firozabad Drive,,70618,,2,,Pingxiang,,`, |
||||
`1661 Abha Drive,,14400,,1,,Pudukkottai,,`, |
||||
]; |
||||
|
||||
// for (let i = 0; i < storedRecords.length; i++) {
|
||||
// expect(retrievedRecords[i]).to.be.equal(storedRecords[i])
|
||||
// }
|
||||
|
||||
for (let i = 0; i < storedRecords.length; i++) { |
||||
let strCol = storedRecords[i].split(","); |
||||
let retCol = retrievedRecords[i].split(","); |
||||
expect(strCol[0]).to.be.equal(retCol[0]); |
||||
expect(strCol[2]).to.be.equal(retCol[2]); |
||||
} |
||||
}; |
||||
mainPage.downloadAndVerifyCsvFromSharedView( |
||||
`Address_exported_1.csv`, |
||||
verifyCsv |
||||
); |
||||
mainPage.unhideField("LastUpdate"); |
||||
}); |
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Delete Filter`, () => { |
||||
// Remove sort and Validate
|
||||
mainPage.filterReset(); |
||||
mainPage.clearSort(); |
||||
|
||||
mainPage |
||||
.getCell("Address", 1) |
||||
.contains("669 Firozabad Loop") |
||||
.should("exist"); |
||||
}); |
||||
|
||||
it(`Share GRID view : Virtual column validation > has many`, () => { |
||||
// verify column headers
|
||||
cy.get('[data-title="Customer List"]').should("exist"); |
||||
cy.get('[data-title="Staff List"]').should("exist"); |
||||
cy.get('[data-title="City"]').should("exist"); |
||||
cy.get('[data-title="Staff List1"]').should("exist"); |
||||
|
||||
// has many field validation
|
||||
verifyLtarCell("Customer List", 1, "1", { |
||||
unlink: false, |
||||
plus: false, |
||||
expand: true, |
||||
}); |
||||
actionLtarCell("Customer List", 1, ".nc-arrow-expand"); |
||||
verifyChildListCard("1", { |
||||
reload: true, |
||||
linkTo: false, |
||||
unlink: false, |
||||
delete: false, |
||||
}); |
||||
cy.closeActiveModal(".nc-modal-child-list"); |
||||
}); |
||||
|
||||
it(`Share GRID view : Virtual column validation > belongs to`, () => { |
||||
// belongs to field validation
|
||||
verifyLtarCell("City", 1, "al-Ayn", { |
||||
unlink: false, |
||||
plus: false, |
||||
expand: false, |
||||
}); |
||||
}); |
||||
|
||||
it(`Share GRID view : Virtual column validation > many to many`, () => { |
||||
// many to many field verification
|
||||
verifyLtarCell("Staff List1", 1, "", { |
||||
unlink: false, |
||||
plus: false, |
||||
expand: true, |
||||
}); |
||||
actionLtarCell("Staff List1", 1, ".nc-arrow-expand"); |
||||
verifyChildListCard("", { |
||||
reload: true, |
||||
linkTo: false, |
||||
unlink: false, |
||||
delete: false, |
||||
}); |
||||
}); |
||||
|
||||
it(`Delete ${viewType.toUpperCase()} view`, () => { |
||||
// go back to base page
|
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
cy.openTableTab("Address", 25); |
||||
|
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2); |
||||
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-view-delete") |
||||
.find(".ant-btn-dangerous") |
||||
.click(); |
||||
cy.toastWait("View deleted successfully"); |
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1); |
||||
}); |
||||
}; |
||||
|
||||
// below scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("grid"); |
||||
}); |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Grid view/ row-column update verification`, () => { |
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
// Address table has belongs to, has many & many-to-many
|
||||
cy.openTableTab("Country", 25); |
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => { |
||||
storedURL = url; |
||||
generateViewLink("rowColUpdate"); |
||||
}); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Country"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it(`Generate default Shared GRID view URL`, () => { |
||||
// add row
|
||||
mainPage.addNewRowExpand("Country"); |
||||
cy.get(".nc-expand-col-Country") |
||||
.find(".nc-cell > input") |
||||
.should("exist") |
||||
.first() |
||||
.clear({ force: true }) |
||||
.type("a"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
cy.toastWait("updated successfully"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Cancel") |
||||
.should("exist") |
||||
.click(); |
||||
// add column
|
||||
mainPage.addColumn("dummy", "Country"); |
||||
|
||||
cy.signOut(); |
||||
|
||||
// visit public view
|
||||
cy.log(viewURL["rowColUpdate"]); |
||||
cy.visit(viewURL["rowColUpdate"], { |
||||
baseUrl: null, |
||||
}); |
||||
cy.wait(5000); |
||||
|
||||
// wait for public view page to load!
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 25); |
||||
}); |
||||
|
||||
it(`Share GRID view : new row visible`, () => { |
||||
// verify row
|
||||
// cy.get(`.v-pagination > li:contains('5') button`).click();
|
||||
cy.get( |
||||
`.nc-pagination > .ant-pagination-item.ant-pagination-item-5` |
||||
).click(); |
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10); |
||||
mainPage.getCell("Country", 10).contains("a").should("exist"); |
||||
}); |
||||
|
||||
it(`Share GRID view : new column visible`, () => { |
||||
// verify column headers
|
||||
cy.get('[data-title="dummy"]').should("exist"); |
||||
}); |
||||
|
||||
it(`Clean up`, () => { |
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
// delete row
|
||||
mainPage.getPagination(5).click(); |
||||
// kludge: flicker on load
|
||||
cy.wait(3000); |
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10); |
||||
mainPage.getCell("Country", 10).rightclick(); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.find('.ant-dropdown-menu-item:contains("Delete Row")') |
||||
.first() |
||||
.click(); |
||||
|
||||
// delete column
|
||||
mainPage.deleteColumn("dummy"); |
||||
mainPage.deleteCreatedViews(); |
||||
}); |
||||
}); |
||||
}; |
@ -1,210 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
|
||||
function capitalizeFirstLetter(string) { |
||||
return string.charAt(0).toUpperCase() + string.slice(1); |
||||
} |
||||
|
||||
// function verifyExpandFormHeader(title) {
|
||||
// cy.getActiveDrawer(".nc-drawer-expanded-form")
|
||||
// .should("exist")
|
||||
// .find(".nc-expanded-form-header")
|
||||
// .contains(title)
|
||||
// .should("exist");
|
||||
// }
|
||||
|
||||
function verifyExpandFormHeader(title) { |
||||
cy.get( |
||||
`.nc-drawer-expanded-form .nc-expanded-form-header :contains("${title}")` |
||||
).should("exist"); |
||||
} |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
let clear; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Table views: Expanded form`, () => { |
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.openTableTab("Country", 25); |
||||
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Country"); |
||||
cy.saveLocalStorage(); |
||||
Cypress.LocalStorage.clear = clear; |
||||
}); |
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => { |
||||
it(`Create ${viewType} view`, () => { |
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find(".ant-btn-primary") |
||||
.click(); |
||||
cy.toastWait("View created successfully"); |
||||
|
||||
// validate if view was created && contains default name 'Country1'
|
||||
cy.get(`.nc-${viewType}-view-item`) |
||||
.contains(`${capitalizeFirstLetter(viewType)}-1`) |
||||
.should("exist"); |
||||
|
||||
if (viewType === "gallery") { |
||||
// http://localhost:8080/api/v1/db/data/noco/p_4ufoizgrorwyey/md_g0zc9d40w8zpmy/views/vw_xauikhkm8r49fy?offset=0&limit=25
|
||||
cy.intercept("/api/v1/db/data/noco/**").as("getGalleryViewData"); |
||||
|
||||
// mainPage.unhideField("City List");
|
||||
cy.get(".nc-fields-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(`.nc-fields-list label:contains("City List"):visible`) |
||||
.click(); |
||||
cy.get(".nc-fields-menu-btn").click(); |
||||
|
||||
cy.wait(["@getGalleryViewData"]); |
||||
cy.get('.ant-card-body [title="City List"]').should("exist"); |
||||
} |
||||
}); |
||||
|
||||
it(`Expand a row in ${viewType} and verify url`, () => { |
||||
// click on first row-expand if grid & first card if its gallery
|
||||
if (viewType === "grid") { |
||||
cy.get(".nc-row-expand").first().click({ force: true }); |
||||
|
||||
// wait for page render to complete
|
||||
cy.get('button:contains("Save row"):visible').should("exist"); |
||||
} else if (viewType === "gallery") { |
||||
cy.get(".nc-gallery-container .ant-card").first().click(); |
||||
} |
||||
|
||||
// ensure expand draw is open
|
||||
verifyExpandFormHeader("Afghanistan"); |
||||
cy.url().should("include", "rowId=1"); |
||||
|
||||
// spy on clipboard to verify copied text
|
||||
// creating alias for clipboard
|
||||
cy.window().then((win) => { |
||||
cy.spy(win.navigator.clipboard, "writeText").as("copy"); |
||||
}); |
||||
|
||||
// copy url
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.should("exist") |
||||
.find(".nc-copy-row-url") |
||||
.click(); |
||||
|
||||
// use alias; verify if clipboard was called with correct text
|
||||
cy.get("@copy").should("be.calledWithMatch", `?rowId=1`); |
||||
|
||||
// close expanded form
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".nc-expand-form-close-btn") |
||||
.click(); |
||||
}); |
||||
|
||||
it(`Visit a ${viewType} row url and verify expanded form`, () => { |
||||
cy.url().then((url) => { |
||||
cy.visit( |
||||
"/" + url.split("/").slice(3).join("/").split("?")[0] + "?rowId=2" |
||||
); |
||||
|
||||
verifyExpandFormHeader("Algeria"); |
||||
}); |
||||
}); |
||||
|
||||
it(`Visit an invalid ${viewType} row url and verify expanded form`, () => { |
||||
cy.url().then((url) => { |
||||
cy.visit( |
||||
"/" + |
||||
url.split("/").slice(3).join("/").split("?")[0] + |
||||
"?rowId=99999999" |
||||
); |
||||
|
||||
cy.toastWait("Record not found"); |
||||
|
||||
cy.get(`.nc-drawer-expanded-form .ant-drawer-content:visible`).should( |
||||
"not.exist" |
||||
); |
||||
|
||||
// defaults to corresponding grid / gallery view
|
||||
cy.get(viewType === "grid" ? ".nc-grid" : ".nc-gallery").should( |
||||
"exist" |
||||
); |
||||
}); |
||||
}); |
||||
|
||||
it(`Visit a ${viewType} row url and verify nested expanded form`, () => { |
||||
cy.url().then((url) => { |
||||
cy.visit( |
||||
"/" + url.split("/").slice(3).join("/").split("?")[0] + "?rowId=1" |
||||
); |
||||
|
||||
verifyExpandFormHeader("Afghanistan"); |
||||
|
||||
cy.get(".nc-drawer-expanded-form .ant-drawer-content").should( |
||||
"exist" |
||||
); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".ant-card-body") |
||||
.first() |
||||
.click(); |
||||
|
||||
cy.get(".nc-drawer-expanded-form .ant-drawer-content").should( |
||||
"have.length", |
||||
2 |
||||
); |
||||
|
||||
cy.wait(1000); |
||||
|
||||
verifyExpandFormHeader("Kabul"); |
||||
|
||||
// close expanded forms
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".ant-btn") |
||||
.contains("Cancel") |
||||
.click(); |
||||
|
||||
verifyExpandFormHeader("Afghanistan"); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".ant-btn") |
||||
.contains("Cancel") |
||||
.click(); |
||||
}); |
||||
}); |
||||
|
||||
it("Delete view", () => { |
||||
cy.get(".nc-view-delete-icon").click({ force: true }); |
||||
cy.getActiveModal(".nc-modal-view-delete") |
||||
.find(".ant-btn-dangerous") |
||||
.click(); |
||||
cy.toastWait("View deleted successfully"); |
||||
}); |
||||
}; |
||||
|
||||
// viewTest("grid"); // grid view
|
||||
viewTest("gallery"); // gallery view
|
||||
}); |
||||
}; |
@ -1,541 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
|
||||
// kanban grouping field configuration
|
||||
//
|
||||
function configureGroupingField(field, closeMenu = true) { |
||||
cy.get(".nc-kanban-stacked-by-menu-btn").click(); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-kanban-stacked-by-menu") |
||||
.should("exist") |
||||
.find(".nc-kanban-grouping-field-select") |
||||
.click(); |
||||
cy.get(".ant-select-dropdown:visible") |
||||
.should("exist") |
||||
.find(`.ant-select-item`) |
||||
.contains(new RegExp("^" + field + "$", "g")) |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
if (closeMenu) { |
||||
cy.get(".nc-kanban-stacked-by-menu-btn").click(); |
||||
} |
||||
|
||||
cy.get(".nc-kanban-stacked-by-menu-btn") |
||||
.contains(`Stacked By ${field}`) |
||||
.should("exist"); |
||||
} |
||||
|
||||
// number of kanban stacks altogether
|
||||
//
|
||||
function verifyKanbanStackCount(count) { |
||||
cy.get(".nc-kanban-stack").should("have.length", count); |
||||
} |
||||
|
||||
// order of kanban stacks
|
||||
//
|
||||
function verifyKanbanStackOrder(order) { |
||||
cy.get(".nc-kanban-stack").each(($el, index) => { |
||||
cy.wrap($el).should("contain", order[index]); |
||||
}); |
||||
} |
||||
|
||||
// kanban stack footer numbers
|
||||
//
|
||||
function verifyKanbanStackFooterCount(count) { |
||||
cy.get(".nc-kanban-stack").each(($el, index) => { |
||||
cy.wrap($el) |
||||
.scrollIntoView() |
||||
.find(".nc-kanban-data-count") |
||||
.should( |
||||
"contain", |
||||
`${count[index]} record${count[index] !== 1 ? "s" : ""}` |
||||
); |
||||
}); |
||||
} |
||||
|
||||
// kanban card count in a stack
|
||||
//
|
||||
function verifyKanbanStackCardCount(count) { |
||||
cy.get(".nc-kanban-stack").each(($el, index) => { |
||||
if (count[index] > 0) { |
||||
cy.wrap($el) |
||||
.find(".nc-kanban-item") |
||||
.should("exist") |
||||
.should("have.length", count[index]); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
// order of cards within a stack
|
||||
//
|
||||
function verifyKanbanStackCardOrder(order, stackIndex, cardIndex) { |
||||
cy.get(".nc-kanban-stack") |
||||
.eq(stackIndex) |
||||
.find(".nc-kanban-item") |
||||
.eq(cardIndex) |
||||
.should("contain", order); |
||||
} |
||||
|
||||
// drag drop kanban card
|
||||
//
|
||||
function dragAndDropKanbanCard(srcCard, dstCard) { |
||||
cy.get(`.nc-kanban-item .ant-card :visible:contains("${srcCard}")`).drag( |
||||
`.nc-kanban-item :visible:contains("${dstCard}")` |
||||
); |
||||
} |
||||
|
||||
// drag drop kanban stack
|
||||
//
|
||||
function dragAndDropKanbanStack(srcStack, dstStack) { |
||||
cy.get(`.nc-kanban-stack-head :contains("${srcStack}")`).drag( |
||||
`.nc-kanban-stack-head :contains("${dstStack}")` |
||||
); |
||||
} |
||||
|
||||
let localDebug = false; |
||||
|
||||
function addOption(index, value) { |
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find(".ant-btn-dashed") |
||||
.should("exist") |
||||
.click(); |
||||
cy.get(".nc-dropdown-edit-column .nc-select-option").should( |
||||
"have.length", |
||||
index |
||||
); |
||||
cy.get(".nc-dropdown-edit-column .nc-select-option") |
||||
.last() |
||||
.find("input") |
||||
.click() |
||||
.type(value); |
||||
} |
||||
|
||||
function editColumn() { |
||||
cy.get(`[data-title="Rating"]`).first().scrollIntoView(); |
||||
|
||||
cy.get(`th:contains("Rating") .nc-icon.ant-dropdown-trigger`) |
||||
.trigger("mouseover", { force: true }) |
||||
.click({ force: true }); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-column-operations") |
||||
.find(".nc-column-edit") |
||||
.click(); |
||||
|
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
// change column type and verify
|
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find(".nc-column-type-input") |
||||
.last() |
||||
.click() |
||||
.type("SingleSelect"); |
||||
cy.getActiveSelection(".nc-dropdown-column-type") |
||||
.find(".ant-select-item-option") |
||||
.contains("SingleSelect") |
||||
.click(); |
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
addOption(1, "G"); |
||||
addOption(2, "PG"); |
||||
addOption(3, "PG-13"); |
||||
addOption(4, "R"); |
||||
addOption(5, "NC-17"); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-edit-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
|
||||
cy.toastWait("Column updated"); |
||||
} |
||||
|
||||
// test suite
|
||||
//
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
let clear; |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Kanban`, () => { |
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
if (dbType === "postgres" || dbType === "xcdb") { |
||||
cy.openTableTab("Film", 25); |
||||
|
||||
if (dbType === "postgres") { |
||||
// delete SQL views
|
||||
cy.deleteTable("NicerButSlowerFilmList"); |
||||
cy.deleteTable("FilmList"); |
||||
} |
||||
|
||||
// edit `rating` column: from custom DB type to single select
|
||||
editColumn(); |
||||
cy.closeTableTab("Film"); |
||||
} |
||||
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
}); |
||||
|
||||
// beforeEach(() => {
|
||||
// cy.restoreLocalStorage();
|
||||
// });
|
||||
//
|
||||
// afterEach(() => {
|
||||
// cy.saveLocalStorage();
|
||||
// });
|
||||
|
||||
after(() => { |
||||
Cypress.LocalStorage.clear = clear; |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
/** |
||||
class name specific to kanban view |
||||
.nc-kanban-stacked-by-menu-btn |
||||
.nc-dropdown-kanban-stacked-by-menu |
||||
.nc-kanban-add-edit-stack-menu-btn |
||||
.nc-dropdown-kanban-add-edit-stack-menu |
||||
.nc-kanban-grouping-field-select |
||||
.nc-dropdown-kanban-stack-context-menu |
||||
**/ |
||||
|
||||
it("Create Kanban view", () => { |
||||
if (localDebug === false) { |
||||
cy.openTableTab("Film", 25); |
||||
cy.viewCreate("kanban"); |
||||
} |
||||
}); |
||||
|
||||
it("Rename Kanban view", () => { |
||||
cy.viewRename("kanban", 0, "Film Kanban"); |
||||
}); |
||||
|
||||
it("Configure grouping field", () => { |
||||
configureGroupingField("Rating", true); |
||||
}); |
||||
|
||||
it("Verify kanban stacks", () => { |
||||
verifyKanbanStackCount(6); |
||||
verifyKanbanStackOrder([ |
||||
"uncategorized", |
||||
"G", |
||||
"PG", |
||||
"PG-13", |
||||
"R", |
||||
"NC-17", |
||||
]); |
||||
verifyKanbanStackFooterCount([0, 178, 194, 223, 195, 210]); |
||||
verifyKanbanStackCardCount([0, 25, 25, 25, 25, 25]); |
||||
}); |
||||
|
||||
it("Hide fields", () => { |
||||
mainPage.hideAllColumns(); |
||||
mainPage.unhideField("Title", "kanban"); |
||||
|
||||
verifyKanbanStackCardCount([0, 25, 25, 25, 25, 25]); |
||||
}); |
||||
|
||||
it("Verify card order", () => { |
||||
// verify 3 cards from each stack
|
||||
verifyKanbanStackCardOrder("ACE GOLDFINGER", 1, 0); |
||||
verifyKanbanStackCardOrder("AFFAIR PREJUDICE", 1, 1); |
||||
verifyKanbanStackCardOrder("AFRICAN EGG", 1, 2); |
||||
|
||||
verifyKanbanStackCardOrder("ACADEMY DINOSAUR", 2, 0); |
||||
verifyKanbanStackCardOrder("AGENT TRUMAN", 2, 1); |
||||
verifyKanbanStackCardOrder("ALASKA PHANTOM", 2, 2); |
||||
|
||||
verifyKanbanStackCardOrder("AIRPLANE SIERRA", 3, 0); |
||||
verifyKanbanStackCardOrder("ALABAMA DEVIL", 3, 1); |
||||
verifyKanbanStackCardOrder("ALTER VICTORY", 3, 2); |
||||
|
||||
verifyKanbanStackCardOrder("AIRPORT POLLOCK", 4, 0); |
||||
verifyKanbanStackCardOrder("ALONE TRIP", 4, 1); |
||||
verifyKanbanStackCardOrder("AMELIE HELLFIGHTERS", 4, 2); |
||||
|
||||
verifyKanbanStackCardOrder("ADAPTATION HOLES", 5, 0); |
||||
verifyKanbanStackCardOrder("ALADDIN CALENDAR", 5, 1); |
||||
verifyKanbanStackCardOrder("ALICE FANTASIA", 5, 2); |
||||
}); |
||||
|
||||
it.skip("Verify inter-stack drag and drop", () => { |
||||
dragAndDropKanbanCard("ACE GOLDFINGER", "ACADEMY DINOSAUR"); |
||||
verifyKanbanStackCardOrder("AFFAIR PREJUDICE", 1, 0); |
||||
verifyKanbanStackCardOrder("ACE GOLDFINGER", 2, 0); |
||||
verifyKanbanStackCardOrder("ACADEMY DINOSAUR", 2, 1); |
||||
|
||||
dragAndDropKanbanCard("ACE GOLDFINGER", "AFFAIR PREJUDICE"); |
||||
verifyKanbanStackCardOrder("ACE GOLDFINGER", 1, 0); |
||||
verifyKanbanStackCardOrder("AFFAIR PREJUDICE", 1, 1); |
||||
verifyKanbanStackCardOrder("ACADEMY DINOSAUR", 2, 0); |
||||
}); |
||||
|
||||
it.skip("Verify intra-stack drag and drop", () => { |
||||
dragAndDropKanbanCard("ACE GOLDFINGER", "AFFAIR PREJUDICE"); |
||||
verifyKanbanStackCardOrder("AFFAIR PREJUDICE", 1, 0); |
||||
verifyKanbanStackCardOrder("ACE GOLDFINGER", 1, 1); |
||||
|
||||
dragAndDropKanbanCard("ACE GOLDFINGER", "AFFAIR PREJUDICE"); |
||||
verifyKanbanStackCardOrder("ACE GOLDFINGER", 1, 0); |
||||
verifyKanbanStackCardOrder("AFFAIR PREJUDICE", 1, 1); |
||||
}); |
||||
|
||||
it("Verify stack drag drop", () => { |
||||
verifyKanbanStackOrder([ |
||||
"uncategorized", |
||||
"G", |
||||
"PG", |
||||
"PG-13", |
||||
"R", |
||||
"NC-17", |
||||
]); |
||||
dragAndDropKanbanStack("PG-13", "R"); |
||||
verifyKanbanStackOrder([ |
||||
"uncategorized", |
||||
"G", |
||||
"PG", |
||||
"R", |
||||
"PG-13", |
||||
"NC-17", |
||||
]); |
||||
dragAndDropKanbanStack("PG-13", "R"); |
||||
verifyKanbanStackOrder([ |
||||
"uncategorized", |
||||
"G", |
||||
"PG", |
||||
"PG-13", |
||||
"R", |
||||
"NC-17", |
||||
]); |
||||
}); |
||||
|
||||
it("Verify Sort", () => { |
||||
mainPage.sortField("Title", "Z → A"); |
||||
verifyKanbanStackCardOrder("YOUNG LANGUAGE", 1, 0); |
||||
verifyKanbanStackCardOrder("WEST LION", 1, 1); |
||||
verifyKanbanStackCardOrder("WORST BANGER", 2, 0); |
||||
verifyKanbanStackCardOrder("WORDS HUNTER", 2, 1); |
||||
|
||||
mainPage.clearSort(); |
||||
verifyKanbanStackCardOrder("ACE GOLDFINGER", 1, 0); |
||||
verifyKanbanStackCardOrder("AFFAIR PREJUDICE", 1, 1); |
||||
verifyKanbanStackCardOrder("ACADEMY DINOSAUR", 2, 0); |
||||
verifyKanbanStackCardOrder("AGENT TRUMAN", 2, 1); |
||||
}); |
||||
|
||||
it("Verify Filter", () => { |
||||
mainPage.filterField("Title", "is like", "BA"); |
||||
verifyKanbanStackCardOrder("BAKED CLEOPATRA", 1, 0); |
||||
verifyKanbanStackCardOrder("BALLROOM MOCKINGBIRD", 1, 1); |
||||
verifyKanbanStackCardOrder("ARIZONA BANG", 2, 0); |
||||
verifyKanbanStackCardOrder("EGYPT TENENBAUMS", 2, 1); |
||||
|
||||
mainPage.filterReset(); |
||||
verifyKanbanStackCardOrder("ACE GOLDFINGER", 1, 0); |
||||
verifyKanbanStackCardOrder("AFFAIR PREJUDICE", 1, 1); |
||||
verifyKanbanStackCardOrder("ACADEMY DINOSAUR", 2, 0); |
||||
verifyKanbanStackCardOrder("AGENT TRUMAN", 2, 1); |
||||
}); |
||||
|
||||
// it("Stack context menu- rename stack", () => {
|
||||
// verifyKanbanStackCount(6);
|
||||
// cy.get('.nc-kanban-stack-head').eq(1).find('.ant-dropdown-trigger').click();
|
||||
// cy.getActiveMenu('.nc-dropdown-kanban-stack-context-menu').should('be.visible');
|
||||
// cy.getActiveMenu('.nc-dropdown-kanban-stack-context-menu')
|
||||
// .find('.ant-dropdown-menu-item')
|
||||
// .contains('Rename Stack')
|
||||
// .click();
|
||||
// })
|
||||
|
||||
it("Stack context menu- delete stack", () => {}); |
||||
|
||||
it("Stack context menu- collapse stack", () => {}); |
||||
|
||||
it("Copy view", () => { |
||||
mainPage.sortField("Title", "Z → A"); |
||||
mainPage.filterField("Title", "is like", "BA"); |
||||
|
||||
cy.viewCopy(1); |
||||
|
||||
// verify copied view
|
||||
cy.get(".nc-kanban-stacked-by-menu-btn") |
||||
.contains(`Stacked By Rating`) |
||||
.should("exist"); |
||||
verifyKanbanStackCount(6); |
||||
verifyKanbanStackOrder([ |
||||
"uncategorized", |
||||
"G", |
||||
"PG", |
||||
"PG-13", |
||||
"R", |
||||
"NC-17", |
||||
]); |
||||
verifyKanbanStackFooterCount([0, 4, 5, 8, 6, 6]); |
||||
verifyKanbanStackCardOrder("BAREFOOT MANCHURIAN", 1, 0); |
||||
verifyKanbanStackCardOrder("WORST BANGER", 2, 0); |
||||
|
||||
cy.viewDelete(1); |
||||
}); |
||||
|
||||
it("Add stack", () => { |
||||
cy.viewOpen("kanban", 0); |
||||
cy.get(".nc-kanban-add-edit-stack-menu-btn").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-kanban-add-edit-stack-menu").should( |
||||
"be.visible" |
||||
); |
||||
cy.getActiveMenu(".nc-dropdown-kanban-add-edit-stack-menu") |
||||
.find(".ant-btn-dashed") |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-kanban-add-edit-stack-menu") |
||||
.find(".nc-select-option") |
||||
.last() |
||||
.click() |
||||
.type("Test{enter}"); |
||||
verifyKanbanStackCount(7); |
||||
verifyKanbanStackOrder([ |
||||
"uncategorized", |
||||
"G", |
||||
"PG", |
||||
"PG-13", |
||||
"R", |
||||
"NC-17", |
||||
"Test", |
||||
]); |
||||
}); |
||||
|
||||
it("Collapse stack", () => { |
||||
cy.get(".nc-kanban-stack-head").last().scrollIntoView(); |
||||
cy.get(".nc-kanban-stack-head").last().click(); |
||||
cy.getActiveMenu(".nc-dropdown-kanban-stack-context-menu").should( |
||||
"be.visible" |
||||
); |
||||
|
||||
// collapse stack
|
||||
cy.getActiveMenu(".nc-dropdown-kanban-stack-context-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Collapse Stack") |
||||
.click(); |
||||
cy.get(".nc-kanban-collapsed-stack") |
||||
.should("exist") |
||||
.should("have.length", 1); |
||||
|
||||
// expand back
|
||||
cy.get(".nc-kanban-collapsed-stack").click(); |
||||
cy.get(".nc-kanban-collapsed-stack").should("not.exist"); |
||||
}); |
||||
|
||||
it("Add record to stack", () => { |
||||
mainPage.hideAllColumns(); |
||||
mainPage.toggleShowSystemFields(); |
||||
mainPage.unhideField("LanguageId", "kanban"); |
||||
mainPage.unhideField("Title", "kanban"); |
||||
|
||||
mainPage.filterReset(); |
||||
mainPage.clearSort(); |
||||
|
||||
// skip for xcdb: many mandatory fields
|
||||
if (!isXcdb()) { |
||||
cy.get(".nc-kanban-stack-head").last().scrollIntoView(); |
||||
cy.get(".nc-kanban-stack-head").last().click(); |
||||
cy.getActiveMenu(".nc-dropdown-kanban-stack-context-menu").should( |
||||
"be.visible" |
||||
); |
||||
|
||||
// add record
|
||||
cy.getActiveMenu(".nc-dropdown-kanban-stack-context-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Add new record") |
||||
.click(); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form").should("be.visible"); |
||||
cy.get(".nc-expand-col-Title") |
||||
.find(".nc-cell > input") |
||||
.should("exist") |
||||
.first() |
||||
.clear() |
||||
.type("New record"); |
||||
cy.get(".nc-expand-col-LanguageId") |
||||
.find(".nc-cell > input") |
||||
.should("exist") |
||||
.first() |
||||
.clear() |
||||
.type("1"); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.click(); |
||||
cy.toastWait("updated successfully"); |
||||
cy.get("body").type("{esc}"); |
||||
|
||||
// verify if the new record is in the stack
|
||||
verifyKanbanStackCount(7); |
||||
verifyKanbanStackOrder([ |
||||
"uncategorized", |
||||
"G", |
||||
"PG", |
||||
"PG-13", |
||||
"R", |
||||
"NC-17", |
||||
"Test", |
||||
]); |
||||
verifyKanbanStackCardCount([0, 25, 25, 25, 25, 25, 1]); |
||||
} |
||||
|
||||
mainPage.toggleShowSystemFields(); |
||||
}); |
||||
|
||||
it("Expand record", () => { |
||||
// mainPage.toggleShowSystemFields();
|
||||
// mainPage.showAllColumns();
|
||||
|
||||
cy.get(".nc-kanban-stack").eq(1).find(".nc-kanban-item").eq(0).click(); |
||||
cy.get(".nc-expand-col-Title") |
||||
.find(".nc-cell > input") |
||||
.then(($el) => { |
||||
expect($el[0].value).to.have.string("ACE GOLDFINGER"); |
||||
}); |
||||
cy.get("body").type("{esc}"); |
||||
}); |
||||
|
||||
it("Stack context menu- delete stack", () => { |
||||
if (!isXcdb()) { |
||||
cy.get(".nc-kanban-stack-head").last().scrollIntoView(); |
||||
cy.get(".nc-kanban-stack-head").last().click(); |
||||
cy.getActiveMenu(".nc-dropdown-kanban-stack-context-menu").should( |
||||
"be.visible" |
||||
); |
||||
cy.getActiveMenu(".nc-dropdown-kanban-stack-context-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Delete Stack") |
||||
.click(); |
||||
cy.getActiveModal(".nc-modal-kanban-delete-stack").should("be.visible"); |
||||
cy.getActiveModal(".nc-modal-kanban-delete-stack") |
||||
.find(".ant-btn-primary") |
||||
.click(); |
||||
verifyKanbanStackCount(6); |
||||
verifyKanbanStackOrder([ |
||||
"uncategorized", |
||||
"G", |
||||
"PG", |
||||
"PG-13", |
||||
"R", |
||||
"NC-17", |
||||
]); |
||||
verifyKanbanStackCardCount([1, 25, 25, 25, 25, 25]); |
||||
} |
||||
}); |
||||
|
||||
it("Delete Kanban view", () => { |
||||
cy.viewDelete(0); |
||||
cy.closeTableTab("Film"); |
||||
}); |
||||
}); |
||||
}; |
@ -1,191 +0,0 @@
|
||||
// test suite
|
||||
//
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
|
||||
let linkText = ""; |
||||
const generateShareLink_surveyMode = () => { |
||||
mainPage.shareView().click(); |
||||
|
||||
// ensure modal is rendered and visible
|
||||
cy.getActiveModal(".nc-modal-share-view") |
||||
.find(".ant-modal-title") |
||||
.contains("This view is shared via a private link") |
||||
.should("be.visible"); |
||||
|
||||
// enable survey mode
|
||||
cy.get('[data-cy="nc-modal-share-view__survey-mode"]').click(); |
||||
|
||||
// copy link text, save URL
|
||||
cy.get('[data-cy="nc-modal-share-view__link"]').then(($el) => { |
||||
linkText = $el.text(); |
||||
cy.log(linkText); |
||||
}); |
||||
}; |
||||
|
||||
// Options:
|
||||
// footer
|
||||
// btnSubmit
|
||||
// fieldLabel
|
||||
//
|
||||
function validateFormPage(options) { |
||||
// header & description
|
||||
cy.get('[data-cy="nc-survey-form__heading"]') |
||||
.contains("A B C D") |
||||
.should("be.visible"); |
||||
cy.get('[data-cy="nc-survey-form__sub-heading"]') |
||||
.contains("Survey form for testing") |
||||
.should("be.visible"); |
||||
|
||||
// footer (page index)
|
||||
cy.get('[data-cy="nc-survey-form__footer"]') |
||||
.contains(options.footer) |
||||
.should("be.visible"); |
||||
|
||||
// submit button: will be either OK or Submit
|
||||
cy.get(`[data-cy="nc-survey-form__${options.btnSubmit}"]`).should( |
||||
"be.visible" |
||||
); |
||||
|
||||
// field label
|
||||
cy.get( |
||||
`[data-cy="nc-survey-form__input-${options.fieldLabel.replaceAll( |
||||
" ", |
||||
"" |
||||
)}"]` |
||||
).should("be.visible"); |
||||
} |
||||
|
||||
// test suite
|
||||
//
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
let clear; |
||||
|
||||
/** |
||||
* class names specific to survey mode |
||||
* data-cy="nc-survey-form__heading" |
||||
* data-cy="nc-survey-form__sub-heading" |
||||
* data-cy="nc-survey-form__input-${fieldTitle}" |
||||
* data-cy="nc-survey-form__field-description" |
||||
* data-cy="nc-survey-form__btn-submit" |
||||
* data-cy="nc-survey-form__btn-next" |
||||
* data-cy="nc-survey-form__success-msg" |
||||
* data-cy="nc-survey-form__btn-submit-another-form" |
||||
* data-cy="nc-survey-form__footer" |
||||
* data-cy="nc-survey-form__icon-next" |
||||
* data-cy="nc-survey-form__icon-prev" |
||||
*/ |
||||
|
||||
describe(`${apiType.toUpperCase()} api - Kanban`, () => { |
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
// disable CY storage handling
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
}); |
||||
|
||||
after(() => { |
||||
// re-enable CY storage handling
|
||||
Cypress.LocalStorage.clear = clear; |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it("Create form view", () => { |
||||
cy.openTableTab("Country", 25); |
||||
cy.viewCreate("form"); |
||||
|
||||
// prepare form
|
||||
// wait for input fields to be rendered as enabled
|
||||
cy.wait(2000); |
||||
|
||||
// Update header & add some description
|
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Form Title"]') |
||||
.clear() |
||||
.type("A B C D"); |
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Add form description"]') |
||||
.type("Survey form for testing"); |
||||
cy.get(".nc-form").click(); |
||||
|
||||
// add success message
|
||||
cy.get("textarea.nc-form-after-submit-msg").type("Congratulations!"); |
||||
|
||||
// enable "Submit another form" check box
|
||||
cy.get("button.nc-form-checkbox-submit-another-form").click(); |
||||
|
||||
// show another form after 5 seconds
|
||||
cy.get("button.nc-form-checkbox-show-blank-form").click(); |
||||
}); |
||||
|
||||
it("Share form, enable survey mode", () => { |
||||
generateShareLink_surveyMode(); |
||||
cy.signOut(); |
||||
}); |
||||
|
||||
it("Visit link, validate form", () => { |
||||
cy.visit(linkText); |
||||
|
||||
// validate form
|
||||
validateFormPage({ |
||||
footer: "1 / 3", |
||||
btnSubmit: "btn-next", |
||||
fieldLabel: "Country", |
||||
}); |
||||
cy.get('[data-cy="nc-survey-form__input-Country"]').type("x{enter}"); |
||||
|
||||
validateFormPage({ |
||||
footer: "2 / 3", |
||||
btnSubmit: "btn-next", |
||||
fieldLabel: "LastUpdate", |
||||
}); |
||||
cy.get('[data-cy="nc-survey-form__input-LastUpdate"]').click(); |
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click(); |
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click(); |
||||
cy.get('[data-cy="nc-survey-form__btn-next"]').click(); |
||||
|
||||
// takes time for the link field to be rendered
|
||||
cy.wait(2000); |
||||
|
||||
validateFormPage({ |
||||
footer: "3 / 3", |
||||
btnSubmit: "btn-submit", |
||||
fieldLabel: "City List", |
||||
}); |
||||
cy.get('[data-cy="nc-survey-form__btn-submit"]').click(); |
||||
|
||||
// validate success message
|
||||
cy.get('[data-cy="nc-survey-form__success-msg"]') |
||||
.should("be.visible") |
||||
.contains("Congratulations!") |
||||
.should("be.visible"); |
||||
|
||||
// validate "Submit another form" button
|
||||
cy.get('[data-cy="nc-survey-form__btn-submit-another-form"]').should( |
||||
"be.visible" |
||||
); |
||||
}); |
||||
|
||||
it("Delete form view", () => { |
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
// clean up newly added rows into Country table operations
|
||||
// this auto verifies successfull addition of rows to table as well
|
||||
mainPage.getPagination(5).click(); |
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10); |
||||
|
||||
mainPage.getCell("Country", 10).rightclick(); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Delete Row") |
||||
.click(); |
||||
|
||||
cy.viewDelete(0); |
||||
}); |
||||
}); |
||||
}; |
@ -1,285 +0,0 @@
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation"; |
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage"; |
||||
import { |
||||
isPostgres, |
||||
isXcdb, |
||||
roles, |
||||
staticProjects, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { |
||||
_advSettings, |
||||
_editSchema, |
||||
_editData, |
||||
_editComment, |
||||
_viewMenu, |
||||
_topRightMenu, |
||||
disableTableAccess, |
||||
_accessControl, |
||||
} from "../spec/roleValidation.spec"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe("Static user creations (different roles)", () => { |
||||
before(() => { |
||||
// standalone test
|
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.restoreLocalStorage(); |
||||
settingsPage.openMenu(settingsPage.TEAM_N_AUTH); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.signOut(); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
const addUser = (user) => { |
||||
it(`RoleType: ${user.name}`, () => { |
||||
// for first project, users need to be added explicitly using "New User" button
|
||||
// for subsequent projects, they will be required to just add to this project
|
||||
// using ROW count to identify if its former or latter scenario
|
||||
// 5 users (owner, creator, editor, viewer, commenter) = 5
|
||||
// cy.get(`.nc-user-row`).then((obj) => {
|
||||
// cy.log(obj.length);
|
||||
// if (obj.length == 5) {
|
||||
// mainPage.addExistingUserToProject(
|
||||
// user.credentials.username,
|
||||
// user.name
|
||||
// );
|
||||
// } else {
|
||||
// mainPage.addNewUserToProject(
|
||||
// user.credentials,
|
||||
// user.name
|
||||
// );
|
||||
// }
|
||||
// });
|
||||
|
||||
cy.get(`.nc-user-row`).should("exist"); |
||||
mainPage.addNewUserToProject(user.credentials, user.name); |
||||
}); |
||||
}; |
||||
|
||||
addUser(roles.creator); |
||||
addUser(roles.editor); |
||||
addUser(roles.commenter); |
||||
addUser(roles.viewer); |
||||
|
||||
// Access control list- configuration
|
||||
//
|
||||
it(`Access control list- configuration`, () => { |
||||
mainPage.closeMetaTab(); |
||||
|
||||
// open Project metadata tab
|
||||
//
|
||||
settingsPage.openMenu(settingsPage.PROJ_METADATA); |
||||
settingsPage.openTab(settingsPage.UI_ACCESS_CONTROL); |
||||
|
||||
// validate if it has 19 entries representing tables & views
|
||||
if (isPostgres()) cy.get(".nc-acl-table-row").should("have.length", 24); |
||||
else if (isXcdb()) cy.get(".nc-acl-table-row").should("have.length", 19); |
||||
else cy.get(".nc-acl-table-row").should("have.length", 19); |
||||
|
||||
// disable table & view access
|
||||
//
|
||||
disableTableAccess("Language", "editor"); |
||||
disableTableAccess("Language", "commenter"); |
||||
disableTableAccess("Language", "viewer"); |
||||
|
||||
disableTableAccess("CustomerList", "editor"); |
||||
disableTableAccess("CustomerList", "commenter"); |
||||
disableTableAccess("CustomerList", "viewer"); |
||||
|
||||
cy.get("button.nc-acl-save").click(); |
||||
cy.toastWait("Updated UI ACL for tables successfully"); |
||||
|
||||
mainPage.closeMetaTab(); |
||||
}); |
||||
}); |
||||
|
||||
const roleValidation = (roleType) => { |
||||
let clear; |
||||
|
||||
describe(`User role validation`, () => { |
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.visit(mainPage.roleURL[roleType]); |
||||
|
||||
cy.get('button:contains("SIGN UP"):visible').should("exist"); |
||||
cy.get('input[type="text"]', { timeout: 20000 }).type( |
||||
roles[roleType].credentials.username |
||||
); |
||||
cy.get('input[type="password"]').type( |
||||
roles[roleType].credentials.password |
||||
); |
||||
cy.get('button:contains("SIGN UP")').click(); |
||||
cy.get(`.nc-project-page-title:contains("My Projects"):visible`).should( |
||||
"exist" |
||||
); |
||||
|
||||
if (dbType === "xcdb") { |
||||
if ("rest" == apiType) |
||||
projectsPage.openProject(staticProjects.sampleREST.basic.name); |
||||
else projectsPage.openProject(staticProjects.sampleGQL.basic.name); |
||||
} else if (dbType === "mysql") { |
||||
if ("rest" == apiType) |
||||
projectsPage.openProject(staticProjects.externalREST.basic.name); |
||||
else projectsPage.openProject(staticProjects.externalGQL.basic.name); |
||||
} else if (dbType === "postgres") { |
||||
if ("rest" == apiType) |
||||
projectsPage.openProject(staticProjects.pgExternalREST.basic.name); |
||||
else |
||||
projectsPage.openProject(staticProjects.pgExternalGQL.basic.name); |
||||
} |
||||
|
||||
if (roleType === "creator") { |
||||
cy.closeTableTab(); |
||||
} |
||||
|
||||
cy.saveLocalStorage(); |
||||
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.signOut(); |
||||
cy.saveLocalStorage(); |
||||
|
||||
Cypress.LocalStorage.clear = clear; |
||||
}); |
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// Test suite
|
||||
|
||||
it(`[${roles[roleType].name}] Left navigation menu, New User add`, () => { |
||||
// project configuration settings
|
||||
//
|
||||
if (roleType !== "owner") { |
||||
_advSettings(roleType, "userRole"); |
||||
} |
||||
}); |
||||
|
||||
it(`[${roles[roleType].name}] Access control`, () => { |
||||
// Access control validation
|
||||
//
|
||||
if (roleType !== "owner") { |
||||
_accessControl(roleType, "userRole"); |
||||
} |
||||
}); |
||||
|
||||
it(`[${roles[roleType].name}] Schema: create table, add/modify/delete column`, () => { |
||||
// Schema related validations
|
||||
// - Add/delete table
|
||||
// - Add/Update/delete column
|
||||
//
|
||||
if (roleType !== "owner") { |
||||
_editSchema(roleType, "userRole"); |
||||
} |
||||
}); |
||||
|
||||
it(`[${roles[roleType].name}] Data: add/modify/delete row, update cell contents`, () => { |
||||
// Table data related validations
|
||||
// - Add/delete/modify row
|
||||
//
|
||||
if (roleType !== "owner") { |
||||
_editData(roleType, "userRole"); |
||||
} |
||||
}); |
||||
|
||||
it(`[${roles[roleType].name}] Comments: view/add`, () => { |
||||
// read &/ update comment
|
||||
// Viewer: only allowed to read
|
||||
// Everyone else: read &/ update
|
||||
//
|
||||
if (roleType !== "owner") { |
||||
_editComment(roleType, "userRole"); |
||||
} |
||||
}); |
||||
|
||||
it(`[${roles[roleType].name}] Right navigation menu, share view`, () => { |
||||
// right navigation menu bar
|
||||
// Editor/Viewer/Commenter : can only view 'existing' views
|
||||
// Rest: can create/edit
|
||||
if (roleType !== "owner") { |
||||
_viewMenu(roleType, "userRole"); |
||||
} |
||||
}); |
||||
|
||||
it(`[${roles[roleType].name}] Download files`, () => { |
||||
// to be fixed
|
||||
if ( |
||||
roleType === "commenter" || |
||||
roleType === "viewer" || |
||||
roleType === "owner" |
||||
) { |
||||
} else { |
||||
// viewer & commenter doesn't contain hideField option in ncv2
|
||||
// #ID, City, LastUpdate, City => Address, Country <= City, +
|
||||
mainPage.hideField("LastUpdate"); |
||||
|
||||
const verifyCsv = (retrievedRecords) => { |
||||
// expected output, statically configured
|
||||
let storedRecords = [ |
||||
`City,Address List,Country`, |
||||
`A Corua (La Corua),939 Probolinggo Loop,Spain`, |
||||
`Abha,733 Mandaluyong Place,Saudi Arabia`, |
||||
`Abu Dhabi,535 Ahmadnagar Manor,United Arab Emirates`, |
||||
`Acua,1789 Saint-Denis Parkway,Mexico`, |
||||
]; |
||||
|
||||
// skip if xcdb
|
||||
if (!isXcdb()) { |
||||
for (let i = 0; i < storedRecords.length; i++) { |
||||
// cy.log(retrievedRecords[i])
|
||||
expect(retrievedRecords[i]).to.be.equal(storedRecords[i]); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
// download & verify
|
||||
mainPage.downloadAndVerifyCsv( |
||||
`City_exported_1.csv`, |
||||
verifyCsv, |
||||
roleType |
||||
); |
||||
mainPage.unhideField("LastUpdate"); |
||||
} |
||||
}); |
||||
|
||||
it(`[${roles[roleType].name}] App store accessibility`, () => { |
||||
cy.visit("/#/apps").then((r) => { |
||||
cy.toastWait("You don't have enough permission to access the page."); |
||||
}); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
// skip owner validation as rest of the cases pretty much cover the same
|
||||
// roleValidation("owner");
|
||||
roleValidation("creator"); |
||||
roleValidation("editor"); |
||||
roleValidation("commenter"); |
||||
roleValidation("viewer"); |
||||
}; |
@ -1,172 +0,0 @@
|
||||
// pre-requisite:
|
||||
// user@nocodb.com signed up as admin
|
||||
// sakilaDb database created already
|
||||
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation"; |
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage"; |
||||
import { |
||||
isPostgres, |
||||
isTestSuiteActive, |
||||
isXcdb, |
||||
roles, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
import { |
||||
_advSettings, |
||||
_editSchema, |
||||
_editData, |
||||
_editComment, |
||||
_viewMenu, |
||||
_topRightMenu, |
||||
enableTableAccess, |
||||
_accessControl, |
||||
disableTableAccess, |
||||
} from "../spec/roleValidation.spec"; |
||||
|
||||
export const genTest = (apiType, dbType, roleType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
//// Test Suite
|
||||
|
||||
let clear; |
||||
|
||||
function configureAcl() { |
||||
// open Project metadata tab
|
||||
//
|
||||
settingsPage.openMenu(settingsPage.PROJ_METADATA); |
||||
settingsPage.openTab(settingsPage.UI_ACCESS_CONTROL); |
||||
|
||||
// validate if it has 19 entries representing tables & views
|
||||
if (isPostgres()) cy.get(".nc-acl-table-row").should("have.length", 24); |
||||
else if (isXcdb()) cy.get(".nc-acl-table-row").should("have.length", 19); |
||||
else cy.get(".nc-acl-table-row").should("have.length", 19); |
||||
|
||||
// disable table & view access
|
||||
//
|
||||
disableTableAccess("Language", "editor"); |
||||
disableTableAccess("Language", "commenter"); |
||||
disableTableAccess("Language", "viewer"); |
||||
|
||||
disableTableAccess("CustomerList", "editor"); |
||||
disableTableAccess("CustomerList", "commenter"); |
||||
disableTableAccess("CustomerList", "viewer"); |
||||
|
||||
cy.get("button.nc-acl-save").click(); |
||||
cy.toastWait("Updated UI ACL for tables successfully"); |
||||
|
||||
mainPage.closeMetaTab(); |
||||
} |
||||
|
||||
describe("Role preview validations", () => { |
||||
// Sign in/ open project
|
||||
before(() => { |
||||
// cy.restoreLocalStorage();
|
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
|
||||
// configureAcl();
|
||||
|
||||
cy.openTableTab("City", 25); |
||||
|
||||
settingsPage.openProjectMenu(); |
||||
cy.getActiveMenu(".nc-dropdown-project-menu") |
||||
.find(`[data-submenu-id="preview-as"]`) |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
cy.get(".nc-role-preview-menu").should("have.length", 3); |
||||
cy.get(`.nc-role-preview-menu:contains("Editor")`) |
||||
.should("exist") |
||||
.click(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.get(".nc-preview-btn-exit-to-app").click(); |
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row", { timeout: 25000 }).should("have.length", 25); |
||||
|
||||
cy.closeTableTab("City"); |
||||
|
||||
// open Project metadata tab
|
||||
//
|
||||
settingsPage.openMenu(settingsPage.PROJ_METADATA); |
||||
settingsPage.openTab(settingsPage.UI_ACCESS_CONTROL); |
||||
|
||||
// validate if it has 19 entries representing tables & views
|
||||
if (isPostgres()) cy.get(".nc-acl-table-row").should("have.length", 24); |
||||
else if (isXcdb()) cy.get(".nc-acl-table-row").should("have.length", 19); |
||||
else cy.get(".nc-acl-table-row").should("have.length", 19); |
||||
|
||||
// restore access
|
||||
//
|
||||
enableTableAccess("Language", "editor"); |
||||
enableTableAccess("Language", "commenter"); |
||||
enableTableAccess("Language", "viewer"); |
||||
|
||||
enableTableAccess("CustomerList", "editor"); |
||||
enableTableAccess("CustomerList", "commenter"); |
||||
enableTableAccess("CustomerList", "viewer"); |
||||
cy.saveLocalStorage(); |
||||
Cypress.LocalStorage.clear = clear; |
||||
}); |
||||
|
||||
const genTestSub = (roleType) => { |
||||
it(`Role preview: ${roleType}: Enable preview`, () => { |
||||
cy.get(".nc-floating-preview-btn", { timeout: 30000 }).should("exist"); |
||||
cy.get(".nc-floating-preview-btn") |
||||
.find(`[type="radio"][value="${roleType}"]`) |
||||
.should("exist") |
||||
.click(); |
||||
}); |
||||
|
||||
it(`Role preview: ${roleType}: Advance settings`, () => { |
||||
// project configuration settings
|
||||
//
|
||||
_advSettings(roleType, "preview"); |
||||
}); |
||||
|
||||
it(`Role preview: ${roleType}: Access control`, () => { |
||||
// Access control validation
|
||||
//
|
||||
_accessControl(roleType, "preview"); |
||||
}); |
||||
|
||||
it(`Role preview: ${roleType}: Edit data`, () => { |
||||
// Table data related validations
|
||||
// - Add/delete/modify row
|
||||
//
|
||||
_editData(roleType, "preview"); |
||||
}); |
||||
|
||||
it(`Role preview: ${roleType}: Edit comment`, () => { |
||||
// read &/ update comment
|
||||
// Viewer: not allowed to read
|
||||
// Everyone else: read &/ update
|
||||
//
|
||||
_editComment(roleType, "preview"); |
||||
}); |
||||
|
||||
it(`Role preview: ${roleType}: Preview menu`, () => { |
||||
// right navigation menu bar
|
||||
// Editor/Viewer/Commenter : can only view 'existing' views
|
||||
// Rest: can create/edit
|
||||
_viewMenu(roleType, "preview"); |
||||
}); |
||||
|
||||
it(`Role preview: ${roleType}: Edit Schema`, () => { |
||||
// Schema related validations
|
||||
// - Add/delete table
|
||||
// - Add/Update/delete column
|
||||
//
|
||||
_editSchema(roleType, "preview"); |
||||
}); |
||||
}; |
||||
|
||||
genTestSub("editor"); |
||||
genTestSub("commenter"); |
||||
genTestSub("viewer"); |
||||
}); |
||||
}; |
@ -1,165 +0,0 @@
|
||||
export const genTest = (apiType, dbType) => { |
||||
describe(`${apiType.toUpperCase()} api - Super user test`, () => { |
||||
before(() => { |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
}); |
||||
|
||||
it(`Open App store page and check slack app`, () => { |
||||
cy.visit('/#/apps').then((win) => { |
||||
cy.get('.nc-app-store-title').should('exist'); |
||||
cy.get('.nc-app-store-card-Slack').should('exist'); |
||||
|
||||
// install slack app
|
||||
cy.get('.nc-app-store-card-Slack .install-btn').invoke( |
||||
'attr', |
||||
'style', |
||||
'right: 10px' |
||||
); |
||||
|
||||
cy.get( |
||||
'.nc-app-store-card-Slack .install-btn .nc-app-store-card-install' |
||||
).click(); |
||||
|
||||
cy.getActiveModal('.nc-modal-plugin-install') |
||||
.find('[placeholder="Channel Name"]') |
||||
.type('Test channel'); |
||||
|
||||
cy.getActiveModal('.nc-modal-plugin-install') |
||||
.find('[placeholder="Webhook URL"]') |
||||
.type('http://test.com'); |
||||
|
||||
cy.getActiveModal('.nc-modal-plugin-install') |
||||
.find('button:contains("Save")') |
||||
.click(); |
||||
|
||||
cy.toastWait('Successfully installed'); |
||||
|
||||
cy.get( |
||||
'.nc-app-store-card-Slack .install-btn .nc-app-store-card-install' |
||||
).should('not.exist'); |
||||
|
||||
// update slack app config
|
||||
cy.get('.nc-app-store-card-Slack .install-btn .nc-app-store-card-edit') |
||||
.should('exist') |
||||
.click(); |
||||
cy.getActiveModal('.nc-modal-plugin-install') |
||||
.should('exist') |
||||
.find('[placeholder="Channel Name"]') |
||||
.should('have.value', 'Test channel') |
||||
.clear() |
||||
.type('Test channel 2'); |
||||
|
||||
cy.getActiveModal('.nc-modal-plugin-install') |
||||
.get('button:contains("Save")') |
||||
.click(); |
||||
|
||||
cy.toastWait('Successfully installed'); |
||||
|
||||
// reset slack app
|
||||
cy.get('.nc-app-store-card-Slack .install-btn .nc-app-store-card-reset') |
||||
.should('exist') |
||||
.click(); |
||||
|
||||
cy.getActiveModal('.nc-modal-plugin-uninstall') |
||||
.should('exist') |
||||
.find('button:contains("Confirm")') |
||||
.click(); |
||||
|
||||
cy.toastWait('Plugin uninstalled successfully'); |
||||
}); |
||||
}); |
||||
|
||||
it(`Open super user management page and add/delete user`, () => { |
||||
// delay for avoiding error related to vue router change
|
||||
cy.wait(500); |
||||
|
||||
cy.visit('/#/account/users').then((win) => { |
||||
cy.get('[data-cy="nc-super-user-list"]').should('exist') |
||||
.find('tbody tr').then((rows) => { |
||||
const initialUserCount = rows.length; |
||||
|
||||
cy.get('[data-cy=\'nc-super-user-invite\'') |
||||
.click(); |
||||
|
||||
// additional wait to ensure the modal is fully loaded
|
||||
cy.getActiveModal('.nc-modal-invite-user').should('exist'); |
||||
cy.getActiveModal('.nc-modal-invite-user') |
||||
.find('input[placeholder="E-mail"]') |
||||
.should('exist'); |
||||
|
||||
cy.getActiveModal('.nc-modal-invite-user') |
||||
.find('input[placeholder="E-mail"]') |
||||
.type('test@nocodb.com'); |
||||
cy.getActiveModal('.nc-modal-invite-user') |
||||
.find('.ant-select.nc-user-roles') |
||||
.click(); |
||||
|
||||
cy.getActiveModal('.nc-modal-invite-user') |
||||
.find('button.ant-btn-primary') |
||||
.click(); |
||||
|
||||
cy.toastWait('Successfully added user'); |
||||
|
||||
|
||||
cy.getActiveModal().find('[data-cy="nc-root-user-invite-modal-close"]').click(); |
||||
|
||||
|
||||
cy.get('[data-cy="nc-super-user-list"]').should('exist') |
||||
.find('tbody tr').should('have.length', initialUserCount +1) |
||||
.last().find('[data-cy="nc-super-user-delete"]').click(); |
||||
|
||||
cy.getActiveModal().find('.ant-modal-confirm-btns .ant-btn-primary').click(); |
||||
|
||||
cy.toastWait('User deleted successfully'); |
||||
|
||||
|
||||
cy.get('[data-cy="nc-super-user-list"]').should('exist') |
||||
.find('tbody tr').should('have.length', initialUserCount); |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
it('User management settings', () => { |
||||
|
||||
}); |
||||
|
||||
it(`Token management`, () => { |
||||
// delay for avoiding error related to vue router change
|
||||
cy.wait(500); |
||||
cy.visit('/#/account/tokens').then((win) => { |
||||
|
||||
cy.get('[data-cy="nc-token-list"]').should('exist').find(':contains("No Data")').should('exist'); |
||||
cy.get('[data-cy="nc-token-create"]').click(); |
||||
cy.get('[data-cy="nc-token-modal-description"]').type('Descriptqion'); |
||||
cy.get('[data-cy="nc-token-modal-save"]').click(); |
||||
cy.toastWait('Token generated successfully'); |
||||
|
||||
cy.get('[data-cy="nc-token-list"]').should('exist') |
||||
.find('tbody tr').should('have.length', 1); |
||||
|
||||
cy.get('.nc-token-menu').click(); |
||||
|
||||
cy.getActiveMenu('.nc-dropdown-api-token-mgmt').find('.ant-dropdown-menu-item:contains("Remove")').click(); |
||||
|
||||
|
||||
cy.getActiveModal().find('.ant-modal-confirm-btns .ant-btn-primary').click(); |
||||
|
||||
cy.toastWait('Token deleted successfully'); |
||||
|
||||
}); |
||||
}); |
||||
|
||||
|
||||
}); |
||||
|
||||
}; |
@ -1,76 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { |
||||
isPostgres, |
||||
isTestSuiteActive, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} Upload/ Download CSV`, () => { |
||||
// before(() => {
|
||||
// // standalone test
|
||||
// // loginPage.loginAndOpenProject(apiType, dbType);
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it("Download verification- base view, default columns", () => { |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
mainPage.hideField("LastUpdate"); |
||||
const verifyCsv = (retrievedRecords) => { |
||||
// expected output, statically configured
|
||||
// let storedRecords = [
|
||||
// `Country,CityList`,
|
||||
// `Afghanistan,Kabul`,
|
||||
// `Algeria,"Batna, Bchar, Skikda"`,
|
||||
// `American Samoa,Tafuna`,
|
||||
// `Angola,"Benguela, Namibe"`,
|
||||
// ];
|
||||
let storedRecords = [ |
||||
["Country", "City List"], |
||||
["Afghanistan", "Kabul"], |
||||
["Algeria", "Skikda", "Bchar", "Batna"], |
||||
["American Samoa", "Tafuna"], |
||||
["Angola", "Benguela", "Namibe"], |
||||
]; |
||||
|
||||
// if (isPostgres()) {
|
||||
// // order of second entry is different
|
||||
// storedRecords = [
|
||||
// `Country,City List`,
|
||||
// `Afghanistan,Kabul`,
|
||||
// `Algeria,"Skikda, Bchar, Batna"`,
|
||||
// `American Samoa,Tafuna`,
|
||||
// `Angola,"Benguela, Namibe"`,
|
||||
// ];
|
||||
// }
|
||||
|
||||
for (let i = 0; i < storedRecords.length - 1; i++) { |
||||
for (let j = 0; j < storedRecords[i].length; j++) |
||||
expect(retrievedRecords[i]).to.have.string(storedRecords[i][j]); |
||||
|
||||
// often, the order in which records "Skikda, Bchar, Batna" appear, used to toggle
|
||||
// hence verifying record contents separately
|
||||
// expect(retrievedRecords[i]).to.be.equal(storedRecords[i]);
|
||||
} |
||||
}; |
||||
|
||||
// download & verify
|
||||
mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv); |
||||
mainPage.unhideField("LastUpdate"); |
||||
|
||||
cy.closeTableTab("Country"); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
|
@ -1,236 +0,0 @@
|
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { roles } from "../../support/page_objects/projectConstants"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} : API List - Test preparation`, () => { |
||||
before(() => { |
||||
cy.fileHook(); |
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
}); |
||||
|
||||
it("Open project & record swagger URL, AuthToken", () => { |
||||
let authToken = mainPage.getAuthToken(); |
||||
cy.url().then((url) => { |
||||
// retrieve project name from URL & use it to construct Swagger URL
|
||||
// URL on homepage: http://localhost:3000/#/nc/externalrest_weUO?type=roles&dbalias=&name=Team%20%26%20Auth%20
|
||||
// [REST] Swagger URL: http://localhost:8080/nc/externalrest_weUO/db/swagger
|
||||
// [GQL] http://localhost:8080/nc/externalgql_dgwx/v1/graphql
|
||||
const projectName = url.split("/")[5].split("?")[0]; |
||||
let swaggerURL = ``; |
||||
if ("rest" == apiType) { |
||||
swaggerURL = `http://localhost:8080/nc/${projectName}/db/swagger`; |
||||
} else { |
||||
swaggerURL = `http://localhost:8080/nc/${projectName}/v1/graphql`; |
||||
} |
||||
|
||||
// exchange information between two tests using a file
|
||||
// https://stackoverflow.com/questions/52050657/what-is-the-best-practice-of-pass-states-between-tests-in-cypress
|
||||
//
|
||||
cy.writeFile("shared.json", { |
||||
SWAGGER_URL: swaggerURL, |
||||
AUTH_TOKEN: authToken, |
||||
}); |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
if ("rest" == apiType) { |
||||
describe(`Swagger page, base verification`, () => { |
||||
before(() => { |
||||
cy.fileHook(); |
||||
}); |
||||
|
||||
// returns swagger button intended for
|
||||
//
|
||||
const getSwaggerButton = (tag, idx, desc) => { |
||||
return cy |
||||
.get(`#operations-tag-${tag}`) |
||||
.next() |
||||
.find(".opblock") |
||||
.eq(idx) |
||||
.find(`button:contains(${desc})`); |
||||
}; |
||||
|
||||
let Token; |
||||
|
||||
// basic authentication tag verification
|
||||
//
|
||||
it("Swagger URL access & basic validation", () => { |
||||
// retrieve information stored in previous IT block
|
||||
//
|
||||
cy.readFile("shared.json").then((jsonPayload) => { |
||||
let URL = jsonPayload.SWAGGER_URL; |
||||
Token = jsonPayload.AUTH_TOKEN; |
||||
|
||||
cy.visit(URL, { |
||||
baseUrl: null, |
||||
}).then(() => { |
||||
// wait to allow time for SWAGGER Library loading to finish
|
||||
cy.log(Token); |
||||
|
||||
// cy.snip("Swagger");
|
||||
|
||||
// validate; API order assumed
|
||||
cy.get("#operations-tag-Authentication", { |
||||
timeout: 20000, |
||||
}) |
||||
.should("exist") |
||||
.next() |
||||
.find(".opblock") |
||||
.should("has.length", 9); |
||||
getSwaggerButton("Authentication", 0, "User login").should("exist"); |
||||
getSwaggerButton("Authentication", 1, "User signup").should( |
||||
"exist" |
||||
); |
||||
getSwaggerButton("Authentication", 2, "Password Forgot").should( |
||||
"exist" |
||||
); |
||||
getSwaggerButton("Authentication", 3, "Email validate link").should( |
||||
"exist" |
||||
); |
||||
getSwaggerButton( |
||||
"Authentication", |
||||
4, |
||||
"Validate password reset token" |
||||
).should("exist"); |
||||
getSwaggerButton("Authentication", 5, "Password reset").should( |
||||
"exist" |
||||
); |
||||
getSwaggerButton("Authentication", 6, "User details").should( |
||||
"exist" |
||||
); |
||||
getSwaggerButton("Authentication", 7, "Update user details").should( |
||||
"exist" |
||||
); |
||||
getSwaggerButton("Authentication", 8, "Update user details").should( |
||||
"exist" |
||||
); |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
it("Authorize success: Valid token", () => { |
||||
// authorize button, feed token, click authorize
|
||||
cy.get('[class="btn authorize unlocked"]').click(); |
||||
cy.get("input").type(Token); |
||||
cy.get(".auth-btn-wrapper > .authorize").click(); |
||||
|
||||
// Response: "Authorized" should exist on DOM
|
||||
cy.get(".auth-container").contains("Authorized").should("exist"); |
||||
cy.get(".btn-done").click(); |
||||
|
||||
// Authorize button is LOCKED now
|
||||
cy.get('[class="btn authorize locked"]').should("exist"); |
||||
}); |
||||
|
||||
it("Execute Authentication (valid token case) > GET: User details API", () => { |
||||
// Auth> User details API
|
||||
getSwaggerButton("Authentication", 6, "User details").click(); |
||||
|
||||
// "Try it out" button, followed by "Execute"
|
||||
cy.get(".try-out > .btn").click(); |
||||
cy.get(".execute-wrapper > .btn").click(); |
||||
|
||||
// check response: validate email credentials
|
||||
cy.get(".highlight-code > .microlight") |
||||
.contains("email") |
||||
.should("exist"); |
||||
cy.get(".highlight-code > .microlight") |
||||
.contains(roles.owner.credentials.username) |
||||
.should("exist"); |
||||
|
||||
// reset operations (clear, cancel, windback User details tab)
|
||||
cy.get(".btn-clear").click(); |
||||
cy.get(".try-out > .btn").click(); |
||||
getSwaggerButton("Authentication", 6, "User details").click(); |
||||
}); |
||||
|
||||
it("Logout post authorization", () => { |
||||
// authorize button, logout
|
||||
cy.get('[class="btn authorize locked"]').click(); |
||||
cy.get('.auth-btn-wrapper > button:contains("Logout")').click(); |
||||
cy.get(".btn-done").click(); |
||||
|
||||
// Authorize button is UNLOCKED now
|
||||
cy.get('[class="btn authorize unlocked"]').should("exist"); |
||||
}); |
||||
|
||||
it("Execute Authentication (logout case) > GET: User details API", () => { |
||||
// Auth> User details API
|
||||
getSwaggerButton("Authentication", 6, "User details").click(); |
||||
|
||||
// "Try it out" button, followed by "Execute"
|
||||
cy.get(".try-out > .btn").click(); |
||||
cy.get(".execute-wrapper > .btn").click(); |
||||
|
||||
// check response: email credentials shouldnt exist. should display 'guest:true'
|
||||
cy.get(".highlight-code > .microlight") |
||||
.contains("guest") |
||||
.should("exist"); |
||||
cy.get(".highlight-code > .microlight") |
||||
.contains("email") |
||||
.should("not.exist"); |
||||
cy.get(".highlight-code > .microlight") |
||||
.contains(roles.owner.credentials.username) |
||||
.should("not.exist"); |
||||
|
||||
// reset operations (clear, cancel, windback User details tab)
|
||||
cy.get(".btn-clear").click(); |
||||
cy.get(".try-out > .btn").click(); |
||||
getSwaggerButton("Authentication", 6, "User details").click(); |
||||
}); |
||||
|
||||
it("Authorize failure: invalid token", () => { |
||||
// authorize button, feed *invalid* token, click authorize
|
||||
cy.get('[class="btn authorize unlocked"]').click(); |
||||
cy.get("input").type("xyz"); |
||||
cy.get(".auth-btn-wrapper > .authorize").click(); |
||||
|
||||
// Response: "Authorized" should *not* exist on DOM
|
||||
// TBD: cy.get('.auth-container').contains('Authorized').should('not.exist')
|
||||
cy.get(".btn-done").click(); |
||||
|
||||
// Authorize button should be UNLOCKED now
|
||||
// TBD: cy.get('[class="btn authorize unlocked"]').should('exist')
|
||||
}); |
||||
|
||||
it("Execute Authentication (invalid token case) > GET: User details API", () => { |
||||
// Auth> User details API
|
||||
getSwaggerButton("Authentication", 6, "User details").click(); |
||||
|
||||
// "Try it out" button, followed by "Execute"
|
||||
cy.get(".try-out > .btn").click(); |
||||
cy.get(".execute-wrapper > .btn").click(); |
||||
|
||||
// check response: email credentials shouldnt exist. should display 'guest:true'
|
||||
cy.get(".highlight-code > .microlight") |
||||
.contains("guest") |
||||
.should("exist"); |
||||
cy.get(".highlight-code > .microlight") |
||||
.contains("email") |
||||
.should("not.exist"); |
||||
cy.get(".highlight-code > .microlight") |
||||
.contains(roles.owner.credentials.username) |
||||
.should("not.exist"); |
||||
|
||||
// reset operations (clear, cancel, windback User details tab)
|
||||
cy.get(".btn-clear").click(); |
||||
cy.get(".try-out > .btn").click(); |
||||
getSwaggerButton("Authentication", 6, "User details").click(); |
||||
}); |
||||
|
||||
// clean-up created file (shared.json)
|
||||
// after(() => {
|
||||
// cy.exec("del shared.json").then(()=> {
|
||||
// cy.log("file cleaned up!")
|
||||
// })
|
||||
// })
|
||||
}); |
||||
} |
||||
}; |
||||
|
||||
|
@ -1,99 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
describe(`Language support`, () => { |
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
cy.visit("/"); |
||||
cy.wait(5000); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// after(() => {
|
||||
// });
|
||||
|
||||
const langVerification = (idx, lang) => { |
||||
// pick json from the file specified
|
||||
it(`Language verification: ${lang} > Projects page`, () => { |
||||
let json = require(`../../../../packages/nc-gui/lang/${lang}`); |
||||
|
||||
cy.wait(500); |
||||
// toggle menu as per index
|
||||
cy.get(".nc-menu-translate").should("exist").last().click(); |
||||
cy.wait(500); |
||||
cy.getActiveMenu(".nc-dropdown-menu-translate") |
||||
.find(".ant-dropdown-menu-item") |
||||
.eq(idx) |
||||
.click(); |
||||
cy.wait(200); |
||||
|
||||
// basic validations
|
||||
// 1. Page title: "My Projects"
|
||||
// 2. Button: "New Project"
|
||||
// 3. Search box palceholder text: "Search Projects"
|
||||
// cy.get("b").contains(json.title.myProject).should("exist");
|
||||
cy.get(".nc-project-page-title") |
||||
.contains(json.title.myProject) |
||||
.should("exist"); |
||||
cy.get(".nc-new-project-menu") |
||||
.contains(json.title.newProj) |
||||
.should("exist"); |
||||
cy.get(`[placeholder="${json.activity.searchProject}"]`).should( |
||||
"exist" |
||||
); |
||||
}); |
||||
}; |
||||
|
||||
let langMenu = [ |
||||
"help-translate", |
||||
"ar.json", |
||||
"bn_IN.json", |
||||
"da.json", |
||||
"de.json", |
||||
"en.json", |
||||
"es.json", |
||||
"fa.json", |
||||
"fi.json", |
||||
"fr.json", |
||||
"he.json", |
||||
"hi.json", |
||||
"hr.json", |
||||
"id.json", |
||||
"it.json", |
||||
"ja.json", |
||||
"ko.json", |
||||
"lv.json", |
||||
"nl.json", |
||||
"no.json", |
||||
"pl.json", |
||||
"pt.json", |
||||
"pt_BR.json", |
||||
"ru.json", |
||||
"sl.json", |
||||
"sv.json", |
||||
"th.json", |
||||
"tr.json", |
||||
"uk.json", |
||||
"vi.json", |
||||
"zh-Hans.json", |
||||
"zh-Hant.json", |
||||
]; |
||||
|
||||
// Index is the order in which menu options appear
|
||||
for (let i = 1; i < langMenu.length; i++) langVerification(i, langMenu[i]); |
||||
|
||||
// reset to English
|
||||
langVerification(5, langMenu[5]); |
||||
}); |
||||
}; |
||||
|
||||
|
@ -1,31 +0,0 @@
|
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { isXcdb, roles } from "../../support/page_objects/projectConstants"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
describe(`${apiType.toUpperCase()} Project operations`, () => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
before(() => { |
||||
loginPage.signIn(roles.owner.credentials); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it("Delete Project", () => { |
||||
cy.get(`.nc-action-btn`).should("exist").last().click(); |
||||
|
||||
cy.getActiveModal(".nc-modal-project-delete") |
||||
.find(".ant-btn-dangerous") |
||||
.should("exist") |
||||
.click(); |
||||
}); |
||||
}); |
||||
}; |
@ -1,154 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`${apiType.toUpperCase()} Columns of type attachment`, () => { |
||||
// before(() => {
|
||||
// // loginPage.loginAndOpenProject(apiType, dbType);
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
// clean up
|
||||
mainPage.deleteColumn("testAttach"); |
||||
|
||||
// clean up newly added rows into Country table operations
|
||||
// this auto verifies successfull addition of rows to table as well
|
||||
mainPage.getPagination(5).click(); |
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10); |
||||
|
||||
mainPage.getCell("Country", 10).rightclick(); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Delete Row") |
||||
.click(); |
||||
|
||||
cy.closeTableTab("Country"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it(`Add column of type attachments`, () => { |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
mainPage.addColumnWithType("testAttach", "Attachment", "Country"); |
||||
|
||||
for (let i = 4; i <= 6; i++) { |
||||
let filepath = `sampleFiles/${i}.json`; |
||||
cy.get(".nc-attachment-cell") |
||||
.eq(i) |
||||
.attachFile(filepath, { subjectType: "drag-n-drop" }); |
||||
cy.get(".nc-attachment-cell") |
||||
.eq(i) |
||||
.find(".nc-attachment") |
||||
.should("exist"); |
||||
} |
||||
}); |
||||
|
||||
it(`Form view with Attachment field- Submit & verify`, () => { |
||||
// // open right navbar
|
||||
// cy.get('.nc-toggle-right-navbar').should('exist').click();
|
||||
|
||||
// create form-view
|
||||
cy.get(`.nc-create-form-view`).click(); |
||||
cy.getActiveModal(".nc-modal-view-create") |
||||
.find("button:contains(Submit)") |
||||
.click(); |
||||
|
||||
cy.toastWait("View created successfully"); |
||||
|
||||
mainPage.shareView().click(); |
||||
|
||||
// copy link text, visit URL
|
||||
cy.getActiveModal(".nc-modal-share-view") |
||||
.find(".share-link-box") |
||||
.contains("/nc/form/", { timeout: 10000 }) |
||||
.should("exist") |
||||
.then(($obj) => { |
||||
cy.intercept("/api/v1/db/public/shared-view/**").as( |
||||
"waitForSharedViewLoad" |
||||
); |
||||
|
||||
let linkText = $obj.text().trim(); |
||||
cy.log(linkText); |
||||
|
||||
cy.signOut(); |
||||
|
||||
cy.visit(linkText, { |
||||
baseUrl: null, |
||||
}); |
||||
cy.wait(["@waitForSharedViewLoad"]); |
||||
|
||||
// wait for share view page to load!
|
||||
cy.get(".nc-form").should("exist"); |
||||
cy.get("button:contains(Submit)").should("exist"); |
||||
|
||||
// fill form
|
||||
// 0: Country
|
||||
// 1: LastUpdate
|
||||
cy.get(".nc-input").eq(0).type("_abc"); |
||||
cy.get(".nc-input").eq(1).click(); |
||||
cy.get(".ant-picker-dropdown").find(".ant-picker-now-btn").click(); |
||||
cy.get(".ant-picker-dropdown").find("button.ant-btn-primary").click(); |
||||
|
||||
cy.get(".nc-attachment-cell").attachFile(`sampleFiles/1.json`, { |
||||
subjectType: "drag-n-drop", |
||||
}); |
||||
|
||||
cy.get(".nc-form").find("button").contains("Submit").click(); |
||||
|
||||
cy.get(".ant-alert-message") |
||||
.contains("Successfully submitted form data") |
||||
.should("exist"); |
||||
|
||||
cy.toastWait("Saved successfully"); |
||||
}); |
||||
}); |
||||
|
||||
it(`Filter column which contain only attachments, download CSV`, () => { |
||||
// come back to main window
|
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
mainPage.filterField("testAttach", "is not null", null); |
||||
mainPage.hideField("LastUpdate"); |
||||
|
||||
const verifyCsv = (retrievedRecords) => { |
||||
let storedRecords = [ |
||||
`Country,City List,testAttach`, |
||||
`Afghanistan,Kabul,1.json(http://localhost:8080/download/p_h0wxjx5kgoq3w4/vw_skyvc7hsp9i34a/2HvU8R.json)`, |
||||
]; |
||||
|
||||
expect(retrievedRecords[0]).to.be.equal(storedRecords[0]); |
||||
for (let i = 1; i < storedRecords.length; i++) { |
||||
const columns = retrievedRecords[i].split(","); |
||||
expect(columns[2]).to.contain( |
||||
".json(http://localhost:8080/download/" |
||||
); |
||||
} |
||||
|
||||
cy.log(retrievedRecords[109]); |
||||
cy.log(retrievedRecords[110]); |
||||
cy.log(retrievedRecords[111]); |
||||
}; |
||||
|
||||
mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv); |
||||
mainPage.unhideField("LastUpdate"); |
||||
mainPage.filterReset(); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
|
@ -1,187 +0,0 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { projectsPage } from "../../support/page_objects/navigation"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { |
||||
_advSettings, |
||||
_editSchema, |
||||
_editData, |
||||
_editComment, |
||||
_viewMenu, |
||||
_topRightMenu, |
||||
} from "../spec/roleValidation.spec"; |
||||
import { linkSync } from "fs"; |
||||
|
||||
// fix me
|
||||
let linkText = ""; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
const permissionValidation = (roleType) => { |
||||
it(`${roleType}: Visit base shared URL`, () => { |
||||
cy.log(linkText); |
||||
// http://localhost:8080/api/v1/db/meta/projects/p_4ufoizgrorwyey/tables?includeM2M=false
|
||||
cy.intercept("/api/v1/db/meta/projects/*/tables*").as("waitForPageLoad"); |
||||
|
||||
// visit URL & wait for page load to complete
|
||||
cy.visit(linkText, { |
||||
baseUrl: null, |
||||
}); |
||||
cy.wait(["@waitForPageLoad"]); |
||||
}); |
||||
|
||||
it(`${roleType}: Validate access permissions: advance menu`, () => { |
||||
// cy.restoreLocalStorage();
|
||||
_advSettings(roleType, "baseShare"); |
||||
}); |
||||
|
||||
it(`${roleType}: Validate access permissions: edit schema`, () => { |
||||
// cy.restoreLocalStorage();
|
||||
_editSchema(roleType, "baseShare"); |
||||
}); |
||||
|
||||
it(`${roleType}: Validate access permissions: edit data`, () => { |
||||
// cy.restoreLocalStorage();
|
||||
_editData(roleType, "baseShare"); |
||||
}); |
||||
|
||||
it(`${roleType}: Validate access permissions: edit comments`, () => { |
||||
// cy.restoreLocalStorage();
|
||||
_editComment(roleType, "baseShare"); |
||||
}); |
||||
|
||||
it(`${roleType}: Validate access permissions: view's menu`, () => { |
||||
// cy.restoreLocalStorage();
|
||||
_viewMenu(roleType, "baseShare"); |
||||
}); |
||||
}; |
||||
|
||||
describe(`${apiType.toUpperCase()} Base VIEW share`, () => { |
||||
// before(() => {
|
||||
// // loginPage.loginAndOpenProject(apiType, dbType);
|
||||
// cy.restoreLocalStorage();
|
||||
// cy.openTableTab("Country", 25);
|
||||
// cy.saveLocalStorage();
|
||||
// });
|
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it(`Generate base share URL`, () => { |
||||
cy.openTableTab("Country", 25); |
||||
|
||||
// click SHARE
|
||||
cy.get(".nc-share-base:visible").should("exist").click(); |
||||
|
||||
// Click on readonly base text
|
||||
cy.getActiveModal().find(".nc-disable-shared-base").click(); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-shared-base-toggle") |
||||
.find(".ant-dropdown-menu-title-content") |
||||
.contains("Anyone with the link") |
||||
.click(); |
||||
|
||||
cy.getActiveModal().find(".nc-shared-base-role").click(); |
||||
|
||||
cy.getActiveSelection(".nc-dropdown-share-base-role") |
||||
.find(".ant-select-item") |
||||
.eq(1) |
||||
.click(); |
||||
|
||||
// Copy URL
|
||||
cy.getActiveModal(".nc-modal-invite-user-and-share-base") |
||||
.find(".nc-url") |
||||
.then(($obj) => { |
||||
cy.log($obj[0]); |
||||
linkText = $obj[0].innerText.trim(); |
||||
|
||||
const htmlFile = ` |
||||
<!DOCTYPE html> |
||||
<html> |
||||
<body> |
||||
|
||||
<iframe |
||||
class="nc-embed" |
||||
src="${linkText}?embed" |
||||
frameborder="0" |
||||
width="100%" |
||||
height="700" |
||||
style="background: transparent; "></iframe> |
||||
|
||||
</body> |
||||
</html> |
||||
`;
|
||||
cy.writeFile( |
||||
"scripts/cypress/fixtures/sampleFiles/iFrame.html", |
||||
htmlFile |
||||
); |
||||
}); |
||||
|
||||
cy.log(linkText); |
||||
|
||||
cy.signOut(); |
||||
}); |
||||
|
||||
permissionValidation("viewer"); |
||||
|
||||
it("Update to EDITOR base share link", () => { |
||||
loginPage.loginAndOpenProject(apiType, dbType); |
||||
|
||||
// click SHARE
|
||||
cy.get(".nc-share-base:visible").should("exist").click(); |
||||
|
||||
cy.getActiveModal().find(".nc-shared-base-role").click(); |
||||
|
||||
cy.getActiveSelection(".nc-dropdown-share-base-role") |
||||
.find(".ant-select-item") |
||||
.eq(0) |
||||
.click(); |
||||
|
||||
cy.signOut(); |
||||
}); |
||||
|
||||
permissionValidation("editor"); |
||||
}); |
||||
|
||||
describe(`${apiType.toUpperCase()} iFrame Test`, () => { |
||||
// https://docs.cypress.io/api/commands/visit#Prefixes
|
||||
it("Generate & verify embed HTML IFrame", { baseUrl: null }, () => { |
||||
let filePath = "scripts/cypress/fixtures/sampleFiles/iFrame.html"; |
||||
cy.log(filePath); |
||||
cy.visit(filePath, { baseUrl: null }); |
||||
|
||||
// wait for iFrame to load
|
||||
cy.frameLoaded(".nc-embed"); |
||||
|
||||
// cy.openTableTab("Country", 25);
|
||||
cy.iframe() |
||||
.find(`.nc-project-tree-tbl-Actor`, { timeout: 10000 }) |
||||
.should("exist") |
||||
.first() |
||||
.click({ force: true }); |
||||
|
||||
// validation for base menu opitons
|
||||
cy.iframe().find(".nc-project-tree").should("exist"); |
||||
cy.iframe().find(".nc-fields-menu-btn").should("exist"); |
||||
cy.iframe().find(".nc-sort-menu-btn").should("exist"); |
||||
cy.iframe().find(".nc-filter-menu-btn").should("exist"); |
||||
cy.iframe().find(".nc-actions-menu-btn").should("exist"); |
||||
|
||||
// validate data (row-1)
|
||||
cy.iframe() |
||||
.find(`.nc-grid-cell:eq(1):contains("PENELOPE")`) |
||||
.should("exist"); |
||||
cy.iframe() |
||||
.find(`.nc-grid-cell:eq(2):contains("GUINESS")`) |
||||
.should("exist"); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
|
@ -1,63 +0,0 @@
|
||||
import { isTestSuiteActive, roles } from "../../support/page_objects/projectConstants"; |
||||
|
||||
|
||||
const newPassword = `${roles.owner.credentials.password}1`; |
||||
const currentPasswordIsWrong = "Current password is wrong"; |
||||
const passwordsNotMatching = "Passwords do not match"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe('User settings', () => { |
||||
it('Visit user settings page', () => { |
||||
cy.get("[data-cy='nc-noco-brand-icon']").click(); |
||||
|
||||
cy.get("[data-cy='nc-menu-accounts']").click(); |
||||
cy.get("[data-cy='nc-menu-accounts__user-settings']").click(); |
||||
cy.get('.user-management-tab-label:contains("Reset Password")').should('exist').click() |
||||
cy.get("[data-cy='nc-user-settings-form']").should("exist"); |
||||
}); |
||||
|
||||
describe('Update password and verify user settings form validation', () => { |
||||
beforeEach(() => { |
||||
cy.get("[data-cy='nc-user-settings-form__current-password']").clear(); |
||||
cy.get("[data-cy='nc-user-settings-form__new-password']").clear(); |
||||
cy.get("[data-cy='nc-user-settings-form__new-password-repeat']").clear(); |
||||
}) |
||||
|
||||
it('Verifies current password', () => { |
||||
cy.get("[data-cy='nc-user-settings-form__current-password']").type('WrongPassword'); |
||||
cy.get("[data-cy='nc-user-settings-form__new-password']").type(newPassword); |
||||
cy.get("[data-cy='nc-user-settings-form__new-password-repeat']").type(newPassword); |
||||
cy.get("[data-cy='nc-user-settings-form__submit']").click(); |
||||
cy.get("[data-cy='nc-user-settings-form__error']").should("exist").should("contain", currentPasswordIsWrong); |
||||
}); |
||||
|
||||
it('Verifies passwords match', () => { |
||||
cy.get("[data-cy='nc-user-settings-form__current-password']").type(roles.owner.credentials.password); |
||||
cy.get("[data-cy='nc-user-settings-form__new-password']").type(newPassword); |
||||
cy.get("[data-cy='nc-user-settings-form__new-password-repeat']").type(`${newPassword}NotMatching`); |
||||
cy.get("[data-cy='nc-user-settings-form__submit']").click(); |
||||
cy.get(".ant-form-item-explain-error").should("exist").should("contain", passwordsNotMatching); |
||||
}); |
||||
|
||||
it('Changes user password & signs out', () => { |
||||
cy.get("[data-cy='nc-user-settings-form__current-password']").type(roles.owner.credentials.password); |
||||
cy.get("[data-cy='nc-user-settings-form__new-password']").type(newPassword); |
||||
cy.get("[data-cy='nc-user-settings-form__new-password-repeat']").type(newPassword); |
||||
cy.get("[data-cy='nc-user-settings-form__submit']").click(); |
||||
cy.get("[data-cy='nc-user-settings-form__submit']").should("not.exist"); |
||||
}); |
||||
}) |
||||
|
||||
describe('Sign in with new password', () => { |
||||
it('Verifies new password works', () => { |
||||
cy.get("[data-cy='nc-form-signin']").should("exist"); |
||||
cy.get("[data-cy='nc-form-signin__email']").type(roles.owner.credentials.username); |
||||
cy.get("[data-cy='nc-form-signin__password']").type(newPassword); |
||||
cy.get("[data-cy='nc-form-signin__submit']").click(); |
||||
cy.get("[data-cy='nc-menu-accounts']").should("exist"); |
||||
}) |
||||
}) |
||||
}); |
||||
}; |
@ -1,291 +0,0 @@
|
||||
// Cypress test suite: Project creation using EXCEL
|
||||
//
|
||||
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { |
||||
roles, |
||||
isTestSuiteActive, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
|
||||
// stores sheet names (table name)
|
||||
let sheetList; |
||||
|
||||
// stores table data (read from excel)
|
||||
let sheetData; |
||||
//let UrlSheetData
|
||||
|
||||
let URL = "https://go.microsoft.com/fwlink/?LinkID=521962"; |
||||
|
||||
let filepath = `sampleFiles/simple.xlsx`; |
||||
// let UrlFilePath = `sampleFiles/Financial Sample.xlsx`
|
||||
|
||||
let expectedData = { |
||||
0: ["number", "Number", "Number"], |
||||
1: ["float", "Decimal", "Float"], |
||||
2: ["text", "SingleLineText", "Text"], |
||||
}; |
||||
|
||||
// column names with spaces will be converted to include _
|
||||
let UrlFileExpectedData = { |
||||
0: ["Segment", "SingleSelect", ["Government"]], |
||||
1: ["Country", "SingleSelect", ["Canada"]], |
||||
2: ["Product", "SingleSelect", ["Carretera"]], |
||||
3: ["Discount_Band", "SingleSelect", ["None"]], |
||||
4: ["Units_Sold", "Decimal", [1618.5]], |
||||
5: ["Manufacturing_Price", "Number", [3]], |
||||
6: ["Sale_Price", "Number", [20]], |
||||
7: ["Gross_Sales", "Decimal", [32370]], |
||||
8: ["Discounts", "Decimal", [0]], |
||||
9: ["Sales", "Decimal", [32370]], |
||||
10: ["COGS", "Decimal", [16185]], |
||||
11: ["Profit", "Decimal", [16185]], |
||||
12: ["Date", "Date", ["2014-01-01"]], |
||||
13: ["Month_Number", "Number", [1]], |
||||
14: ["Month_Name", "SingleSelect", ["January"]], |
||||
15: ["Year", "SingleSelect", [2014]], |
||||
}; |
||||
|
||||
// let filepath = `sampleFiles/sample.xlsx`
|
||||
// let expectedData = {
|
||||
// 0: ['number', 'Number'],
|
||||
// 1: ['float', 'Decimal'],
|
||||
// 2: ['text', 'SingleLineText'],
|
||||
// 3: ['boolean', 'Checkbox'],
|
||||
// 4: ['currency', 'Currency'],
|
||||
// 5: ['date', 'Date'],
|
||||
// 6: ['field7', 'SingleLineText'],
|
||||
// 7: ['multi line', 'LongText'],
|
||||
// 8: ['multi select', 'MultiSelect'],
|
||||
// 9: ['field10', 'SingleLineText'],
|
||||
// 10: ['formula', 'Decimal'],
|
||||
// 11: ['percentage', 'Decimal'],
|
||||
// 12: ['dateTime', 'DateTime']
|
||||
// }
|
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`Import from excel`, () => { |
||||
before(() => { |
||||
// loginPage.signIn(roles.owner.credentials);
|
||||
|
||||
cy.restoreLocalStorage(); |
||||
|
||||
cy.task("readSheetList", { |
||||
file: `./scripts/cypress/fixtures/${filepath}`, |
||||
}).then((rows) => { |
||||
cy.log(rows); |
||||
sheetList = rows; |
||||
}); |
||||
|
||||
cy.task("readXlsx", { |
||||
file: `./scripts/cypress/fixtures/${filepath}`, |
||||
sheet: "Sheet2", |
||||
}).then((rows) => { |
||||
cy.log(rows); |
||||
sheetData = rows; |
||||
}); |
||||
|
||||
// cy.visit("/");
|
||||
projectsPage.createProject( |
||||
{ dbType: "none", apiType: "REST", name: "importSample" }, |
||||
{} |
||||
); |
||||
|
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it("File Upload: Upload excel as template", () => { |
||||
cy.get(".nc-add-new-table").should("exist").trigger("mouseover"); |
||||
cy.get(".nc-import-menu").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-import-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Microsoft Excel") |
||||
.click(); |
||||
|
||||
cy.get(".nc-input-import") |
||||
.should("exist") |
||||
.find("input") |
||||
.attachFile(filepath); |
||||
cy.toastWait("Uploaded file simple.xlsx successfully"); |
||||
cy.get(".nc-btn-import").should("exist").click(); |
||||
}); |
||||
|
||||
it("File Upload: Verify pre-load template page", () => { |
||||
// http://localhost:8080/api/v1/db/meta/audits/comments/count?ids[]=1&ids[]=2&fk_model_id=md_fq1vxy2181bzp0
|
||||
cy.intercept("/api/v1/db/meta/audits/comments/count*").as( |
||||
"waitForPageLoad" |
||||
); |
||||
|
||||
cy.getActiveModal() |
||||
.find(".ant-collapse-item") |
||||
.then((sheets) => { |
||||
// hardcoded. fix me.
|
||||
let sheetList = ["Sheet2", "Sheet3", "Sheet4"]; |
||||
|
||||
for (let i = 0; i < sheets.length; i++) { |
||||
cy.wrap(sheets[i]) |
||||
.find(".ant-collapse-header") |
||||
.contains(sheetList[i]) |
||||
.should("exist"); |
||||
|
||||
// for each sheet, expand to verify table names & their data types
|
||||
if (i !== 0) cy.wrap(sheets[i]).find(".ant-collapse-arrow").click(); |
||||
|
||||
// sheet > tables > rows > cells > inputs
|
||||
cy.wrap(sheets[i]) |
||||
.find(".ant-table-tbody") |
||||
.then((tables) => { |
||||
cy.wrap(tables) |
||||
.find(".ant-table-row:visible") |
||||
.should("have.length", 3) |
||||
.then((rows) => { |
||||
// cy.log(rows)
|
||||
for (let j = 0; j < rows.length; j++) { |
||||
cy.wrap(rows[j]) |
||||
.find(".ant-table-cell") |
||||
.then((cells) => { |
||||
cy.wrap(cells[0]) |
||||
.find("input") |
||||
.then((input) => { |
||||
expect(input.val()).to.equal(expectedData[j][0]); |
||||
}); |
||||
cy.wrap(cells[1]) |
||||
.find(".ant-select-selection-item") |
||||
.contains(expectedData[j][1]) |
||||
.should("exist"); |
||||
}); |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
// unwind
|
||||
cy.wrap(sheets[i]).find(".ant-collapse-arrow").click(); |
||||
} |
||||
}); |
||||
cy.getActiveModal().find(".ant-btn-primary").click(); |
||||
|
||||
// Wait for page to get loaded (issue observed in CI-CD)
|
||||
// Timeout set to 30 seconds. Default was 5 seconds. Increased due to delay in completion sometimes in CI-CD
|
||||
cy.wait("@waitForPageLoad", { timeout: 30000 }); |
||||
}); |
||||
|
||||
it("File Upload: Verify loaded data", () => { |
||||
cy.openTableTab("Sheet2", 2); |
||||
for (const [key, value] of Object.entries(expectedData)) { |
||||
mainPage |
||||
.getCell(value[2], 1) |
||||
.contains(sheetData[0][value[0]]) |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell(value[2], 2) |
||||
.contains(sheetData[1][value[0]]) |
||||
.should("exist"); |
||||
} |
||||
cy.closeTableTab("Sheet2"); |
||||
|
||||
cy.openTableTab("Sheet3", 2); |
||||
for (const [key, value] of Object.entries(expectedData)) { |
||||
mainPage |
||||
.getCell(value[2], 1) |
||||
.contains(sheetData[0][value[0]]) |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell(value[2], 2) |
||||
.contains(sheetData[1][value[0]]) |
||||
.should("exist"); |
||||
} |
||||
cy.closeTableTab("Sheet3"); |
||||
}); |
||||
|
||||
it.skip("URL: Upload excel as template", () => { |
||||
// trigger import
|
||||
cy.get(`[data-menu-id="addORImport"]`).click(); |
||||
cy.getActivePopUp().contains("Microsoft Excel").should("exist").click(); |
||||
|
||||
cy.getActiveModal().find(".ant-tabs-tab").last().click(); |
||||
|
||||
cy.get('input[type="text"]').last().click().type(URL); |
||||
cy.get(".nc-btn-primary").should("exist").click(); |
||||
}); |
||||
|
||||
it.skip("URL: Verify pre-load template page", () => { |
||||
cy.getActiveModal() |
||||
.find(".ant-collapse-item") |
||||
.then((sheets) => { |
||||
let sheetList = ["Sheet1"]; |
||||
|
||||
for (let i = 0; i < sheets.length; i++) { |
||||
cy.wrap(sheets[i]) |
||||
.find(".ant-collapse-header") |
||||
.contains(sheetList[i]) |
||||
.should("exist"); |
||||
|
||||
cy.wrap(sheets[i]) |
||||
.find(".ant-table-tbody") |
||||
.then((tables) => { |
||||
cy.wrap(tables) |
||||
.find(".ant-table-row:visible") |
||||
.then((rows) => { |
||||
// cy.log(rows)
|
||||
for (let j = 0; j < 10; j++) { |
||||
cy.wrap(rows[j]) |
||||
.find(".ant-table-cell") |
||||
.then((cells) => { |
||||
// cy.log(cells)
|
||||
for (let k = 0; k < 2; k++) { |
||||
cy.wrap(cells[k]) |
||||
.find("input") |
||||
.then((input) => { |
||||
// cy.log(input)
|
||||
expect(input.val()).to.equal( |
||||
UrlFileExpectedData[j][k] |
||||
); |
||||
}); |
||||
} |
||||
}); |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
// unwind
|
||||
cy.wrap(sheets[i]).find(".ant-collapse-arrow").click(); |
||||
} |
||||
}); |
||||
|
||||
cy.getActiveModal().find(".ant-btn-primary").click(); |
||||
}); |
||||
|
||||
it.skip("URL: Verify loaded data", () => { |
||||
// wait for loading to be completed
|
||||
projectsPage.waitHomePageLoad(); |
||||
|
||||
// open sheet & validate contents
|
||||
// sheetData contains data read from excel in format
|
||||
// 0: { float: 1.1, number: 1, text: "abc" }
|
||||
// 1: { float: 1.2, number: 0, text: "def" }
|
||||
|
||||
cy.openTableTab("Sheet1", 25); |
||||
let idx = 0; |
||||
for (const [key, value] of Object.entries(UrlFileExpectedData)) { |
||||
if (UrlFileExpectedData[idx][1] != "Date") |
||||
mainPage |
||||
.getCell(value[0], 1) |
||||
.contains(UrlFileExpectedData[idx++][2][0]) |
||||
.should("exist"); |
||||
} |
||||
cy.closeTableTab("Sheet1"); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
|
@ -1,80 +0,0 @@
|
||||
// Cypress test suite: Project import from Airtable
|
||||
//
|
||||
|
||||
import { |
||||
isTestSuiteActive, |
||||
roles, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
|
||||
let apiKey = ""; |
||||
let sharedBase = ""; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
describe(`Import from airtable`, () => { |
||||
before(() => { |
||||
apiKey = Cypress.env("airtable").apiKey; |
||||
sharedBase = Cypress.env("airtable").sharedBase; |
||||
|
||||
loginPage.signIn(roles.owner.credentials); |
||||
projectsPage.createProject( |
||||
{ dbType: "none", apiType: "REST", name: "importSample" }, |
||||
{} |
||||
); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// after(() => {
|
||||
// cy.saveLocalStorage();
|
||||
// });
|
||||
|
||||
it("Import", () => { |
||||
cy.log(apiKey, sharedBase); |
||||
|
||||
// trigger import
|
||||
cy.get(".nc-add-new-table").should("exist").trigger("mouseover"); |
||||
cy.get(".nc-import-menu").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-import-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Airtable") |
||||
.click(); |
||||
|
||||
cy.getActiveModal(".nc-modal-airtable-import") |
||||
.find(".nc-input-api-key") |
||||
.should("exist") |
||||
.clear() |
||||
.type(apiKey); |
||||
cy.getActiveModal(".nc-modal-airtable-import") |
||||
.find(".nc-input-shared-base") |
||||
.should("exist") |
||||
.clear() |
||||
.type(sharedBase); |
||||
cy.getActiveModal(".nc-modal-airtable-import") |
||||
.find(".nc-btn-airtable-import") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// it will take a while for import to finish
|
||||
// cy.getActiveModal().find(".nc-btn-go-dashboard", {timeout: 180000}).should('exist').click()
|
||||
|
||||
// wait for import to finish (kludge/hardcoded)
|
||||
cy.get(":nth-child(51) > .flex", { timeout: 180000 }) |
||||
.contains("Complete!") |
||||
.should("exist"); |
||||
cy.get(".ant-modal-close-x").should("exist").click(); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
|
@ -1,429 +0,0 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
|
||||
// locally configured hook (server.js)
|
||||
let hookPath = "http://localhost:9090/hook"; |
||||
|
||||
function createWebhook(hook, test) { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-title-content") |
||||
.contains("Webhooks") |
||||
.click(); |
||||
|
||||
// cy.get(".nc-btn-webhook").should("exist").click();
|
||||
cy.get(".nc-btn-create-webhook").should("exist").click(); |
||||
|
||||
// hardcode "Content-type: application/json"
|
||||
cy.get(`.ant-tabs-tab-btn:contains("Headers")`).should("exist").click(); |
||||
|
||||
cy.get(".nc-input-hook-header-key") |
||||
.should("exist") |
||||
.click() |
||||
.type("Content-Type{enter}"); |
||||
|
||||
cy.get("input.nc-input-hook-header-value") |
||||
.should("exist") |
||||
.clear({ force: true }) |
||||
.type("application/json", { force: true }); |
||||
|
||||
cy.get(".nc-hook-header-tab-checkbox") |
||||
.find("input.ant-checkbox-input") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// common routine for both create & modify to configure hook
|
||||
configureWebhook(hook, test); |
||||
} |
||||
|
||||
function deleteWebhook(index) { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-title-content") |
||||
.contains("Webhooks") |
||||
.click(); |
||||
|
||||
cy.get(".nc-hook-delete-icon").eq(index).click({ force: true }); |
||||
cy.toastWait("Hook deleted successfully"); |
||||
cy.get("body").type("{esc}"); |
||||
} |
||||
|
||||
function openWebhook(index) { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-title-content") |
||||
.contains("Webhooks") |
||||
.click(); |
||||
|
||||
cy.get(".nc-hook").eq(index).click({ force: true }); |
||||
} |
||||
|
||||
function configureWebhook(hook, test) { |
||||
// configure what ever is present. ignore rest
|
||||
// currently works for only URL type
|
||||
|
||||
if (hook?.title) { |
||||
cy.get(".nc-text-field-hook-title") |
||||
.should("exist") |
||||
.clear() |
||||
.type(hook.title); |
||||
} |
||||
|
||||
if (hook?.event) { |
||||
cy.get(".nc-text-field-hook-event").should("exist").click(); |
||||
cy.getActiveSelection(".nc-dropdown-webhook-event") |
||||
.find(`.ant-select-item`) |
||||
.contains(hook.event) |
||||
.should("exist") |
||||
.click(); |
||||
} |
||||
|
||||
if (hook?.url?.path) { |
||||
cy.get(".nc-text-field-hook-url-path") |
||||
.should("exist") |
||||
.clear() |
||||
.type(hook.url.path); |
||||
} |
||||
|
||||
if (hook?.deleteCondition === true) { |
||||
cy.get(".nc-filter-item-remove-btn").should("exist").click({ force: true }); |
||||
} |
||||
|
||||
if (hook?.condition) { |
||||
cy.get(".nc-check-box-hook-condition").should("exist").click(); |
||||
cy.get(".menu-filter-dropdown") |
||||
.last() |
||||
.find("button") |
||||
.contains("Add Filter") |
||||
.click(); |
||||
|
||||
cy.get(".nc-filter-field-select").should("exist").last().click(); |
||||
cy.get(".ant-select-dropdown:visible") |
||||
.should("exist") |
||||
.find(`.ant-select-item`) |
||||
.contains(new RegExp("^" + hook.condition.column + "$", "g")) |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
cy.get(".nc-filter-operation-select").should("exist").last().click(); |
||||
cy.get(".ant-select-dropdown:visible") |
||||
.should("exist") |
||||
.find(`.ant-select-item`) |
||||
.contains(hook.condition.operator) |
||||
.should("exist") |
||||
.click(); |
||||
if ( |
||||
hook.condition.operator != "is null" && |
||||
hook.condition.operator != "is not null" |
||||
) { |
||||
cy.get(".nc-filter-value-select") |
||||
.should("exist") |
||||
.last() |
||||
.type(hook.condition.value); |
||||
cy.get(".nc-filter-operation-select").last().click(); |
||||
} |
||||
} |
||||
|
||||
if (test) { |
||||
cy.get(".nc-btn-webhook-test").should("exist").click(); |
||||
cy.toastWait("Webhook tested successfully"); |
||||
} |
||||
|
||||
cy.get(".nc-btn-webhook-save").should("exist").click(); |
||||
cy.toastWait("Webhook details updated successfully"); |
||||
cy.get(".nc-icon-hook-navigate-left").should("exist").click(); |
||||
cy.get("body").type("{esc}"); |
||||
} |
||||
|
||||
function clearServerData() { |
||||
// clear stored data in server
|
||||
cy.request("http://localhost:9090/hook/clear"); |
||||
|
||||
// ensure stored message count is 0
|
||||
cy.request("http://localhost:9090/hook/count").then((msg) => { |
||||
cy.log(msg.body); |
||||
expect(msg.body).to.equal(0); |
||||
}); |
||||
} |
||||
|
||||
function addNewRow(index, cellValue) { |
||||
mainPage.addNewRowExpand("Temp"); |
||||
|
||||
cy.get(".nc-expand-col-Title") |
||||
.should("exist") |
||||
.find(".nc-cell > input") |
||||
.first() |
||||
.type(cellValue); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".ant-btn-primary") |
||||
.click(); |
||||
|
||||
cy.toastWait("updated successfully"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".ant-btn") |
||||
.contains("Cancel") |
||||
.click(); |
||||
mainPage.getCell("Title", index).contains(cellValue).should("exist"); |
||||
} |
||||
|
||||
function updateRow(index, cellValue) { |
||||
cy.get(".nc-row-expand") |
||||
.eq(index - 1) |
||||
.click({ force: true }); |
||||
|
||||
// wait for page render to complete
|
||||
cy.get('button:contains("Save row"):visible').should("exist"); |
||||
|
||||
cy.get(".nc-expand-col-Title") |
||||
.should("exist") |
||||
.find(".nc-cell > input") |
||||
.should("exist") |
||||
.first() |
||||
.clear() |
||||
.type(cellValue); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
// partial toast message
|
||||
cy.toastWait("updated successfully"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Cancel") |
||||
.click({ force: true }); |
||||
} |
||||
|
||||
function verifyHookTrigger(count, lastValue) { |
||||
// allow message to be received
|
||||
cy.wait(100); |
||||
|
||||
cy.request("http://localhost:9090/hook/count").then((msg) => { |
||||
cy.log(msg.body); |
||||
expect(msg.body).to.equal(count); |
||||
}); |
||||
if (count) { |
||||
cy.request("http://localhost:9090/hook/last").then((msg) => { |
||||
cy.log(msg.body); |
||||
expect(msg.body.Title).to.equal(lastValue); |
||||
}); |
||||
} |
||||
} |
||||
|
||||
function deleteRow(index) { |
||||
mainPage.getCell("Title", index).rightclick(); |
||||
|
||||
// delete row
|
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.find('.ant-dropdown-menu-item:contains("Delete Row")') |
||||
.first() |
||||
.click(); |
||||
} |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
describe(`Webhook`, () => { |
||||
before(() => { |
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.restoreLocalStorage(); |
||||
cy.createTable("Temp"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.deleteTable("Temp"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
it("Create: 'After Insert' event", () => { |
||||
createWebhook({ |
||||
title: "hook-1", |
||||
event: "After Insert", |
||||
type: "URL", |
||||
url: { |
||||
method: "POST", |
||||
path: hookPath, |
||||
}, |
||||
}); |
||||
clearServerData(); |
||||
addNewRow(1, "Poole"); |
||||
verifyHookTrigger(1, "Poole"); |
||||
updateRow(1, "Delaware"); |
||||
verifyHookTrigger(1, "Poole"); |
||||
deleteRow(1); |
||||
verifyHookTrigger(1, "Poole"); |
||||
}); |
||||
|
||||
it("Add 'After Update' event", () => { |
||||
createWebhook({ |
||||
title: "hook-2", |
||||
event: "After Update", |
||||
type: "URL", |
||||
url: { |
||||
method: "POST", |
||||
path: hookPath, |
||||
}, |
||||
}); |
||||
clearServerData(); |
||||
addNewRow(1, "Poole"); |
||||
verifyHookTrigger(1, "Poole"); |
||||
updateRow(1, "Delaware"); |
||||
verifyHookTrigger(2, "Delaware"); |
||||
deleteRow(1); |
||||
verifyHookTrigger(2, "Delaware"); |
||||
}); |
||||
|
||||
it("Add 'After Delete' event", () => { |
||||
createWebhook({ |
||||
title: "hook-3", |
||||
event: "After Delete", |
||||
type: "URL", |
||||
url: { |
||||
method: "POST", |
||||
path: hookPath, |
||||
}, |
||||
}); |
||||
clearServerData(); |
||||
addNewRow(1, "Poole"); |
||||
verifyHookTrigger(1, "Poole"); |
||||
updateRow(1, "Delaware"); |
||||
verifyHookTrigger(2, "Delaware"); |
||||
deleteRow(1); |
||||
verifyHookTrigger(3, "Delaware"); |
||||
}); |
||||
|
||||
it("Modify webhook", () => { |
||||
openWebhook(0); |
||||
configureWebhook({ event: "After Delete" }); |
||||
openWebhook(1); |
||||
configureWebhook({ event: "After Delete" }); |
||||
|
||||
clearServerData(); |
||||
addNewRow(1, "Poole"); |
||||
verifyHookTrigger(0, ""); |
||||
updateRow(1, "Delaware"); |
||||
verifyHookTrigger(0, ""); |
||||
deleteRow(1); |
||||
verifyHookTrigger(3, "Delaware"); |
||||
}); |
||||
|
||||
it("Delete webhook", () => { |
||||
deleteWebhook(2); |
||||
deleteWebhook(1); |
||||
deleteWebhook(0); |
||||
|
||||
clearServerData(); |
||||
addNewRow(1, "Poole"); |
||||
verifyHookTrigger(0, ""); |
||||
updateRow(1, "Delaware"); |
||||
verifyHookTrigger(0, ""); |
||||
deleteRow(1); |
||||
verifyHookTrigger(0, ""); |
||||
}); |
||||
|
||||
it("Create, with condition", () => { |
||||
// create 3 webhooks with all three events, with condition this time
|
||||
createWebhook({ |
||||
title: "hook-with-condition-1", |
||||
event: "After Insert", |
||||
type: "URL", |
||||
url: { |
||||
method: "POST", |
||||
path: hookPath, |
||||
}, |
||||
condition: { |
||||
column: "Title", |
||||
operator: "is like", |
||||
value: "Poole", |
||||
}, |
||||
}); |
||||
createWebhook({ |
||||
title: "hook-with-condition-2", |
||||
event: "After Update", |
||||
type: "URL", |
||||
url: { |
||||
method: "POST", |
||||
path: hookPath, |
||||
}, |
||||
condition: { |
||||
column: "Title", |
||||
operator: "is like", |
||||
value: "Poole", |
||||
}, |
||||
}); |
||||
createWebhook({ |
||||
title: "hook-with-condition-3", |
||||
event: "After Delete", |
||||
type: "URL", |
||||
url: { |
||||
method: "POST", |
||||
path: hookPath, |
||||
}, |
||||
condition: { |
||||
column: "Title", |
||||
operator: "is like", |
||||
value: "Poole", |
||||
}, |
||||
}); |
||||
|
||||
clearServerData(); |
||||
addNewRow(1, "Poole"); |
||||
addNewRow(2, "Delaware"); |
||||
verifyHookTrigger(1, "Poole"); |
||||
updateRow(1, "Delaware"); |
||||
updateRow(2, "Poole"); |
||||
verifyHookTrigger(2, "Poole"); |
||||
deleteRow(2); |
||||
deleteRow(1); |
||||
verifyHookTrigger(3, "Poole"); |
||||
}); |
||||
|
||||
it("Modify trigger condition", () => { |
||||
openWebhook(0); |
||||
configureWebhook({ deleteCondition: true }); |
||||
openWebhook(1); |
||||
configureWebhook({ deleteCondition: true }); |
||||
openWebhook(2); |
||||
configureWebhook({ deleteCondition: true }); |
||||
|
||||
clearServerData(); |
||||
addNewRow(1, "Poole"); |
||||
addNewRow(2, "Delaware"); |
||||
verifyHookTrigger(2, "Delaware"); |
||||
updateRow(1, "Delaware"); |
||||
updateRow(2, "Poole"); |
||||
verifyHookTrigger(4, "Poole"); |
||||
deleteRow(2); |
||||
deleteRow(1); |
||||
verifyHookTrigger(6, "Delaware"); |
||||
}); |
||||
|
||||
it("Delete trigger condition", () => { |
||||
deleteWebhook(2); |
||||
deleteWebhook(1); |
||||
deleteWebhook(0); |
||||
|
||||
clearServerData(); |
||||
addNewRow(1, "Poole"); |
||||
verifyHookTrigger(0, ""); |
||||
updateRow(1, "Delaware"); |
||||
verifyHookTrigger(0, ""); |
||||
deleteRow(1); |
||||
verifyHookTrigger(0, ""); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
|
@ -1,500 +0,0 @@
|
||||
import { |
||||
isTestSuiteActive, |
||||
roles, |
||||
} from "../../support/page_objects/projectConstants"; |
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation"; |
||||
import { mainPage } from "../../support/page_objects/mainPage"; |
||||
|
||||
// normal fields
|
||||
let records = { |
||||
Name: "Movie-1", |
||||
Notes: "Good", |
||||
Status: "Todo", |
||||
Tags: "Jan", |
||||
Phone: "123123123", |
||||
Email: "a@b.com", |
||||
URL: "www.a.com", |
||||
Number: "1", |
||||
Value: "$1.00", |
||||
Percent: "0.01", |
||||
}; |
||||
|
||||
// links/ computed fields
|
||||
let records2 = { |
||||
Duration: "00:01", |
||||
Done: true, |
||||
Date: "2022-05-31", |
||||
Rating: "1", |
||||
Actor: ["Actor1", "Actor2"], |
||||
"Status (from Actor)": ["Todo", "In progress"], |
||||
RollUp: "128", |
||||
Computation: "4.04", |
||||
Producer: ["P1", "P2"], |
||||
}; |
||||
|
||||
let tn = ["Film", "Actor", "Producer"]; |
||||
|
||||
let cn = [ |
||||
"Name", |
||||
"Notes", |
||||
"Status", |
||||
"Tags", |
||||
"Done", |
||||
"Date", |
||||
"Phone", |
||||
"Email", |
||||
"URL", |
||||
"Number", |
||||
"Percent", |
||||
"Duration", |
||||
"Rating", |
||||
"Actor", |
||||
"Status (from Actor)", |
||||
"RollUp", |
||||
"Computation", |
||||
"Producer", |
||||
]; |
||||
|
||||
function openWebhook(index) { |
||||
// http://localhost:8080/api/v1/db/meta/tables/md_dx81kkfdso115u/hooks
|
||||
cy.intercept("GET", "/api/v1/db/meta/tables/*/hooks").as("getHooks"); |
||||
|
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-title-content") |
||||
.contains("Webhooks") |
||||
.click(); |
||||
|
||||
cy.wait("@getHooks"); |
||||
|
||||
cy.get(`.nc-hook:eq(${index})`).should("exist").click(); |
||||
} |
||||
|
||||
// to be invoked after open
|
||||
function verifyWebhook(config) { |
||||
cy.get(".nc-text-field-hook-title").then(($element) => { |
||||
expect($element[0].value).to.have.string(config.title); |
||||
}); |
||||
cy.get(".nc-text-field-hook-event") |
||||
.find(".ant-select-selection-item") |
||||
.contains(config.event) |
||||
.should("exist"); |
||||
cy.get(".nc-select-hook-notification-type") |
||||
.find(".ant-select-selection-item") |
||||
.contains(config.notification) |
||||
.should("exist"); |
||||
cy.get(".nc-select-hook-url-method") |
||||
.find(".ant-select-selection-item") |
||||
.contains(config.type) |
||||
.should("exist"); |
||||
cy.get(".nc-text-field-hook-url-path").then(($element) => { |
||||
expect($element[0].value).to.have.string(config.url); |
||||
}); |
||||
cy.get(".nc-icon-hook-navigate-left").click({ force: true }); |
||||
} |
||||
|
||||
export const genTest = (apiType, dbType, testMode) => { |
||||
let clear; |
||||
|
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
describe(`Quick Tests`, () => { |
||||
let cellIdx = 1; |
||||
let columnCount = cn.length; |
||||
if (testMode === "AT_IMPORT") { |
||||
cellIdx = 3; |
||||
columnCount -= 3; |
||||
} |
||||
|
||||
before(() => { |
||||
if (testMode === "CY_QUICK") { |
||||
// cy.task("copyFile")
|
||||
loginPage.signIn(roles.owner.credentials); |
||||
projectsPage.openProject("sample"); |
||||
|
||||
// kludge: wait for page load to finish
|
||||
cy.wait(2000); |
||||
cy.closeTableTab(); |
||||
} else { |
||||
cy.restoreLocalStorage(); |
||||
} |
||||
|
||||
cy.openTableTab("Film", 3); |
||||
cy.saveLocalStorage(); |
||||
|
||||
clear = Cypress.LocalStorage.clear; |
||||
Cypress.LocalStorage.clear = () => {}; |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}); |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.signOut(); |
||||
cy.saveLocalStorage(); |
||||
|
||||
Cypress.LocalStorage.clear = clear; |
||||
}); |
||||
|
||||
it("Verify Schema", () => { |
||||
// verify if all tables exist
|
||||
for (let i = 0; i < tn.length; i++) { |
||||
cy.get(`.nc-project-tree-tbl-${tn[i]}`).should("exist"); |
||||
} |
||||
|
||||
// for Film table, verify columns
|
||||
for (let i = 0; i < columnCount; i++) { |
||||
cy.get(`th[data-title="${cn[i]}"]`).should("exist"); |
||||
} |
||||
}); |
||||
|
||||
it("Verify Data types", () => { |
||||
// normal cells
|
||||
for (let [key, value] of Object.entries(records)) { |
||||
mainPage.getCell(key, cellIdx).contains(value).should("exist"); |
||||
} |
||||
|
||||
// checkbox
|
||||
mainPage |
||||
.getCell("Done", cellIdx) |
||||
.find(".nc-cell-hover-show") |
||||
.should(records2.Done ? "not.exist" : "exist"); |
||||
|
||||
// date
|
||||
|
||||
// duration
|
||||
mainPage |
||||
.getCell("Duration", cellIdx) |
||||
.contains(records2.Duration) |
||||
.should("exist"); |
||||
|
||||
// rating
|
||||
mainPage |
||||
.getCell("Rating", cellIdx) |
||||
.find(".ant-rate-star-full") |
||||
.should("have.length", records2.Rating); |
||||
|
||||
// verifying only one instance as its different for PG & SQLite
|
||||
// for PG: its Actor1, Actor1
|
||||
// for SQLite: its Actor1, Actor2
|
||||
// LinkToAnotherRecord
|
||||
mainPage.getCell("Actor", cellIdx).scrollIntoView(); |
||||
cy.get(`:nth-child(${cellIdx}) > [data-title="Actor"]`) |
||||
.find(".chip") |
||||
.eq(0) |
||||
.contains(records2.Actor[0]) |
||||
.should("exist"); |
||||
|
||||
// lookup
|
||||
mainPage.getCell("Status (from Actor)", cellIdx).scrollIntoView(); |
||||
cy.get(`:nth-child(${cellIdx}) > [data-title="Status (from Actor)"]`) |
||||
.find(".nc-cell") |
||||
.eq(0) |
||||
.contains(records2["Status (from Actor)"][0]) |
||||
.should("exist"); |
||||
|
||||
// rollup
|
||||
if (testMode === "CY_QUICK") { |
||||
mainPage.getCell("RollUp", cellIdx).scrollIntoView(); |
||||
mainPage |
||||
.getCell("RollUp", cellIdx) |
||||
.contains(records2.RollUp) |
||||
.should("exist"); |
||||
|
||||
// formula
|
||||
mainPage.getCell("Computation", cellIdx).scrollIntoView(); |
||||
mainPage |
||||
.getCell("Computation", cellIdx) |
||||
.contains(records2.Computation) |
||||
.should("exist"); |
||||
|
||||
// ltar hm relation
|
||||
mainPage.getCell("Producer", cellIdx).scrollIntoView(); |
||||
mainPage |
||||
.getCell("Producer", cellIdx) |
||||
.find(".chip") |
||||
.eq(0) |
||||
.contains(records2.Producer[0]) |
||||
.should("exist"); |
||||
mainPage |
||||
.getCell("Producer", cellIdx) |
||||
.find(".chip") |
||||
.eq(1) |
||||
.contains(records2.Producer[1]) |
||||
.should("exist"); |
||||
} |
||||
}); |
||||
|
||||
it("Verify Views & Shared base", () => { |
||||
cy.get(".nc-form-view-item:visible") |
||||
.should("exist") |
||||
.eq(0) |
||||
.click({ force: true }); |
||||
|
||||
// Header & description should exist
|
||||
// cy.get(".nc-form")
|
||||
// .find('[placeholder="Form Title"]')
|
||||
// .contains("FormTitle")
|
||||
// .should("exist");
|
||||
// cy.get(".nc-form")
|
||||
// .find('[placeholder="Add form description"]')
|
||||
// .contains("FormDescription")
|
||||
// .should("exist");
|
||||
|
||||
cy.get(".nc-form").should("exist"); |
||||
|
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Form Title"]') |
||||
.should("exist") |
||||
.then(($el) => { |
||||
cy.log($el); |
||||
expect($el.val()).to.equal("FormTitle"); |
||||
}); |
||||
cy.get(".nc-form") |
||||
.find('[placeholder="Add form description"]') |
||||
.should("exist") |
||||
.then(($el) => { |
||||
cy.log($el); |
||||
expect($el.val()).to.equal("FormDescription"); |
||||
}); |
||||
|
||||
// modified column name & help text
|
||||
cy.get(".nc-editable") |
||||
.eq(0) |
||||
.find(".name") |
||||
.contains("DisplayName") |
||||
.should("exist"); |
||||
cy.get(".nc-editable") |
||||
.eq(0) |
||||
.find(".text-gray-500") |
||||
.contains("HelpText") |
||||
.should("exist"); |
||||
|
||||
cy.get(".nc-editable") |
||||
.eq(1) |
||||
.find(".name") |
||||
.contains("Email") |
||||
.should("exist"); |
||||
|
||||
// add message
|
||||
cy.get("textarea.nc-form-after-submit-msg").then(($element) => { |
||||
expect($element[0].value).to.have.string( |
||||
"Thank you for submitting the form!" |
||||
); |
||||
}); |
||||
// cy.get(".nc-form > .mx-auto")
|
||||
// .find("textarea").then(($element) => {
|
||||
// expect($element[0].value).to.have.string("Thank you for submitting the form!")
|
||||
// })
|
||||
|
||||
cy.get( |
||||
"button.nc-form-checkbox-submit-another-form.ant-switch-checked" |
||||
).should("exist"); |
||||
cy.get( |
||||
"button.nc-form-checkbox-show-blank-form.ant-switch-checked" |
||||
).should("exist"); |
||||
cy.get("button.nc-form-checkbox-send-email.ant-switch-checked").should( |
||||
"not.exist" |
||||
); |
||||
|
||||
// // submit another form button
|
||||
// cy.get(".nc-form > .mx-auto")
|
||||
// .find('[type="checkbox"]')
|
||||
// .eq(0)
|
||||
// .should('be.checked')
|
||||
// // "New form after 5 seconds" button
|
||||
// cy.get(".nc-form > .mx-auto")
|
||||
// .find('[type="checkbox"]')
|
||||
// .eq(1)
|
||||
// .should('be.checked')
|
||||
// // email me
|
||||
// cy.get(".nc-form > .mx-auto")
|
||||
// .find('[type="checkbox"]')
|
||||
// .eq(2)
|
||||
// .should('not.be.checked')
|
||||
|
||||
cy.closeTableTab("Film"); |
||||
}); |
||||
|
||||
it("Verify Webhooks", () => { |
||||
if (testMode === "CY_QUICK") { |
||||
cy.openTableTab("Actor", 25); |
||||
openWebhook(0); |
||||
verifyWebhook({ |
||||
title: "Webhook-1", |
||||
event: "After Insert", |
||||
notification: "URL", |
||||
type: "POST", |
||||
url: "http://localhost:9090/hook", |
||||
condition: false, |
||||
}); |
||||
cy.get("body").type("{esc}"); |
||||
|
||||
openWebhook(1); |
||||
verifyWebhook({ |
||||
title: "Webhook-2", |
||||
event: "After Update", |
||||
notification: "URL", |
||||
type: "POST", |
||||
url: "http://localhost:9090/hook", |
||||
condition: false, |
||||
}); |
||||
cy.get("body").type("{esc}"); |
||||
|
||||
openWebhook(2); |
||||
verifyWebhook({ |
||||
title: "Webhook-3", |
||||
event: "After Delete", |
||||
notification: "URL", |
||||
type: "POST", |
||||
url: "http://localhost:9090/hook", |
||||
condition: false, |
||||
}); |
||||
cy.get("body").type("{esc}"); |
||||
|
||||
cy.closeTableTab("Actor"); |
||||
} |
||||
}); |
||||
|
||||
it("Pagination", () => { |
||||
cy.openTableTab("Actor", 25); |
||||
|
||||
cy.get(".nc-pagination").should("exist"); |
||||
|
||||
// verify > pagination option
|
||||
mainPage.getPagination(">").click(); |
||||
mainPage |
||||
.getPagination(2) |
||||
.should("have.class", "ant-pagination-item-active"); |
||||
|
||||
// verify < pagination option
|
||||
mainPage.getPagination("<").click(); |
||||
mainPage |
||||
.getPagination(1) |
||||
.should("have.class", "ant-pagination-item-active"); |
||||
|
||||
cy.closeTableTab("Actor"); |
||||
}); |
||||
|
||||
it("Verify Fields, Filter & Sort", () => { |
||||
cy.openTableTab("Actor", 25); |
||||
|
||||
cy.get(".nc-grid-view-item").eq(1).click(); |
||||
|
||||
cy.wait(3000); |
||||
|
||||
cy.get(".nc-grid-header") |
||||
.find(`th[data-title="Name"]`) |
||||
.should("be.visible"); |
||||
cy.get(".nc-grid-header") |
||||
.find(`th[data-title="Notes"]`) |
||||
.should("be.visible"); |
||||
cy.get(".nc-grid-header") |
||||
.find(`th[data-title="Attachments"]`) |
||||
.should("not.exist"); |
||||
cy.get(".nc-grid-header") |
||||
.find(`th[data-title="Status"]`) |
||||
.should("be.visible"); |
||||
cy.get(".nc-grid-header") |
||||
.find(`th[data-title="Film"]`) |
||||
.should("be.visible"); |
||||
|
||||
cy.wait(2000); |
||||
cy.get(".nc-fields-menu-btn").click(); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(`[type="checkbox"]`) |
||||
.eq(0) |
||||
.should("be.checked"); |
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(`[type="checkbox"]`) |
||||
.eq(1) |
||||
.should("be.checked"); |
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(`[type="checkbox"]`) |
||||
.eq(2) |
||||
.should("not.be.checked"); |
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(`[type="checkbox"]`) |
||||
.eq(3) |
||||
.should("be.checked"); |
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(`[type="checkbox"]`) |
||||
.eq(4) |
||||
.should("be.checked"); |
||||
cy.get(".nc-fields-menu-btn").click(); |
||||
|
||||
cy.get(".nc-sort-menu-btn").click(); |
||||
cy.get(".nc-sort-field-select").eq(0).contains("Name").should("exist"); |
||||
cy.get(".nc-sort-dir-select").eq(0).contains("A → Z").should("exist"); |
||||
cy.get(".nc-sort-menu-btn").click(); |
||||
|
||||
cy.get(".nc-filter-menu-btn").click(); |
||||
cy.get(".nc-filter-field-select").eq(0).contains("Name").should("exist"); |
||||
cy.get(".nc-filter-operation-select") |
||||
.eq(0) |
||||
.contains("is like") |
||||
.should("exist"); |
||||
|
||||
cy.get(".nc-filter-field-select").eq(1).contains("Name").should("exist"); |
||||
cy.get(".nc-filter-operation-select") |
||||
.eq(1) |
||||
.contains("is like") |
||||
.should("exist"); |
||||
cy.get(".nc-filter-menu-btn").click(); |
||||
|
||||
cy.closeTableTab("Actor"); |
||||
}); |
||||
|
||||
it("Views, bt relation", () => { |
||||
if (testMode === "CY_QUICK") { |
||||
cy.openTableTab("Producer", 3); |
||||
|
||||
cy.get(".nc-grid-view-item").should("have.length", 4); |
||||
cy.get(".nc-form-view-item").should("have.length", 4); |
||||
cy.get(".nc-gallery-view-item").should("have.length", 3); |
||||
|
||||
// LinkToAnotherRecord hm relation
|
||||
mainPage.getCell("FilmRead", 1).scrollIntoView(); |
||||
cy.get( |
||||
'[data-title="FilmRead"] > .h-full > .nc-virtual-cell > .w-full > .chips > .chip > .name' |
||||
) |
||||
// cy.get(
|
||||
// ':nth-child(1) > [data-col="FilmRead"] > .nc-virtual-cell > .v-lazy > .d-100 > .chips > :nth-child(1) > .v-chip__content > .name'
|
||||
// )
|
||||
.contains("Movie-1") |
||||
.should("exist"); |
||||
|
||||
cy.closeTableTab("Producer"); |
||||
} |
||||
}); |
||||
|
||||
it.skip("Delete Project", () => { |
||||
if (testMode === "AT_IMPORT") { |
||||
mainPage.toolBarTopLeft(mainPage.HOME).click({ force: true }); |
||||
cy.get(`.mdi-delete-outline`, { |
||||
timeout: 10000, |
||||
}) |
||||
.should("exist") |
||||
.last() |
||||
.click(); |
||||
|
||||
cy.getActiveModal(".nc-modal-project-delete") |
||||
.find("button") |
||||
.contains("Submit") |
||||
.should("exist") |
||||
.click(); |
||||
cy.toastWait("deleted successfully"); |
||||
} |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
// genTest("rest", "xcdb");
|
||||
|
||||
|
@ -1,574 +0,0 @@
|
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage"; |
||||
import {loginPage} from "../../support/page_objects/navigation"; |
||||
import { isTestSuiteActive, mysqlSakilaSqlViews, mysqlSakilaTables, pgSakilaSqlViews, pgSakilaTables, sqliteSakilaSqlViews } from "../../support/page_objects/projectConstants"; |
||||
|
||||
import {getProjectString} from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
if (!isTestSuiteActive(apiType, dbType)) return; |
||||
|
||||
let projectId; |
||||
let sakilaTables, sakilaSqlViews; |
||||
|
||||
|
||||
describe(`${apiType.toUpperCase()} ERD`, () => { |
||||
before(() => { |
||||
cy.restoreLocalStorage(); |
||||
|
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
|
||||
cy.openTableTab("Country", 25); |
||||
projectId = getProjectString() |
||||
cy.log('erd:getProjectString' + projectId) |
||||
if (dbType === "postgres") { |
||||
sakilaTables = pgSakilaTables; |
||||
sakilaSqlViews = pgSakilaSqlViews; |
||||
} else if(dbType === "mysql") { |
||||
sakilaTables = mysqlSakilaTables; |
||||
sakilaSqlViews = mysqlSakilaSqlViews; |
||||
} else if(dbType === "xcdb") { |
||||
sakilaTables = mysqlSakilaTables.map((tableName) => `${projectId}${tableName}`); |
||||
sakilaSqlViews = sqliteSakilaSqlViews.map((viewName) => `${projectId}${viewName}`); |
||||
} |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
beforeEach(() => { |
||||
cy.restoreLocalStorage(); |
||||
}) |
||||
|
||||
afterEach(() => { |
||||
cy.saveLocalStorage(); |
||||
}) |
||||
|
||||
after(() => { |
||||
cy.restoreLocalStorage(); |
||||
cy.closeTableTab("Country"); |
||||
cy.saveLocalStorage(); |
||||
}); |
||||
|
||||
// Test cases
|
||||
|
||||
it(`Enable MM setting Open Table ERD`, () => { |
||||
// cy.openTableTab("Country", 25);
|
||||
mainPage.toggleShowMMSetting(); |
||||
|
||||
mainPage.openErdTab(); |
||||
mainPage.closeMetaTab(); |
||||
}); |
||||
|
||||
it(`Verify ERD Context menu in all table view`, () => { |
||||
mainPage.openErdTab(); |
||||
cy.wait(2000) |
||||
// todo: Edges are not rendering properly in cypress in first render
|
||||
settingsPage.openTab(settingsPage.UI_ACCESS_CONTROL) |
||||
settingsPage.openTab(settingsPage.ERD) |
||||
|
||||
cy.get('.nc-erd-context-menu').should('be.visible'); |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-histogram').should('be.visible'); |
||||
cy.get('.nc-erd-context-menu').find('.ant-checkbox').should('have.length', 3); |
||||
cy.get('.nc-erd-context-menu').find('.ant-checkbox').eq(0).should('have.class', 'ant-checkbox-checked'); |
||||
cy.get('.nc-erd-context-menu').find('.ant-checkbox').eq(1).should('have.class', 'ant-checkbox-checked'); |
||||
cy.get('.nc-erd-context-menu').find('.ant-checkbox').eq(2).should('not.have.class', 'ant-checkbox-checked'); |
||||
|
||||
cy.get('.nc-erd-context-menu').find('.nc-erd-showColumns-label').dblclick(); |
||||
cy.get('.nc-erd-context-menu').find('.ant-checkbox').should('have.length', 5); |
||||
|
||||
// todo: Enabling and disabling showJunctionTableNames rerenders `mm` edges since `mm` edges is not getting rendered in cypress
|
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showJunctionTableNames-checkbox').click(); |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showJunctionTableNames-checkbox').click(); |
||||
}); |
||||
|
||||
it("Verify ERD of all tables view and verify columns of actor and payment with default config", () => { |
||||
if(dbType === "mysql") { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 12) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 14) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 11) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 17) |
||||
} else if (dbType === "postgres") { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 17) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 32) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 29) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 35) |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 12) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 14) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 11) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 17) |
||||
} |
||||
|
||||
for(const tableName of sakilaTables) { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${tableName}`).should('exist'); |
||||
} |
||||
|
||||
// Actor table
|
||||
[ |
||||
'actor_id', |
||||
'first_name', |
||||
'last_name', |
||||
'last_update', |
||||
'film_list' |
||||
].forEach((colTitle) => { |
||||
if (dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}actor`).find(`.nc-erd-table-node-${projectId}actor-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-actor`).find(`.nc-erd-table-node-actor-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
|
||||
// Payment table
|
||||
if(dbType === "mysql") { |
||||
[ |
||||
'payment_id', |
||||
'customer_id', |
||||
'staff_id', |
||||
'rental_id', |
||||
'amount', |
||||
'payment_date', |
||||
'last_update', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
] |
||||
.forEach((colTitle) => { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-payment`).find(`.nc-erd-table-node-payment-column-${colTitle}`).should('exist'); |
||||
}); |
||||
} else if(dbType === "postgres") { |
||||
[ |
||||
'payment_id', |
||||
'customer_id', |
||||
'staff_id', |
||||
'rental_id', |
||||
'amount', |
||||
'payment_date', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
] |
||||
.forEach((colTitle) => { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-payment`).find(`.nc-erd-table-node-payment-column-${colTitle}`).should('exist'); |
||||
}); |
||||
} else { |
||||
[ |
||||
'payment_id', |
||||
'customer_id', |
||||
'staff_id', |
||||
'rental_id', |
||||
'amount', |
||||
'payment_date', |
||||
'last_update', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
] |
||||
.forEach((colTitle) => { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}payment`).find(`.nc-erd-table-node-${projectId}payment-column-${colTitle}`).should('exist'); |
||||
}); |
||||
} |
||||
}); |
||||
|
||||
it("Verify ERD of all tables view and verify columns of actor and payment with default config with showAllColumn disabled", () => { |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showColumns-checkbox').click(); |
||||
cy.get('.nc-erd-showPkAndFk-checkbox-disabled').should('exist'); |
||||
cy.get('.nc-erd-showPkAndFk-checkbox-unchecked').should('exist'); |
||||
|
||||
// Actor table
|
||||
[ |
||||
'film_list' |
||||
].forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}actor`).find(`.nc-erd-table-node-${projectId}actor-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-actor`).find(`.nc-erd-table-node-actor-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
|
||||
// Payment table
|
||||
[ |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
].forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}payment`).find(`.nc-erd-table-node-${projectId}payment-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-payment`).find(`.nc-erd-table-node-payment-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
it("Verify ERD of all tables view and verify columns of actor and payment with default config with showPkAndFk disabled", () => { |
||||
// enable showAllColumn
|
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showColumns-checkbox').click(); |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showPkAndFk-checkbox').click(); |
||||
|
||||
// Actor table
|
||||
[ |
||||
'last_name', |
||||
'last_update', |
||||
'film_list' |
||||
].forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}actor`).find(`.nc-erd-table-node-${projectId}actor-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-actor`).find(`.nc-erd-table-node-actor-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
|
||||
// Payment table
|
||||
if(dbType === "mysql") { |
||||
[ |
||||
'amount', |
||||
'payment_date', |
||||
'last_update', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
].forEach((colTitle) => { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-payment`).find(`.nc-erd-table-node-payment-column-${colTitle}`).should('exist'); |
||||
}); |
||||
} else if(dbType === "postgres") { |
||||
[ |
||||
'amount', |
||||
'payment_date', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
].forEach((colTitle) => { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-payment`).find(`.nc-erd-table-node-payment-column-${colTitle}`).should('exist'); |
||||
}); |
||||
} else { |
||||
[ |
||||
'amount', |
||||
'payment_date', |
||||
'last_update', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
].forEach((colTitle) => { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}payment`).find(`.nc-erd-table-node-${projectId}payment-column-${colTitle}`).should('exist'); |
||||
}); |
||||
} |
||||
}); |
||||
|
||||
it("Verify ERD of all tables view with sql grid on and verify columns of ActorInfo", () => { |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showViews-checkbox').click(); |
||||
|
||||
if(dbType === "mysql") { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 19) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 14) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 11) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 17) |
||||
} else if(dbType === "postgres") { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 24) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 32) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 29) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 35) |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 19) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 14) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 11) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 17) |
||||
} |
||||
|
||||
for(const tableName of sakilaTables) { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${tableName}`).should('exist'); |
||||
} |
||||
|
||||
for(const tableName of sakilaSqlViews) { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${tableName}`).should('exist'); |
||||
} |
||||
|
||||
// ActorInfo SQL View
|
||||
let actorInfoColumns; |
||||
if(dbType === "xcdb") { |
||||
actorInfoColumns = [ |
||||
'ID', |
||||
'name', |
||||
'address', |
||||
'zip_code', |
||||
'phone', |
||||
'city', |
||||
'country', |
||||
'SID', |
||||
]; |
||||
} else { |
||||
actorInfoColumns = [ |
||||
'actor_id', |
||||
'first_name', |
||||
'last_name', |
||||
'film_info' |
||||
]; |
||||
} |
||||
actorInfoColumns.forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}actor_info`).find(`.nc-erd-table-node-${projectId}actor_info-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-actor_info`).find(`.nc-erd-table-node-actor_info-column-${colTitle}`).should('exist'); |
||||
} |
||||
}) |
||||
|
||||
}); |
||||
|
||||
it("Verify show MM tables", () => { |
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}store`).should('not.exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-store`).should('not.exist'); |
||||
} |
||||
// disable showViews
|
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showViews-checkbox').click(); |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showMMTables-checkbox').click(); |
||||
|
||||
// Enabling and disabling showJunctionTableNames rerenders `mm` edges since `mm` edges is not getting rendered in cypress
|
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showJunctionTableNames-checkbox').click(); |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showJunctionTableNames-checkbox').click(); |
||||
|
||||
if(dbType === "mysql") { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 16) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 26) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 22) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 30) |
||||
} else if(dbType === "postgres") { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 21) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 44) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 40) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 48) |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-table-node').should('have.length', 16) |
||||
cy.get('.nc-erd-vue-flow').find('.vue-flow__edge').should('have.length', 26) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-circle').should('have.length', 22) |
||||
cy.get('.nc-erd-vue-flow').find('.nc-erd-edge-rect').should('have.length', 30) |
||||
} |
||||
|
||||
// Check if store table is present
|
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-${projectId}store`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').find(`.nc-erd-table-node-store`).should('exist'); |
||||
} |
||||
}) |
||||
|
||||
it("Verify show junction table names", () => { |
||||
// disable showViews
|
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showJunctionTableNames-checkbox').click(); |
||||
|
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow').get(`.nc-erd-table-label-filmactor-${projectId}film_actor`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow').get('.nc-erd-table-label-filmactor-film_actor').should('exist'); |
||||
} |
||||
mainPage.closeMetaTab(); |
||||
}) |
||||
|
||||
it('Verify table ERD view of country', () => { |
||||
mainPage.openTableErdView(); |
||||
|
||||
cy.get('.nc-erd-vue-flow-single-table').find('.nc-erd-table-node').should('have.length', 2) |
||||
cy.get('.nc-erd-vue-flow-single-table').find('.vue-flow__edge').should('have.length', 1) |
||||
cy.get('.nc-erd-vue-flow-single-table').find('.nc-erd-edge-circle').should('have.length', 1) |
||||
cy.get('.nc-erd-vue-flow-single-table').find('.nc-erd-edge-rect').should('have.length', 1) |
||||
|
||||
const countryColumns = [ |
||||
'country_id', |
||||
'country', |
||||
'last_update', |
||||
'city_list' |
||||
] |
||||
|
||||
// Country table
|
||||
countryColumns.forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow-single-table').find(`.nc-erd-table-node-${projectId}country`).find(`.nc-erd-table-node-${projectId}country-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow-single-table').find(`.nc-erd-table-node-country`).find(`.nc-erd-table-node-country-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
|
||||
const cityColumns = [ |
||||
'city_id', |
||||
'city', |
||||
'last_update', |
||||
'country', |
||||
'address_list' |
||||
] |
||||
|
||||
// City table
|
||||
cityColumns.forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get('.nc-erd-vue-flow-single-table').find(`.nc-erd-table-node-${projectId}city`).find(`.nc-erd-table-node-${projectId}city-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-vue-flow-single-table').find(`.nc-erd-table-node-city`).find(`.nc-erd-table-node-city-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
}) |
||||
|
||||
it('Verify table ERD view of country showAllColumn disabled', () => { |
||||
cy.get('.nc-erd-vue-flow-single-table').within(() => { |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showColumns-checkbox').click(); |
||||
cy.get('.nc-erd-showPkAndFk-checkbox-disabled').should('exist'); |
||||
cy.get('.nc-erd-showPkAndFk-checkbox-unchecked').should('exist'); |
||||
|
||||
const countryColumns = [ |
||||
'city_list' |
||||
] |
||||
|
||||
// Country table
|
||||
countryColumns.forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}country`).find(`.nc-erd-table-node-${projectId}country-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get(`.nc-erd-table-node-country`).find(`.nc-erd-table-node-country-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
|
||||
const cityColumns = [ |
||||
'country', |
||||
'address_list' |
||||
] |
||||
|
||||
// City table
|
||||
cityColumns.forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}city`).find(`.nc-erd-table-node-${projectId}city-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get(`.nc-erd-table-node-city`).find(`.nc-erd-table-node-city-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
|
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showColumns-checkbox').click(); |
||||
}) |
||||
}) |
||||
|
||||
it('Verify table ERD view of country show PK AND FK disabled', () => { |
||||
cy.get('.nc-erd-vue-flow-single-table').within(() => { |
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showPkAndFk-checkbox').click(); |
||||
|
||||
const countryColumns = [ |
||||
'country', |
||||
'last_update', |
||||
'city_list' |
||||
] |
||||
|
||||
// Country table
|
||||
countryColumns.forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}country`).find(`.nc-erd-table-node-${projectId}country-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get(`.nc-erd-table-node-country`).find(`.nc-erd-table-node-country-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
|
||||
const cityColumns = [ |
||||
'city', |
||||
'last_update', |
||||
'country', |
||||
'address_list' |
||||
] |
||||
|
||||
// City table
|
||||
cityColumns.forEach((colTitle) => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}city`).find(`.nc-erd-table-node-${projectId}city-column-${colTitle}`).should('exist'); |
||||
} else { |
||||
cy.get(`.nc-erd-table-node-city`).find(`.nc-erd-table-node-city-column-${colTitle}`).should('exist'); |
||||
} |
||||
}); |
||||
|
||||
cy.get('.nc-erd-context-menu').get('.nc-erd-showPkAndFk-checkbox').click(); |
||||
|
||||
}) |
||||
cy.getActiveModal().find('.nc-modal-close').click({ force: true }); |
||||
}) |
||||
|
||||
it('create column and check if the change is in the schema', () => { |
||||
mainPage.addColumn('test_column', 'country') |
||||
|
||||
// table view
|
||||
mainPage.openTableErdView(); |
||||
cy.get('.nc-erd-vue-flow-single-table').within(() => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}country`).find(`.nc-erd-table-node-${projectId}country-column-test_column`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-table-node-country').find('.nc-erd-table-node-country-column-test_column').should('exist'); |
||||
} |
||||
}) |
||||
cy.getActiveModal().find('.nc-modal-close').click({ force: true }); |
||||
|
||||
// All table view
|
||||
mainPage.openErdTab(); |
||||
cy.get('.nc-erd-vue-flow').within(() => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}country`).find(`.nc-erd-table-node-${projectId}country-column-test_column`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-table-node-country').find('.nc-erd-table-node-country-column-test_column').should('exist'); |
||||
} |
||||
}) |
||||
mainPage.closeMetaTab(); |
||||
|
||||
|
||||
mainPage.deleteColumn('test_column') |
||||
|
||||
// table view
|
||||
mainPage.openTableErdView(); |
||||
cy.get('.nc-erd-vue-flow-single-table').within(() => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}country`).find(`.nc-erd-table-node-${projectId}country-column-test_column`).should('not.exist'); |
||||
} else { |
||||
cy.get('.nc-erd-table-node-country').find('.nc-erd-table-node-country-column-test_column').should('not.exist'); |
||||
} |
||||
}) |
||||
cy.getActiveModal().find('.nc-modal-close').click({ force: true }); |
||||
|
||||
// All table view
|
||||
mainPage.openErdTab(); |
||||
cy.get('.nc-erd-vue-flow').within(() => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}country`).find(`.nc-erd-table-node-${projectId}country-column-test_column`).should('not.exist'); |
||||
} else { |
||||
cy.get('.nc-erd-table-node-country').find('.nc-erd-table-node-country-column-test_column').should('not.exist'); |
||||
} |
||||
}) |
||||
mainPage.closeMetaTab(); |
||||
}) |
||||
|
||||
it('Create table should reflected in ERD', () => { |
||||
cy.createTable('new') |
||||
|
||||
mainPage.openErdTab(); |
||||
cy.get('.nc-erd-vue-flow').within(() => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}new`).should('exist'); |
||||
} else { |
||||
cy.get('.nc-erd-table-node-new').should('exist'); |
||||
} |
||||
}) |
||||
mainPage.closeMetaTab(); |
||||
|
||||
cy.deleteTable('new') |
||||
|
||||
mainPage.openErdTab(); |
||||
cy.get('.nc-erd-vue-flow').within(() => { |
||||
if(dbType === "xcdb") { |
||||
cy.get(`.nc-erd-table-node-${projectId}new`).should('not.exist'); |
||||
} else { |
||||
cy.get('.nc-erd-table-node-new').should('not.exist'); |
||||
} |
||||
}) |
||||
mainPage.closeMetaTab(); |
||||
}) |
||||
|
||||
it(`Disable MM setting Open Table ERD and check easter egg should not work`, () => { |
||||
mainPage.toggleShowMMSetting(); |
||||
|
||||
mainPage.openErdTab(); |
||||
cy.get('.nc-erd-vue-flow').within(() => { |
||||
cy.get('.nc-erd-context-menu').find('.nc-erd-showColumns-label').dblclick(); |
||||
cy.get('.nc-erd-context-menu').find('.ant-checkbox').should('have.length', 3); |
||||
}) |
||||
|
||||
mainPage.closeMetaTab(); |
||||
}); |
||||
}); |
||||
}; |
||||
|
@ -1,339 +0,0 @@
|
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage"; |
||||
import { roles } from "../../support/page_objects/projectConstants"; |
||||
|
||||
// Left hand navigation bar, validation for
|
||||
// 1. Audit menu
|
||||
// 2. Advance settings menu
|
||||
// 3. Preview mode menu
|
||||
//
|
||||
export function _advSettings(roleType, mode) { |
||||
cy.log(roleType, mode); |
||||
|
||||
if (mode === "baseShare") { |
||||
// open modal
|
||||
cy.get(".nc-project-menu").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-project-menu") |
||||
.find(`[data-menu-id="language"]`) |
||||
.should("exist"); |
||||
|
||||
// click again to close modal
|
||||
cy.get(".nc-project-menu").should("exist").click(); |
||||
return; |
||||
} |
||||
|
||||
let validationString = |
||||
true == roles[roleType].validations.advSettings ? "exist" : "not.exist"; |
||||
|
||||
// cy.get(".nc-team-settings").should(validationString);
|
||||
cy.get(".nc-project-menu").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-project-menu") |
||||
.find(`[data-menu-id="preview-as"]`) |
||||
.should(validationString); |
||||
cy.getActiveMenu(".nc-dropdown-project-menu") |
||||
.find(`[data-menu-id="teamAndSettings"]:visible`) |
||||
.should(validationString); |
||||
|
||||
if (true === roles[roleType].validations.advSettings) { |
||||
cy.getActiveMenu(".nc-dropdown-project-menu") |
||||
.find(`[data-menu-id="teamAndSettings"]:visible`) |
||||
.should(validationString) |
||||
.click(); |
||||
|
||||
cy.get(`[data-menu-id="teamAndAuth"]`).should("exist"); |
||||
if (roleType === "owner") |
||||
cy.get(`[data-menu-id="appStore"]`).should("exist"); |
||||
cy.get(`[data-menu-id="projMetaData"]`).should("exist"); |
||||
cy.get(`[data-menu-id="audit"]`).should("exist"); |
||||
|
||||
settingsPage.closeMenu(); |
||||
} else { |
||||
cy.get(".nc-project-menu").should("exist").click(); |
||||
} |
||||
|
||||
// float menu in preview mode
|
||||
if ("preview" === mode) { |
||||
cy.get(".nc-floating-preview-btn").should("exist"); |
||||
cy.get(".nc-floating-preview-btn") |
||||
.find(`[type="radio"][value="${roles[roleType].name}"]`) |
||||
.should("be.checked"); |
||||
} |
||||
|
||||
// cy.get("body").click("bottomRight");
|
||||
} |
||||
|
||||
export function _editSchema(roleType, mode) { |
||||
let columnName = "City"; |
||||
let validationString = |
||||
true === roles[roleType].validations.editSchema ? "exist" : "not.exist"; |
||||
|
||||
cy.openTableTab(columnName, 25); |
||||
|
||||
// create table
|
||||
cy.get(`.nc-add-new-table`).should(validationString); |
||||
|
||||
// delete table option
|
||||
cy.get(`.nc-project-tree-tbl-City`).should("exist").rightclick(); |
||||
cy.get(".ant-dropdown-content:visible").should(validationString); |
||||
|
||||
if (validationString === "exist") { |
||||
cy.getActiveMenu(".nc-dropdown-tree-view-context-menu") |
||||
.find('[role="menuitem"]') |
||||
.contains("Delete") |
||||
.should("exist"); |
||||
cy.getActiveMenu(".nc-dropdown-tree-view-context-menu") |
||||
.find('[role="menuitem"]') |
||||
.contains("Rename") |
||||
.should("exist"); |
||||
|
||||
// click on a cell to close table context menu
|
||||
mainPage.getCell(columnName, 3).click(); |
||||
} |
||||
|
||||
// add new column option
|
||||
//
|
||||
cy.get(".nc-column-add").should(validationString); |
||||
|
||||
// update column (edit/ delete menu)
|
||||
cy.get(".nc-ui-dt-dropdown").should(validationString); |
||||
|
||||
if (validationString === "exist") { |
||||
cy.get(".nc-import-menu").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-import-menu").should("exist"); |
||||
cy.getActiveMenu(".nc-dropdown-import-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Airtable"); |
||||
cy.getActiveMenu(".nc-dropdown-import-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("CSV file"); |
||||
cy.getActiveMenu(".nc-dropdown-import-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("JSON file"); |
||||
cy.getActiveMenu(".nc-dropdown-import-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Microsoft Excel"); |
||||
} |
||||
} |
||||
|
||||
export function _editData(roleType, mode) { |
||||
let columnName = "City"; |
||||
let validationString = |
||||
true === roles[roleType].validations.editData ? "exist" : "not.exist"; |
||||
|
||||
cy.openTableTab(columnName, 25); |
||||
|
||||
// add row button
|
||||
cy.get(".nc-add-new-row-btn:visible").should(validationString); |
||||
|
||||
// add button at bottom of page
|
||||
mainPage.getCell(columnName, 25).scrollIntoView(); |
||||
cy.get(".nc-grid-add-new-cell:visible").should(validationString); |
||||
|
||||
// update row option (right click)
|
||||
//
|
||||
mainPage.getCell("City", 5).rightclick(); |
||||
cy.wait(100); |
||||
cy.get(".ant-dropdown-content:visible").should(validationString); |
||||
|
||||
if (validationString === "exist") { |
||||
// right click options will exist (only for 'exist' case)
|
||||
//
|
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Insert New Row") |
||||
.should(validationString); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Clear cell") |
||||
.should(validationString); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Delete Row") |
||||
.should(validationString); |
||||
cy.getActiveMenu(".nc-dropdown-grid-context-menu") |
||||
.contains("Delete Selected Rows") |
||||
.should(validationString); |
||||
|
||||
// cy.get("body").type("{esc}");
|
||||
mainPage.getCell("City", 13).click(); |
||||
|
||||
// update cell contents option using row expander should be enabled
|
||||
//
|
||||
mainPage |
||||
.getRow(1) |
||||
.find(".nc-row-no") |
||||
.should("exist") |
||||
.eq(0) |
||||
.trigger("mouseover", { force: true }); |
||||
cy.get(".nc-row-expand").should("exist").eq(10).click({ force: true }); |
||||
|
||||
// wait for page render to complete
|
||||
cy.get('button:contains("Save row"):visible').should("exist"); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Save row") |
||||
.should("exist"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Cancel") |
||||
.should("exist") |
||||
.click(); |
||||
} else { |
||||
// update cell contents option using row expander should be disabled
|
||||
//
|
||||
cy.get(".nc-row-expand").should("exist").eq(10).click({ force: true }); |
||||
|
||||
// wait for page render to complete
|
||||
cy.get('button:contains("Save row"):visible').should("exist"); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button:disabled") |
||||
.contains("Save row") |
||||
.should("exist"); |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Cancel") |
||||
.should("exist") |
||||
.click(); |
||||
} |
||||
|
||||
// double click cell entries to edit
|
||||
//
|
||||
mainPage.getCell("City", 5).dblclick().find("input").should(validationString); |
||||
} |
||||
|
||||
// read &/ update comment
|
||||
// Viewer: only allowed to read
|
||||
// Everyone else: read &/ update
|
||||
//
|
||||
export function _editComment(roleType, mode) { |
||||
let columnName = "City"; |
||||
let validationString = |
||||
true === roles[roleType].validations.editComment |
||||
? "Comment added successfully" |
||||
: "Not allowed"; |
||||
|
||||
cy.openTableTab(columnName, 25); |
||||
|
||||
// click on comment icon & type comment
|
||||
//
|
||||
cy.get(".nc-row-expand").should("exist").eq(10).click({ force: true }); |
||||
|
||||
// Expected response:
|
||||
// Viewer: Not able to see comment option
|
||||
// Everyone else: Comment added/read successfully
|
||||
//
|
||||
|
||||
if ("viewer" === roleType) { |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.should("exist") |
||||
.find(".nc-toggle-comments") |
||||
.should("not.exist"); |
||||
} else { |
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.should("exist") |
||||
.find(".nc-toggle-comments") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".nc-comment-box") |
||||
.should("exist") |
||||
.type("Comment-1{enter}"); |
||||
// cy.toastWait('Comment added successfully')
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find(".nc-toggle-comments") |
||||
.click(); |
||||
} |
||||
|
||||
cy.getActiveDrawer(".nc-drawer-expanded-form") |
||||
.find("button") |
||||
.contains("Cancel") |
||||
.should("exist") |
||||
.click(); |
||||
} |
||||
|
||||
// right navigation menu bar
|
||||
// Editor/Viewer/Commenter : can only view 'existing' views
|
||||
// Rest: can create/edit
|
||||
export function _viewMenu(roleType, mode) { |
||||
let columnName = "City"; |
||||
|
||||
// Lock, Download, Upload
|
||||
let menuWithSubmenuCount = 3; |
||||
|
||||
// share view list, webhook, api snippet, erd
|
||||
let menuWithoutSubmenuCount = 4; |
||||
|
||||
cy.openTableTab(columnName, 25); |
||||
|
||||
let validationString = |
||||
true === roles[roleType].validations.shareView ? "exist" : "not.exist"; |
||||
|
||||
if (roleType === "editor") { |
||||
// Download / Upload CSV
|
||||
menuWithSubmenuCount = 2; |
||||
// Get API Snippet and ERD
|
||||
menuWithoutSubmenuCount = 2; |
||||
// ERD
|
||||
if (mode === "baseShare") menuWithoutSubmenuCount = 1; |
||||
} else if (roleType === "commenter" || roleType === "viewer") { |
||||
// Download CSV & Download excel
|
||||
menuWithSubmenuCount = 0; |
||||
// Get API Snippet and ERD
|
||||
menuWithoutSubmenuCount = 2; |
||||
} |
||||
|
||||
// view list field (default GRID view)
|
||||
cy.get(`.nc-view-item`).should("exist"); |
||||
|
||||
// view create option, exists only for owner/ creator
|
||||
cy.get(`.nc-create-grid-view`).should(validationString); |
||||
cy.get(`.nc-create-gallery-view`).should(validationString); |
||||
cy.get(`.nc-create-form-view`).should(validationString); |
||||
|
||||
// share view permissions are role specific
|
||||
|
||||
// actions menu (more), only download csv should be visible for non-previlaged users
|
||||
cy.get(".nc-actions-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-submenu:visible") |
||||
.should("have.length", menuWithSubmenuCount); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-item:visible") |
||||
.should("have.length", menuWithoutSubmenuCount); |
||||
// click again to close menu
|
||||
cy.get(".nc-actions-menu-btn").click(); |
||||
} |
||||
|
||||
export function _topRightMenu(roleType, mode) { |
||||
// kludge; download csv menu persists until clicked
|
||||
let columnName = "City"; |
||||
// cy.closeTableTab(columnName);
|
||||
// cy.openTableTab(columnName, 25);
|
||||
|
||||
let validationString = |
||||
true == roles[roleType].validations.shareView ? "exist" : "not.exist"; |
||||
|
||||
cy.get(`.nc-share-base`).should(validationString); |
||||
cy.get(".nc-menu-translate").should("exist"); |
||||
cy.get(".nc-menu-accounts").should("exist"); |
||||
} |
||||
|
||||
// Access control list
|
||||
//
|
||||
export function disableTableAccess(tbl, role) { |
||||
const cls = `.nc-acl-${tbl}-${role}-chkbox`; |
||||
cy.get(cls).find("input").should("be.checked").click({ force: true }); |
||||
cy.get(cls).find("input").should("not.be.checked"); |
||||
} |
||||
|
||||
export function enableTableAccess(tbl, role) { |
||||
const cls = `.nc-acl-${tbl}-${role}-chkbox`; |
||||
cy.get(cls).find("input").should("not.be.checked").click({ force: true }); |
||||
cy.get(cls).find("input").should("be.checked"); |
||||
} |
||||
|
||||
export function _accessControl(roleType, previewMode) { |
||||
let validationString = roleType === "creator" ? "exist" : "not.exist"; |
||||
|
||||
cy.get(`.nc-project-tree-tbl-Language`).should(validationString); |
||||
cy.get(`.nc-project-tree-tbl-CustomerList`).should(validationString); |
||||
} |
@ -1,18 +0,0 @@
|
||||
let t6d = require("../common/6d_language_validation"); |
||||
|
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
const t01 = require("../common/00_pre_configurations"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
|
||||
// Sakila Ext DB project creation
|
||||
t01.genTest(apiType, dbType); |
||||
|
||||
// i18n
|
||||
t6d.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "mysql"); |
@ -1,35 +0,0 @@
|
||||
import { loginPage } from "../../support/page_objects/navigation"; |
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; |
||||
|
||||
export const genTest = (apiType, dbType) => { |
||||
// if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Login & Open project`, () => { |
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => { |
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
// open a table to work on views
|
||||
// cy.openTableTab('City');
|
||||
}); |
||||
|
||||
it(``, () => { |
||||
cy.log("Test-1"); |
||||
|
||||
let projId = ""; |
||||
let query = `SELECT prefix from nc_projects_v2 where title = "sampleREST"; `; |
||||
cy.task("sqliteExecReturnValue", query) |
||||
.then((resolve) => { |
||||
cy.log(resolve); |
||||
projId = resolve.prefix.split("_")[1]; |
||||
cy.log(projId); |
||||
}) |
||||
.then(() => { |
||||
let query = `ALTER TABLE "actor" RENAME TO "${projId}actor"`; |
||||
cy.task("sqliteExec", query); |
||||
}); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
// genTest("rest", "mysql");
|
@ -1,52 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t6b = require("../common/6b_downloadCsv"); |
||||
let t6c = require("../common/6c_swagger_api"); |
||||
let t6d = require("../common/6d_language_validation"); |
||||
let t6e = require("../common/6e_project_operations"); |
||||
let t6f = require("../common/6f_attachments"); |
||||
let t6g = require("../common/6g_base_share"); |
||||
let t7a = require("../common/7a_create_project_from_excel"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
const t8a = require("../common/8a_webhook"); |
||||
const t9b = require("../common/9b_ERD"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
|
||||
// Sakila Ext DB project creation
|
||||
t01.genTest(apiType, dbType); |
||||
|
||||
// Download CSV
|
||||
t6b.genTest(apiType, dbType); |
||||
|
||||
// i18n: language validation suffice to be done in REST MySQL suite
|
||||
// t6d.genTest(apiType, dbType);
|
||||
|
||||
// Swagger API
|
||||
// exclude@ncv2 t6c.genTest(apiType, dbType);
|
||||
|
||||
// Attachment cell
|
||||
t6f.genTest(apiType, dbType); |
||||
|
||||
// ERD:
|
||||
t9b.genTest(apiType, dbType); |
||||
|
||||
// Webhook tests
|
||||
t8a.genTest(apiType, dbType); |
||||
|
||||
// Base share (viewer, editor), iFrame tests
|
||||
t6g.genTest(apiType, dbType); |
||||
|
||||
// Project operations: Delete
|
||||
t6e.genTest(apiType, dbType); |
||||
|
||||
// Create project from Excel
|
||||
t7a.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "postgres"); |
||||
|
||||
|
@ -1,21 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t5a = require("../common/5a_user_role"); |
||||
let t5b = require("../common/5b_preview_role"); |
||||
let t5c = require("../common/5c_super_user_role"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
t5a.genTest(apiType, dbType); |
||||
t5b.genTest(apiType, dbType); |
||||
t5c.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "postgres"); |
||||
|
||||
|
@ -1,40 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t1a = require("../common/1a_table_operations"); |
||||
let t1b = require("../common/1b_table_column_operations"); |
||||
let t1c = require("../common/1c_sql_view"); |
||||
let t1d = require("../common/1d_pg_table_view_drag_drop_reorder"); |
||||
let t1e = require("../common/1e_pg_meta_sync"); |
||||
let t2a = require("../common/2a_table_with_belongs_to_colulmn"); |
||||
let t2b = require("../common/2b_table_with_m2m_column"); |
||||
let t3a = require("../common/3a_filter_sort_fields_operations"); |
||||
let t3b = require("../common/3b_formula_column"); |
||||
let t3c = require("../common/3c_lookup_column"); |
||||
let t3d = require("../common/3d_rollup_column"); |
||||
let t3e = require("../common/3e_duration_column"); |
||||
let t3f = require("../common/3f_link_to_another_record"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
t1a.genTest(apiType, dbType); |
||||
t1b.genTest(apiType, dbType); |
||||
t1c.genTest(apiType, dbType); |
||||
// NcGUI v2 t1d.genTest(apiType, dbType);
|
||||
t1e.genTest(apiType, dbType); |
||||
t2a.genTest(apiType, dbType); |
||||
t2b.genTest(apiType, dbType); |
||||
t3a.genTest(apiType, dbType); |
||||
t3b.genTest(apiType, dbType); |
||||
t3c.genTest(apiType, dbType); |
||||
t3d.genTest(apiType, dbType); |
||||
t3e.genTest(apiType, dbType); |
||||
// NcGUI v2 t3e.genTest(apiType, dbType);
|
||||
t3f.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "postgres"); |
@ -1,34 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t4a = require("../common/4a_table_view_grid_gallery_form"); |
||||
let t4b = require("../common/4b_table_view_share"); |
||||
let t4c = require("../common/4c_form_view_detailed"); |
||||
let t4d = require("../common/4d_table_view_grid_locked"); |
||||
let t4e = require("../common/4e_form_view_share"); |
||||
let t4f = require("../common/4f_pg_grid_view_share"); |
||||
let t4g = require("../common/4g_table_view_expanded_form"); |
||||
let t4h = require("../common/4h_kanban"); |
||||
let t4i = require("../common/4i_survey_form"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
// place plugin related activities at top
|
||||
t4c.genTest(apiType, dbType); |
||||
t4a.genTest(apiType, dbType); |
||||
t4b.genTest(apiType, dbType); |
||||
t4d.genTest(apiType, dbType); |
||||
t4e.genTest(apiType, dbType); |
||||
t4f.genTest(apiType, dbType); |
||||
t4g.genTest(apiType, dbType); |
||||
t4h.genTest(apiType, dbType); |
||||
t4i.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "postgres"); |
||||
|
||||
|
@ -1,19 +0,0 @@
|
||||
let t7b = require("../common/7b_import_from_airtable"); |
||||
let t9a = require("../common/9a_QuickTest"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
// CY Migration verification / Quick test
|
||||
t9a.genTest(apiType, dbType, "CY_QUICK"); |
||||
|
||||
// AT Import verification
|
||||
t7b.genTest(apiType, dbType); |
||||
t9a.genTest(apiType, dbType, "AT_IMPORT"); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "xcdb"); |
||||
|
||||
|
@ -1,55 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t6b = require("../common/6b_downloadCsv"); |
||||
let t6c = require("../common/6c_swagger_api"); |
||||
let t6e = require("../common/6e_project_operations"); |
||||
let t6f = require("../common/6f_attachments"); |
||||
let t6g = require("../common/6g_base_share"); |
||||
let t6h = require("../common/6h_change_password"); |
||||
let t7a = require("../common/7a_create_project_from_excel"); |
||||
let t8a = require("../common/8a_webhook"); |
||||
let t9b = require("../common/9b_ERD"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
|
||||
// Sakila Ext DB project creation
|
||||
t01.genTest(apiType, dbType); |
||||
|
||||
// Download CSV
|
||||
t6b.genTest(apiType, dbType); |
||||
|
||||
// // i18n
|
||||
// t6d.genTest(apiType, dbType);
|
||||
|
||||
// Swagger API
|
||||
// exclude@ncv2 t6c.genTest(apiType, dbType);
|
||||
|
||||
// Attachment cell
|
||||
t6f.genTest(apiType, dbType); |
||||
|
||||
// ERD
|
||||
t9b.genTest(apiType, dbType); |
||||
|
||||
// Webhook tests
|
||||
t8a.genTest(apiType, dbType); |
||||
|
||||
// Base share (viewer, editor), iFrame tests
|
||||
t6g.genTest(apiType, dbType); |
||||
|
||||
// Project operations: Delete
|
||||
t6e.genTest(apiType, dbType); |
||||
|
||||
// Create project from Excel
|
||||
t7a.genTest(apiType, dbType); |
||||
|
||||
// Change password
|
||||
t6h.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "mysql"); |
||||
|
||||
|
@ -1,21 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t5a = require("../common/5a_user_role"); |
||||
let t5b = require("../common/5b_preview_role"); |
||||
let t5c = require("../common/5c_super_user_role"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
// t5a.genTest(apiType, dbType);
|
||||
// t5b.genTest(apiType, dbType);
|
||||
t5c.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "mysql"); |
||||
|
||||
|
@ -1,38 +0,0 @@
|
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t1a = require("../common/1a_table_operations"); |
||||
let t1b = require("../common/1b_table_column_operations"); |
||||
let t1c = require("../common/1c_sql_view"); |
||||
let t1d = require("../common/1d_table_view_drag_drop_reorder"); |
||||
let t1e = require("../common/1e_meta_sync"); |
||||
let t2a = require("../common/2a_table_with_belongs_to_colulmn"); |
||||
let t2b = require("../common/2b_table_with_m2m_column"); |
||||
let t3a = require("../common/3a_filter_sort_fields_operations"); |
||||
let t3b = require("../common/3b_formula_column"); |
||||
let t3c = require("../common/3c_lookup_column"); |
||||
let t3d = require("../common/3d_rollup_column"); |
||||
let t3e = require("../common/3e_duration_column"); |
||||
let t3f = require("../common/3f_link_to_another_record"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
t1a.genTest(apiType, dbType); |
||||
t1b.genTest(apiType, dbType); |
||||
t1c.genTest(apiType, dbType); |
||||
// NcGUI v2 t1d.genTest(apiType, dbType);
|
||||
t1e.genTest(apiType, dbType); |
||||
t2a.genTest(apiType, dbType); |
||||
t2b.genTest(apiType, dbType); |
||||
t3a.genTest(apiType, dbType); |
||||
t3b.genTest(apiType, dbType); |
||||
t3c.genTest(apiType, dbType); |
||||
t3d.genTest(apiType, dbType); |
||||
t3e.genTest(apiType, dbType); |
||||
t3f.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "mysql"); |
@ -1,34 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t4a = require("../common/4a_table_view_grid_gallery_form"); |
||||
let t4b = require("../common/4b_table_view_share"); |
||||
let t4c = require("../common/4c_form_view_detailed"); |
||||
let t4d = require("../common/4d_table_view_grid_locked"); |
||||
let t4e = require("../common/4e_form_view_share"); |
||||
let t4f = require("../common/4f_grid_view_share"); |
||||
let t4g = require("../common/4g_table_view_expanded_form"); |
||||
let t4h = require("../common/4h_kanban"); |
||||
let t4i = require("../common/4i_survey_form"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
// place plugin related activities at top
|
||||
t4c.genTest(apiType, dbType); |
||||
t4a.genTest(apiType, dbType); |
||||
t4b.genTest(apiType, dbType); |
||||
t4d.genTest(apiType, dbType); |
||||
t4e.genTest(apiType, dbType); |
||||
t4f.genTest(apiType, dbType); |
||||
t4g.genTest(apiType, dbType); |
||||
t4h.genTest(apiType, dbType); |
||||
t4i.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "mysql"); |
||||
|
||||
|
@ -1,57 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t6b = require("../common/6b_downloadCsv"); |
||||
let t6c = require("../common/6c_swagger_api"); |
||||
let t6d = require("../common/6d_language_validation"); |
||||
let t6e = require("../common/6e_project_operations"); |
||||
let t6f = require("../common/6f_attachments"); |
||||
let t6g = require("../common/6g_base_share"); |
||||
let t6h = require("../common/6h_change_password"); |
||||
let t7a = require("../common/7a_create_project_from_excel"); |
||||
let t8a = require("../common/8a_webhook"); |
||||
const t9b = require("../common/9b_ERD"); |
||||
|
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
|
||||
// Sakila Ext DB project creation
|
||||
t01.genTest(apiType, dbType); |
||||
|
||||
// Download CSV
|
||||
t6b.genTest(apiType, dbType); |
||||
|
||||
// i18n: language validation suffice to be done in REST MySQL suite
|
||||
// t6d.genTest(apiType, dbType);
|
||||
|
||||
// Swagger API
|
||||
// exclude@ncv2 t6c.genTest(apiType, dbType);
|
||||
|
||||
// Attachment cell
|
||||
t6f.genTest(apiType, dbType); |
||||
|
||||
// ERD:
|
||||
t9b.genTest(apiType, dbType); |
||||
|
||||
// Webhook tests
|
||||
t8a.genTest(apiType, dbType); |
||||
|
||||
// Base share (viewer, editor), iFrame tests
|
||||
t6g.genTest(apiType, dbType); |
||||
|
||||
// Project operations: Delete
|
||||
t6e.genTest(apiType, dbType); |
||||
|
||||
// Create project from Excel
|
||||
t7a.genTest(apiType, dbType); |
||||
|
||||
// Change password
|
||||
t6h.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "xcdb"); |
||||
|
||||
|
@ -1,21 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t5a = require("../common/5a_user_role"); |
||||
let t5b = require("../common/5b_preview_role"); |
||||
let t5c = require("../common/5c_super_user_role"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
t5a.genTest(apiType, dbType); |
||||
t5b.genTest(apiType, dbType); |
||||
t5c.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "xcdb"); |
||||
|
||||
|
@ -1,39 +0,0 @@
|
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t1a = require("../common/1a_table_operations"); |
||||
let t1b = require("../common/1b_table_column_operations"); |
||||
let t1c = require("../common/1c_sql_view"); |
||||
let t1d = require("../common/1d_table_view_drag_drop_reorder"); |
||||
let t1e = require("../common/1e_meta_sync"); |
||||
let t2a = require("../common/2a_table_with_belongs_to_colulmn"); |
||||
let t2b = require("../common/2b_table_with_m2m_column"); |
||||
let t3a = require("../common/3a_filter_sort_fields_operations"); |
||||
let t3b = require("../common/3b_formula_column"); |
||||
let t3c = require("../common/3c_lookup_column"); |
||||
let t3d = require("../common/3d_rollup_column"); |
||||
let t3e = require("../common/3e_duration_column"); |
||||
let t3f = require("../common/3f_link_to_another_record"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
t1a.genTest(apiType, dbType); |
||||
t1b.genTest(apiType, dbType); |
||||
t1c.genTest(apiType, dbType); |
||||
// NcGUI v2 t1d.genTest(apiType, dbType);
|
||||
t1e.genTest(apiType, dbType); |
||||
t2a.genTest(apiType, dbType); |
||||
t2b.genTest(apiType, dbType); |
||||
t3a.genTest(apiType, dbType); |
||||
t3b.genTest(apiType, dbType); |
||||
t3c.genTest(apiType, dbType); |
||||
t3d.genTest(apiType, dbType); |
||||
t3e.genTest(apiType, dbType); |
||||
// NcGUI v2 t3e.genTest(apiType, dbType);
|
||||
t3f.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "xcdb"); |
@ -1,32 +0,0 @@
|
||||
let t0 = require("./explicitLogin"); |
||||
let t01 = require("../common/00_pre_configurations"); |
||||
let t4a = require("../common/4a_table_view_grid_gallery_form"); |
||||
let t4b = require("../common/4b_table_view_share"); |
||||
let t4c = require("../common/4c_form_view_detailed"); |
||||
let t4d = require("../common/4d_table_view_grid_locked"); |
||||
let t4e = require("../common/4e_form_view_share"); |
||||
let t4f = require("../common/4f_grid_view_share"); |
||||
let t4h = require("../common/4h_kanban"); |
||||
let t4i = require("../common/4i_survey_form"); |
||||
const { |
||||
setCurrentMode, |
||||
} = require("../../support/page_objects/projectConstants"); |
||||
|
||||
const nocoTestSuite = (apiType, dbType) => { |
||||
setCurrentMode(apiType, dbType); |
||||
t01.genTest(apiType, dbType); |
||||
|
||||
// place plugin related activities at top
|
||||
t4c.genTest(apiType, dbType); |
||||
t4a.genTest(apiType, dbType); |
||||
t4b.genTest(apiType, dbType); |
||||
t4d.genTest(apiType, dbType); |
||||
// to be fixed t4e.genTest(apiType, dbType);
|
||||
t4f.genTest(apiType, dbType); |
||||
t4h.genTest(apiType, dbType); |
||||
t4i.genTest(apiType, dbType); |
||||
}; |
||||
|
||||
nocoTestSuite("rest", "xcdb"); |
||||
|
||||
|
@ -1,235 +0,0 @@
|
||||
/// <reference types="cypress" />
|
||||
// ***********************************************************
|
||||
// This example plugins/index.js can be used to load plugins
|
||||
//
|
||||
// You can change the location of this file or turn off loading
|
||||
// the plugins file with the 'pluginsFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/plugins-guide
|
||||
// ***********************************************************
|
||||
|
||||
// This function is called when a project is opened or re-opened (e.g. due to
|
||||
// the project's config changing)
|
||||
const { rmdir, copyFile } = require("fs"); |
||||
|
||||
// https://stackoverflow.com/questions/61934443/read-excel-files-in-cypress
|
||||
const readXlsx = require("./read-xlsx"); |
||||
const makeServer = require("./server"); |
||||
/** |
||||
* @type {Cypress.PluginConfig} |
||||
*/ |
||||
// eslint-disable-next-line no-unused-vars
|
||||
module.exports = (on, config) => { |
||||
// `on` is used to hook into various events Cypress emits
|
||||
// `config` is the resolved Cypress config
|
||||
|
||||
// register utility tasks to read and parse Excel files
|
||||
on("task", { |
||||
copyFile() { |
||||
console.log("copyFile", __dirname); |
||||
return new Promise((resolve, reject) => { |
||||
copyFile( |
||||
"./scripts/cypress/fixtures/quickTest/noco_0_91_7.db", |
||||
"./packages/nocodb/noco.db", |
||||
(err) => { |
||||
if (err) { |
||||
console.log(err); |
||||
return reject(err); |
||||
} |
||||
resolve(null); |
||||
} |
||||
); |
||||
}); |
||||
}, |
||||
deleteFolder(folderName) { |
||||
console.log("deleting folder %s", folderName); |
||||
|
||||
return new Promise((resolve, reject) => { |
||||
rmdir(folderName, { maxRetries: 10, recursive: true }, (err) => { |
||||
if (err) { |
||||
console.error(err); |
||||
|
||||
return reject(err); |
||||
} |
||||
|
||||
resolve(null); |
||||
}); |
||||
}); |
||||
}, |
||||
readXlsx: readXlsx.read, |
||||
readSheetList: readXlsx.sheetList, |
||||
log(message) { |
||||
console.log(`##Cypress>> ${message}`); |
||||
return null; |
||||
}, |
||||
queryDb: (query) => { |
||||
return queryTestDb(query, config); |
||||
}, |
||||
sqliteExec: (query) => { |
||||
_sqliteExec(query); |
||||
return null; |
||||
}, |
||||
sqliteExecReturnValue: (query) => { |
||||
return _sqliteExecReturnValue(query); |
||||
}, |
||||
pgExec: (query) => { |
||||
_pgExec(query); |
||||
return null; |
||||
}, |
||||
pgExecTest: (query) => { |
||||
return _pgExecTest(query); |
||||
}, |
||||
}); |
||||
|
||||
let server, port, close; |
||||
|
||||
on("before:spec", async (spec) => { |
||||
// we can customize the server based on the spec about to run
|
||||
const info = await makeServer(); |
||||
// save the server instance information
|
||||
server = info.server; |
||||
port = info.port; |
||||
close = info.close; |
||||
console.log("started the server on port %d", port); |
||||
}); |
||||
|
||||
on("after:spec", async (spec) => { |
||||
if (!server) { |
||||
console.log("no server to close"); |
||||
return; |
||||
} |
||||
await close(); |
||||
console.log("closed the server running on port %d", port); |
||||
}); |
||||
}; |
||||
|
||||
// mysql connection
|
||||
// https://gist.github.com/fityanos/0a345e9e9de498b6c629f78e6b2835f5
|
||||
|
||||
const mysql = require("mysql2"); |
||||
function queryTestDb(query, config) { |
||||
// creates a new mysql connection using credentials from cypress.json env's
|
||||
const connection = mysql.createConnection(config.env.db); |
||||
// start connection to db
|
||||
connection.connect(); |
||||
// exec query + disconnect to db as a Promise
|
||||
return new Promise((resolve, reject) => { |
||||
connection.query(query, (error, results) => { |
||||
if (error) reject(error); |
||||
else { |
||||
connection.end(); |
||||
// console.log(results)
|
||||
return resolve(results); |
||||
} |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
// sqlite connection
|
||||
const sqlite3 = require("sqlite3").verbose(); |
||||
function _sqliteExecReturnValue(query) { |
||||
// open the database
|
||||
console.log("Current directory: " + process.cwd()); |
||||
let db = new sqlite3.Database( |
||||
"./scripts/cypress/fixtures/sqlite-sakila/sakila.db", |
||||
sqlite3.OPEN_READWRITE, |
||||
(err) => { |
||||
if (err) { |
||||
console.error(err.message); |
||||
} else { |
||||
console.log("Connected to the noco xcdb database."); |
||||
} |
||||
} |
||||
); |
||||
|
||||
// exec query + disconnect to db as a Promise
|
||||
return new Promise((resolve, reject) => { |
||||
db.get(query, [], (err, row) => { |
||||
db.close(); |
||||
if (err) { |
||||
reject(err); |
||||
} else { |
||||
return resolve(row); |
||||
} |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
function _sqliteExec(query) { |
||||
// open the database
|
||||
console.log("Current directory: " + process.cwd()); |
||||
let db = new sqlite3.Database( |
||||
"./scripts/cypress/fixtures/sqlite-sakila/sakila.db", |
||||
sqlite3.OPEN_READWRITE, |
||||
(err) => { |
||||
if (err) { |
||||
console.error(err.message); |
||||
} else { |
||||
console.log("Connected to the noco xcdb database."); |
||||
} |
||||
} |
||||
); |
||||
|
||||
db.serialize(() => { |
||||
db.run(query); |
||||
}); |
||||
|
||||
db.close((err) => { |
||||
if (err) { |
||||
console.error(err.message); |
||||
} else { |
||||
console.log("Close the database connection."); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
// pg connection
|
||||
const { Pool, Client } = require("pg"); |
||||
const pg_credentials = { |
||||
user: "postgres", |
||||
host: "localhost", |
||||
database: "postgres", |
||||
password: "password", |
||||
port: 5432, |
||||
}; |
||||
function _pgExec(query) { |
||||
// open pg client connection
|
||||
const client = new Client(pg_credentials); |
||||
client.connect(); |
||||
|
||||
// query & terminate
|
||||
client.query(query, (err, res) => { |
||||
console.log(err, res); |
||||
client.end(); |
||||
}); |
||||
} |
||||
|
||||
function _pgExecTest(query, retryCount = 60) { |
||||
return new Promise((resolve, reject) => { |
||||
// open pg client connection
|
||||
const client = new Client(pg_credentials); |
||||
|
||||
client.connect().catch(() => { |
||||
client.end(); |
||||
}); |
||||
|
||||
// query & terminate
|
||||
client.query(query, (err, res) => { |
||||
if (err) { |
||||
if (retryCount--) |
||||
return setTimeout( |
||||
() => _pgExecTest(query, retryCount).then(resolve).catch(reject), |
||||
2000 |
||||
); |
||||
else reject(err); |
||||
} |
||||
|
||||
console.log("==== success ===", res); |
||||
resolve(true); |
||||
client.end(); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
|
@ -1,33 +0,0 @@
|
||||
// https://stackoverflow.com/questions/61934443/read-excel-files-in-cypress
|
||||
|
||||
const fs = require("fs"); |
||||
const XLSX = require("xlsx"); |
||||
|
||||
const read = ({ file, sheet }) => { |
||||
const buf = fs.readFileSync(file); |
||||
const workbook = XLSX.read(buf, { type: "buffer" }); |
||||
const rows = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]); |
||||
return rows; |
||||
}; |
||||
|
||||
// const read = ({file, sheet}) => {
|
||||
// const buf = fs.readFileSync(file);
|
||||
// const workbook = XLSX.read(buf, { type: 'buffer' });
|
||||
// const rows = XLSX.utils.sheet_to_json(workbook.Sheets[sheet], {
|
||||
// header: 1,
|
||||
// blankrows: false
|
||||
// });
|
||||
// return rows
|
||||
// }
|
||||
|
||||
const sheetList = ({ file }) => { |
||||
const buf = fs.readFileSync(file); |
||||
const workbook = XLSX.read(buf, { type: "buffer" }); |
||||
const rows = workbook.SheetNames; |
||||
return rows; |
||||
}; |
||||
|
||||
module.exports = { |
||||
read, |
||||
sheetList, |
||||
}; |
@ -1,63 +0,0 @@
|
||||
// https://glebbahmutov.com/blog/restart-server/
|
||||
|
||||
const express = require("express"); |
||||
const bodyParser = require("body-parser"); |
||||
|
||||
let request = []; |
||||
|
||||
function makeServer() { |
||||
const app = express(); |
||||
app.use(bodyParser.json()); |
||||
|
||||
app.get("/hook/all", (req, res) => { |
||||
// console.log(request)
|
||||
res.json(request); |
||||
}); |
||||
app.get("/hook/last", (req, res) => { |
||||
if (request.length) { |
||||
// console.log(request[request.length - 1])
|
||||
res.json(request[request.length - 1]); |
||||
} |
||||
}); |
||||
app.get("/hook/count", (req, res) => { |
||||
// console.log(request.length)
|
||||
res.json(request.length); |
||||
}); |
||||
app.get("/hook/clear", (req, res) => { |
||||
request = []; |
||||
res.status(200).end(); |
||||
}); |
||||
|
||||
app.post("/hook", (req, res) => { |
||||
request.push(req.body); |
||||
// console.log("/hook :: ", req.body) // Call your action on the request here
|
||||
res.status(200).end(); // Responding is important
|
||||
}); |
||||
|
||||
app.post("/stop", (req, res) => { |
||||
process.exit(); |
||||
}); |
||||
|
||||
const port = 9090; |
||||
|
||||
return new Promise((resolve) => { |
||||
const server = app.listen(port, function () { |
||||
const port = server.address().port; |
||||
console.log("Example app listening at port %d", port); |
||||
|
||||
// close the server
|
||||
const close = () => { |
||||
return new Promise((resolve) => { |
||||
console.log("closing server"); |
||||
server.close(resolve); |
||||
}); |
||||
}; |
||||
|
||||
resolve({ server, port, close }); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
module.exports = makeServer; |
||||
|
||||
|
@ -1,720 +0,0 @@
|
||||
// ***********************************************
|
||||
// This example commands.js shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
// @author Roman Rezinkin roman.rezinkin@hotmail.com
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||
|
||||
import "cypress-file-upload"; |
||||
import { isXcdb, isPostgres } from "./page_objects/projectConstants"; |
||||
|
||||
require("@4tw/cypress-drag-drop"); |
||||
|
||||
|
||||
// recursively gets an element, returning only after it's determined to be attached to the DOM for good
|
||||
Cypress.Commands.add("getSettled", (selector, opts = {}) => { |
||||
const retries = opts.retries || 3; |
||||
const delay = opts.delay || 400; |
||||
|
||||
const isAttached = (resolve, count = 0) => { |
||||
const el = Cypress.$(selector); |
||||
|
||||
// is element attached to the DOM?
|
||||
count = Cypress.dom.isAttached(el) ? count + 1 : 0; |
||||
|
||||
// hit our base case, return the element
|
||||
if (count >= retries) { |
||||
return resolve(el); |
||||
} |
||||
|
||||
// retry after a bit of a delay
|
||||
setTimeout(() => isAttached(resolve, count), delay); |
||||
}; |
||||
|
||||
// wrap, so we can chain cypress commands off the result
|
||||
return cy.wrap(null).then(() => { |
||||
return new Cypress.Promise((resolve) => { |
||||
return isAttached(resolve, 0); |
||||
}).then((el) => { |
||||
return cy.wrap(el); |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
// for waiting until page load
|
||||
Cypress.Commands.add("waitForSpinners", () => { |
||||
cy.visit("http://localhost:3000/signup", { |
||||
retryOnNetworkFailure: true, |
||||
timeout: 1200000, |
||||
headers: { |
||||
"Accept-Encoding": "gzip, deflate", |
||||
}, |
||||
}); |
||||
cy.get(".nc-form-signup").should("exist"); |
||||
}); |
||||
|
||||
Cypress.Commands.add("signinOrSignup", (_args) => { |
||||
const args = Object.assign( |
||||
{ username: "user@nocodb.com", password: "Password123." }, |
||||
_args |
||||
); |
||||
|
||||
// signin/signup
|
||||
cy.get("body").then(($body) => { |
||||
cy.url().then((url) => { |
||||
if (!url.includes("/projects")) { |
||||
// handle initial load
|
||||
if ($body.find(".welcome-page").length > 0) { |
||||
cy.get("body").trigger("mousemove"); |
||||
cy.snip("LetsBegin"); |
||||
cy.contains("Let's Begin").click(); |
||||
cy.get('input[type="text"]', { timeout: 12000 }).type(args.username); |
||||
cy.get('input[type="password"]').type(args.password); |
||||
cy.snip("SignUp"); |
||||
cy.get('button:contains("SIGN UP")').click(); |
||||
|
||||
// handle signin
|
||||
} else { |
||||
cy.get('input[type="text"]', { timeout: 12000 }).type(args.username); |
||||
cy.get('input[type="password"]').type(args.password); |
||||
cy.snip("SignIn"); |
||||
cy.get('button:contains("SIGN IN")').click(); |
||||
} |
||||
} else if (url.includes("/signin")) { |
||||
cy.get('input[type="text"]', { timeout: 12000 }).type(args.username); |
||||
cy.get('input[type="password"]').type(args.password); |
||||
cy.snip("SignIn"); |
||||
cy.get('button:contains("SIGN IN")').click(); |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
// indicates page-load complete
|
||||
cy.get(".nc-noco-brand-icon", { timeout: 12000 }).should("exist"); |
||||
}); |
||||
|
||||
// for opening/creating a rest project
|
||||
Cypress.Commands.add("openOrCreateRestProject", (_args) => { |
||||
const args = Object.assign({ new: false }, _args); |
||||
|
||||
// signin/signup
|
||||
cy.signinOrSignup(); |
||||
cy.get(".nc-new-project-menu").should("exist"); |
||||
cy.snip("ProjectPage"); |
||||
cy.get("body").then(($body) => { |
||||
const filter = args.meta |
||||
? ".nc-meta-project-row" |
||||
: ":not(.nc-meta-project-row)"; |
||||
// if project exist open
|
||||
if ($body.find(".nc-rest-project-row").filter(filter).length && !args.new) { |
||||
cy.get(".nc-rest-project-row").filter(filter).first().click(); |
||||
} else { |
||||
cy.contains("New Project").trigger("onmouseover").trigger("mouseenter"); |
||||
if (args.meta) { |
||||
cy.get(".nc-create-xc-db-project").click(); |
||||
cy.url({ timeout: 6000 }).should("contain", "#/project/xcdb"); |
||||
cy.get(".nc-metadb-project-name").type("test_proj" + Date.now()); |
||||
cy.contains("button", "Create", { timeout: 3000 }).click(); |
||||
} else { |
||||
cy.get(".nc-create-external-db-project").click(); |
||||
cy.url({ timeout: 6000 }).should("contain", "#/project"); |
||||
cy.get(".database-field input").click().clear().type("sakila"); |
||||
cy.contains("Test Database Connection").click(); |
||||
cy.contains("Ok & Save Project", { timeout: 3000 }).click(); |
||||
} |
||||
} |
||||
}); |
||||
cy.url({ timeout: 20000 }).should("contain", "#/nc/"); |
||||
}); |
||||
|
||||
Cypress.Commands.add("refreshTableTab", () => { |
||||
cy.task("log", `[refreshTableTab]`); |
||||
|
||||
cy.get(".nc-project-tree") |
||||
.find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) |
||||
.should("exist") |
||||
.first() |
||||
.rightclick({ force: true }); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-tree-view-context-menu") |
||||
.find('[role="menuitem"]') |
||||
.contains("Tables Refresh") |
||||
.should("exist") |
||||
.click({ force: true }); |
||||
|
||||
cy.toastWait("Tables refreshed"); |
||||
}); |
||||
|
||||
// Wait for grid view render
|
||||
Cypress.Commands.add("gridWait", (rc) => { |
||||
// for some tables, linked records are not available immediately
|
||||
cy.wait(1000); |
||||
|
||||
cy.get(".xc-row-table.nc-grid", { timeout: 30000 }).should("exist"); |
||||
|
||||
// wait for page rendering to complete
|
||||
if (rc != 0) { |
||||
cy.get(".nc-grid-row").should("have.length", rc); |
||||
} |
||||
}); |
||||
|
||||
// tn: table name
|
||||
// rc: row count. validate row count if rc!=0
|
||||
Cypress.Commands.add("openTableTab", (tn, rc) => { |
||||
cy.task("log", `[openTableTab] ${tn} ${rc}`); |
||||
cy.get(`.nc-project-tree-tbl-${tn}`).should("exist").first().click(); |
||||
cy.gridWait(rc); |
||||
}); |
||||
|
||||
Cypress.Commands.add("closeTableTab", (tn) => { |
||||
cy.task("log", `[closeTableTab] ${tn}`); |
||||
|
||||
if (tn) { |
||||
// request to close specific tab
|
||||
cy.get(".ant-tabs-tab-btn") |
||||
.contains(tn) |
||||
.should("exist") |
||||
.parent() |
||||
.parent() |
||||
.parent() |
||||
.find("button") |
||||
.click(); |
||||
} else { |
||||
// lone tab active; close it
|
||||
cy.getSettled("button.ant-tabs-tab-remove").should("be.visible").click(); |
||||
cy.get("button.ant-tabs-tab-remove").should("not.exist"); |
||||
} |
||||
// subsequent tab open commands will fail if tab is not closed completely
|
||||
cy.wait(2000); |
||||
}); |
||||
|
||||
Cypress.Commands.add("openOrCreateGqlProject", (_args) => { |
||||
const args = Object.assign({ new: false, meta: false }, _args); |
||||
|
||||
cy.signinOrSignup(); |
||||
|
||||
cy.get(".nc-new-project-menu").should("exist"); |
||||
cy.get("body").then(($body) => { |
||||
const filter = args.meta |
||||
? ".nc-meta-project-row" |
||||
: ":not(.nc-meta-project-row)"; |
||||
// if project exist open
|
||||
if ( |
||||
$body.find(".nc-graphql-project-row").filter(filter).length && |
||||
!args.new |
||||
) { |
||||
cy.get(".nc-graphql-project-row").filter(filter).first().click(); |
||||
} else { |
||||
cy.contains("New Project").trigger("onmouseover").trigger("mouseenter"); |
||||
if (args.meta) { |
||||
cy.get(".nc-create-xc-db-project").click(); |
||||
cy.url({ timeout: 6000 }).should("contain", "#/project/xcdb"); |
||||
cy.contains("GRAPHQL APIs").closest("label").click(); |
||||
cy.get(".nc-metadb-project-name").type("test_proj" + Date.now()); |
||||
cy.contains("button", "Create", { timeout: 3000 }).click(); |
||||
} else { |
||||
cy.get(".nc-create-external-db-project").click(); |
||||
cy.url({ timeout: 6000 }).should("contain", "#/project"); |
||||
cy.contains("GRAPHQL APIs").closest("label").click(); |
||||
cy.get(".database-field input").click().clear().type("sakila"); |
||||
cy.contains("Test Database Connection").click(); |
||||
cy.contains("Ok & Save Project").should("exist").click(); |
||||
} |
||||
} |
||||
}); |
||||
cy.url({ timeout: 20000 }).should("contain", "#/nc/"); |
||||
}); |
||||
|
||||
let LOCAL_STORAGE_MEMORY = {}; |
||||
let LOCAL_STORAGE_MEMORY_v2 = {}; |
||||
|
||||
Cypress.Commands.add("saveLocalStorage", (name) => { |
||||
LOCAL_STORAGE_MEMORY = {}; |
||||
Object.keys(localStorage).forEach((key) => { |
||||
LOCAL_STORAGE_MEMORY[key] = localStorage[key]; |
||||
}); |
||||
cy.printLocalStorage(); |
||||
}); |
||||
|
||||
const restoreLocalStorage = () => { |
||||
Object.keys(LOCAL_STORAGE_MEMORY).forEach((key) => { |
||||
localStorage.setItem(key, LOCAL_STORAGE_MEMORY[key]); |
||||
}); |
||||
|
||||
cy.printLocalStorage(); |
||||
}; |
||||
|
||||
Cypress.Commands.add("restoreLocalStorage", restoreLocalStorage); |
||||
// Cypress.on("window:before:load", restoreLocalStorage);
|
||||
|
||||
Cypress.Commands.add("deleteLocalStorage", () => { |
||||
Object.keys(LOCAL_STORAGE_MEMORY).forEach((key) => { |
||||
localStorage.removeItem(key); |
||||
}); |
||||
}); |
||||
|
||||
Cypress.Commands.add("printLocalStorage", () => { |
||||
// cy.task('log', `[printLocalStorage]`);
|
||||
// cy.task('log', JSON.stringify(localStorage, null, 2));
|
||||
// cy.task('log', JSON.stringify(LOCAL_STORAGE_MEMORY, null, 2));
|
||||
}); |
||||
|
||||
Cypress.Commands.add("getActiveModal", (wrapperSelector) => { |
||||
if (wrapperSelector) { |
||||
return cy.get(`${wrapperSelector} .ant-modal-content:visible`).last(); |
||||
} |
||||
return cy.get(".ant-modal-content:visible").last(); |
||||
}); |
||||
|
||||
Cypress.Commands.add("closeActiveModal", (wrapperSelector) => { |
||||
cy.getActiveModal(wrapperSelector).find(".ant-modal-close-x").click(); |
||||
}); |
||||
|
||||
Cypress.Commands.add("getActiveMenu", (overlaySelector) => { |
||||
if (overlaySelector) { |
||||
return cy.getSettled(`${overlaySelector} .ant-dropdown-content:visible`); |
||||
} |
||||
return cy.getSettled(".ant-dropdown-content:visible").last(); |
||||
}); |
||||
|
||||
Cypress.Commands.add("getActivePopUp", () => { |
||||
return cy.get(".ant-menu-submenu-popup:visible").last(); |
||||
}); |
||||
|
||||
Cypress.Commands.add("getActiveSelection", (selector) => { |
||||
if (selector) { |
||||
return cy.get(`${selector}.ant-select-dropdown:visible`).last(); |
||||
} |
||||
return cy.get(".ant-select-dropdown:visible").last(); |
||||
}); |
||||
|
||||
Cypress.Commands.add("getActiveDrawer", (selector) => { |
||||
if (selector) { |
||||
return cy.get(`${selector} .ant-drawer-content:visible`).last(); |
||||
} |
||||
return cy.get(".ant-drawer-content:visible").last(); |
||||
}); |
||||
|
||||
Cypress.Commands.add("getActivePicker", (dropdownSelector) => { |
||||
if (dropdownSelector) { |
||||
return cy.get(`${dropdownSelector}.ant-picker-dropdown:visible`).last(); |
||||
} |
||||
return cy.get(".ant-picker-dropdown :visible").last(); |
||||
}); |
||||
|
||||
Cypress.Commands.add("createTable", (name) => { |
||||
cy.task("log", `[createTableTab] ${name}`); |
||||
cy.get(".nc-add-new-table").should("exist").click(); |
||||
cy.getActiveModal(".nc-modal-table-create") |
||||
.find(`input[type="text"]:visible`) |
||||
.click() |
||||
.clear() |
||||
.type(name); |
||||
// submit button
|
||||
cy.getActiveModal(".nc-modal-table-create") |
||||
.find("button.ant-btn-primary:visible") |
||||
.click(); |
||||
|
||||
cy.gridWait(0); |
||||
|
||||
cy.url().should("contain", `table/${name}`); |
||||
cy.get(`.nc-project-tree-tbl-${name}`).should("exist"); |
||||
}); |
||||
|
||||
Cypress.Commands.add("deleteTable", (name, dbType) => { |
||||
cy.get(`.nc-project-tree-tbl-${name}`).should("exist").rightclick(); |
||||
cy.getActiveMenu(".nc-dropdown-tree-view-context-menu") |
||||
.find('[role="menuitem"]') |
||||
.contains("Delete") |
||||
.click(); |
||||
cy.getActiveModal().find("button").contains("Yes").click(); |
||||
|
||||
cy.toastWait(`Deleted table successfully`); |
||||
}); |
||||
|
||||
Cypress.Commands.add("renameTable", (oldName, newName) => { |
||||
// right click on project table name
|
||||
cy.get(`.nc-project-tree-tbl-${oldName}`) |
||||
.should("exist") |
||||
.first() |
||||
.rightclick(); |
||||
|
||||
// choose rename option from menu
|
||||
cy.getActiveMenu(".nc-dropdown-tree-view-context-menu") |
||||
.find('[role="menuitem"]') |
||||
.contains("Rename") |
||||
.click({ force: true }); |
||||
|
||||
// feed new name
|
||||
cy.getActiveModal(".nc-modal-table-rename") |
||||
.find("input") |
||||
.clear() |
||||
.type(newName); |
||||
|
||||
// submit
|
||||
cy.getActiveModal(".nc-modal-table-rename") |
||||
.find("button") |
||||
.contains("Submit") |
||||
.click(); |
||||
|
||||
cy.toastWait("Table renamed successfully"); |
||||
}); |
||||
|
||||
// Cypress.Commands.add('createColumn', (table, columnName) => {
|
||||
// cy.get('.nc-project-tree')
|
||||
// .find('.v-list-item__title:contains(Tables)')
|
||||
// .should('exist')
|
||||
// .first()
|
||||
// .click();
|
||||
// cy.get('.nc-project-tree')
|
||||
// .contains(table)
|
||||
// .should('exist')
|
||||
// .first()
|
||||
// .click({ force: true });
|
||||
// cy.get(`.project-tab:contains(${table}):visible`).should('exist');
|
||||
// cy.get('.v-window-item--active .nc-grid tr > th:last button').click({
|
||||
// force: true,
|
||||
// });
|
||||
// cy.get('.nc-column-name-input input').clear().type(columnName);
|
||||
// cy.getActiveMenu('Menu_CreateColumn');
|
||||
// cy.get('.nc-col-create-or-edit-card').contains('Save').click();
|
||||
// cy.get('th:contains(new_column)').should('exist');
|
||||
// });
|
||||
|
||||
Cypress.Commands.add("toastWait", (msg) => { |
||||
// cy.get('.ant-message-notice-content:visible', { timout: 30000 }).should('exist')
|
||||
cy.get(`.ant-message-notice-content:visible:contains("${msg}")`, { |
||||
timeout: 30000, |
||||
}).should("exist"); |
||||
cy.get(".ant-message-notice-content:visible", { timeout: 12000 }).should( |
||||
"not.exist" |
||||
); |
||||
}); |
||||
|
||||
Cypress.Commands.add("inputHighlightRenderWait", (selector) => { |
||||
// fix me! wait till the modal rendering (input highlight) is completed
|
||||
// focus shifts back to the input field to select text after the dropdown is rendered
|
||||
cy.wait(500); |
||||
}); |
||||
|
||||
// vn: view name
|
||||
// rc: expected row count. validate row count if rc!=0
|
||||
Cypress.Commands.add("openViewsTab", (vn, rc) => { |
||||
cy.task("log", `[openViewsTab] ${vn} ${rc}`); |
||||
|
||||
cy.get(`.nc-project-tree-tbl-${vn}`, { timeout: 10000 }) |
||||
.should("exist") |
||||
.first() |
||||
.click({ force: true }); |
||||
|
||||
// kludge to make new tab active
|
||||
cy.get(".ant-tabs-tab-btn") |
||||
.contains(vn) |
||||
.should("exist") |
||||
.click({ force: true }); |
||||
|
||||
// wait for page rendering to complete
|
||||
if (rc != 0) { |
||||
cy.get(".xc-row-table.nc-grid").should("exist"); |
||||
cy.get(".nc-grid-row").should("have.length", rc); |
||||
} |
||||
}); |
||||
|
||||
Cypress.Commands.add("closeViewsTab", (vn) => { |
||||
cy.task("log", `[closeViewsTab] ${vn}`); |
||||
cy.get(".ant-tabs-tab-btn") |
||||
.contains(vn) |
||||
.should("exist") |
||||
.parent() |
||||
.parent() |
||||
.parent() |
||||
.find("button") |
||||
.click(); |
||||
}); |
||||
|
||||
// Support for screen-shots
|
||||
//
|
||||
|
||||
let screenShotDb = []; |
||||
|
||||
// snip entire screen
|
||||
Cypress.Commands.add("snip", (filename) => { |
||||
if ( |
||||
true === Cypress.env("screenshot") && |
||||
false === screenShotDb.includes(filename) |
||||
) { |
||||
let storeName = `${screenShotDb.length}_${filename}`; |
||||
screenShotDb.push(filename); |
||||
cy.screenshot(storeName, { overwrite: true }); |
||||
} |
||||
}); |
||||
|
||||
// snip current modal
|
||||
Cypress.Commands.add("snipActiveModal", (filename) => { |
||||
if ( |
||||
true === Cypress.env("screenshot") && |
||||
false === screenShotDb.includes(filename) |
||||
) { |
||||
let storeName = `${screenShotDb.length}_${filename}`; |
||||
screenShotDb.push(filename); |
||||
// cy.getActiveModal().screenshot(filename, {
|
||||
// padding: 0,
|
||||
// overwrite: true,
|
||||
// });
|
||||
cy.screenshot(storeName, { overwrite: true }); |
||||
} |
||||
}); |
||||
|
||||
// snip current menu
|
||||
Cypress.Commands.add("snipActiveMenu", (filename) => { |
||||
if ( |
||||
true === Cypress.env("screenshot") && |
||||
false === screenShotDb.includes(filename) |
||||
) { |
||||
let storeName = `${screenShotDb.length}_${filename}`; |
||||
screenShotDb.push(filename); |
||||
// cy.getActiveMenu().screenshot(filename, {
|
||||
// padding: 0,
|
||||
// overwrite: true,
|
||||
// });
|
||||
cy.screenshot(storeName, { overwrite: true }); |
||||
} |
||||
}); |
||||
|
||||
// pre-test file hook
|
||||
Cypress.Commands.add("fileHook", () => { |
||||
window.localStorage.setItem("vueuse-color-scheme", "light"); |
||||
}); |
||||
|
||||
Cypress.Commands.add("signOut", () => { |
||||
// sign out
|
||||
cy.visit(`/`); |
||||
cy.get(".nc-project-page-title", { timeout: 30000 }) |
||||
.contains("My Projects") |
||||
.should("be.visible"); |
||||
cy.get(".nc-menu-accounts", { timeout: 30000 }).should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-user-accounts-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.last() |
||||
.click(); |
||||
|
||||
cy.get('button:contains("SIGN IN")').should("exist"); |
||||
}); |
||||
|
||||
// Navigation
|
||||
//
|
||||
Cypress.Commands.add("gotoProjectsPage", () => { |
||||
cy.get(".nc-noco-brand-icon").should("exist").click(); |
||||
cy.get(`.nc-project-page-title:contains("My Projects")`).should("exist"); |
||||
}); |
||||
|
||||
// View basic routines
|
||||
//
|
||||
function capitalizeFirstLetter(string) { |
||||
return string.charAt(0).toUpperCase() + string.slice(1); |
||||
} |
||||
|
||||
// viewCreate
|
||||
// : viewType: grid, gallery, kanban, form
|
||||
// : creates view with default name
|
||||
// : [fix-me] with name validation, works only first view creation of that category.
|
||||
//
|
||||
Cypress.Commands.add("viewCreate", (viewType) => { |
||||
// click on 'Grid/Gallery/Form/Kanban' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click(); |
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal(".nc-modal-view-create").find(".ant-btn-primary").click(); |
||||
cy.toastWait("View created successfully"); |
||||
|
||||
// validate if view was created && contains default name 'Country1'
|
||||
cy.get(`.nc-${viewType}-view-item`) |
||||
.contains(`${capitalizeFirstLetter(viewType)}-1`) |
||||
.should("exist"); |
||||
}); |
||||
|
||||
// viewDelete
|
||||
// : delete view by index (0-based, exclude default view)
|
||||
//
|
||||
Cypress.Commands.add("viewDelete", (viewIndex) => { |
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").eq(viewIndex).click({ force: true }); |
||||
cy.wait(300); |
||||
|
||||
// click on 'Delete' button on confirmation modal
|
||||
cy.getActiveModal(".nc-modal-view-delete").find(".ant-btn-dangerous").click(); |
||||
cy.toastWait("View deleted successfully"); |
||||
}); |
||||
|
||||
// viewDuplicate
|
||||
// : duplicate view by index (0-based, *include* default view)
|
||||
//
|
||||
Cypress.Commands.add("viewCopy", (viewIndex) => { |
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-copy-icon").eq(viewIndex).click({ force: true }); |
||||
cy.wait(300); |
||||
|
||||
// click on 'Delete' button on confirmation modal
|
||||
cy.getActiveModal(".nc-modal-view-create").find(".ant-btn-primary").click(); |
||||
cy.toastWait("View created successfully"); |
||||
}); |
||||
|
||||
// viewRename
|
||||
// : rename view by index (0-based, exclude default view)
|
||||
//
|
||||
Cypress.Commands.add("viewRename", (viewType, viewIndex, newName) => { |
||||
// click on edit-icon (becomes visible on hovering mouse)
|
||||
cy.get(`.nc-${viewType}-view-item`).eq(viewIndex).dblclick(); |
||||
|
||||
// feed new name
|
||||
cy.get(`.nc-${viewType}-view-item input`).clear().type(`${newName}{enter}`); |
||||
cy.toastWait("View renamed successfully"); |
||||
|
||||
// validate
|
||||
cy.get(`.nc-${viewType}-view-item`).contains(`${newName}`).should("exist"); |
||||
}); |
||||
|
||||
// viewOpen
|
||||
// : open view by index (0-based, exclude default view)
|
||||
//
|
||||
Cypress.Commands.add("viewOpen", (viewType, viewIndex) => { |
||||
// click on view
|
||||
cy.get(`.nc-${viewType}-view-item`).eq(viewIndex).click(); |
||||
}); |
||||
|
||||
// openTableView
|
||||
// : open view by type & name
|
||||
//
|
||||
Cypress.Commands.add("openTableView", (viewType, viewName) => { |
||||
cy.get(`.nc-${viewType}-view-item`).contains(`${viewName}`).click(); |
||||
}); |
||||
|
||||
// Drag n Drop
|
||||
// refer: https://stackoverflow.com/a/55409853
|
||||
/* |
||||
|
||||
const getCoords = ($el) => { |
||||
const domRect = $el[0].getBoundingClientRect() |
||||
const coords = { x: domRect.left + (domRect.width / 2 || 0), y: domRect.top + (domRect.height / 2 || 0) } |
||||
|
||||
return coords |
||||
} |
||||
|
||||
const dragTo = (subject, to, opts) => { |
||||
|
||||
opts = Cypress._.defaults(opts, { |
||||
// delay inbetween steps
|
||||
delay: 0, |
||||
// interpolation between coords
|
||||
steps: 0, |
||||
// >=10 steps
|
||||
smooth: false, |
||||
}) |
||||
|
||||
if (opts.smooth) { |
||||
opts.steps = Math.max(opts.steps, 10) |
||||
} |
||||
|
||||
const win = subject[0].ownerDocument.defaultView |
||||
|
||||
const elFromCoords = (coords) => win.document.elementFromPoint(coords.x, coords.y) |
||||
const winMouseEvent = win.MouseEvent |
||||
|
||||
const send = (type, coords, el) => { |
||||
|
||||
el = el || elFromCoords(coords) |
||||
|
||||
el.dispatchEvent( |
||||
new winMouseEvent(type, Object.assign({}, { clientX: coords.x, clientY: coords.y }, { bubbles: true, cancelable: true })) |
||||
) |
||||
} |
||||
|
||||
const toSel = to |
||||
|
||||
function drag (from, to, steps = 1) { |
||||
|
||||
const fromEl = elFromCoords(from) |
||||
|
||||
const _log = Cypress.log({ |
||||
$el: fromEl, |
||||
name: 'drag to', |
||||
message: toSel, |
||||
}) |
||||
|
||||
_log.snapshot('before', { next: 'after', at: 0 }) |
||||
|
||||
_log.set({ coords: to }) |
||||
|
||||
send('mouseover', from, fromEl) |
||||
send('mousedown', from, fromEl) |
||||
|
||||
cy.then(() => { |
||||
return Cypress.Promise.try(() => { |
||||
|
||||
if (steps > 0) { |
||||
|
||||
const dx = (to.x - from.x) / steps |
||||
const dy = (to.y - from.y) / steps |
||||
|
||||
return Cypress.Promise.map(Array(steps).fill(), (v, i) => { |
||||
i = steps - 1 - i |
||||
|
||||
let _to = { |
||||
x: from.x + dx * (i), |
||||
y: from.y + dy * (i), |
||||
} |
||||
|
||||
send('mousemove', _to, fromEl) |
||||
|
||||
return Cypress.Promise.delay(opts.delay) |
||||
|
||||
}, { concurrency: 1 }) |
||||
} |
||||
}) |
||||
.then(() => { |
||||
|
||||
send('mousemove', to, fromEl) |
||||
send('mouseover', to) |
||||
send('mousemove', to) |
||||
send('mouseup', to) |
||||
_log.snapshot('after', { at: 1 }).end() |
||||
|
||||
}) |
||||
|
||||
}) |
||||
|
||||
} |
||||
|
||||
const $el = subject |
||||
const fromCoords = getCoords($el) |
||||
const toCoords = getCoords(cy.$$(to)) |
||||
|
||||
drag(fromCoords, toCoords, opts.steps) |
||||
} |
||||
|
||||
Cypress.Commands.addAll( |
||||
{ prevSubject: 'element' }, |
||||
{ |
||||
dragTo, |
||||
} |
||||
) |
||||
*/ |
@ -1,32 +0,0 @@
|
||||
// ***********************************************************
|
||||
// This example support/index.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import "./commands"; |
||||
|
||||
// https://www.cypress.io/blog/2020/02/12/working-with-iframes-in-cypress/
|
||||
import "cypress-iframe"; |
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
|
||||
Cypress.on("uncaught:exception", (err, runnable) => { |
||||
// returning false here prevents Cypress from
|
||||
// failing the test
|
||||
console.log("uncaught:exception"); |
||||
console.log(err); |
||||
console.log(runnable); |
||||
return false; |
||||
}); |
@ -1,714 +0,0 @@
|
||||
import { projectsPage } from "./navigation"; |
||||
|
||||
const path = require("path"); |
||||
|
||||
/** |
||||
* Delete the downloads folder to make sure the test has "clean" |
||||
* slate before starting. |
||||
*/ |
||||
export const deleteDownloadsFolder = () => { |
||||
const downloadsFolder = Cypress.config("downloadsFolder"); |
||||
cy.task("deleteFolder", downloadsFolder); |
||||
}; |
||||
|
||||
export class _settingsPage { |
||||
constructor() { |
||||
// menu
|
||||
this.TEAM_N_AUTH = "teamAndAuth"; |
||||
this.APPSTORE = "appStore"; |
||||
this.PROJ_METADATA = "projMetaData"; |
||||
this.AUDIT = "audit"; |
||||
|
||||
// submenu
|
||||
this.USER_MANAGEMENT = "usersManagement"; |
||||
this.API_TOKEN_MANAGEMENT = "apiTokenManagement"; |
||||
this.APPS = "new"; |
||||
this.METADATA = "metaData"; |
||||
this.UI_ACCESS_CONTROL = "acl"; |
||||
this.AUDIT_LOG = "audit"; |
||||
this.ERD = "erd"; |
||||
this.MISC = "misc"; |
||||
} |
||||
|
||||
openMenu(menuId) { |
||||
// open settings tab
|
||||
// cy.get('.nc-team-settings').should('exist').click()
|
||||
// cy.get(`[data-menu-id=${menuId}]`).should('exist').click()
|
||||
cy.get(".nc-project-menu").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-project-menu") |
||||
.find(`[data-menu-id="teamAndSettings"]`) |
||||
.should("exist") |
||||
.click(); |
||||
cy.get(`[data-menu-id=${menuId}]`).should("exist").click(); |
||||
} |
||||
|
||||
openTab(tabId) { |
||||
cy.get(`[data-menu-id=${tabId}]`).should("exist").last().click(); |
||||
} |
||||
|
||||
closeMenu() { |
||||
cy.getActiveModal() |
||||
.find(".nc-modal-close") |
||||
.scrollIntoView() |
||||
.click({ force: true }); |
||||
} |
||||
|
||||
openProjectMenu() { |
||||
cy.get(".nc-project-menu").should("exist").click(); |
||||
} |
||||
} |
||||
|
||||
// main page
|
||||
export class _mainPage { |
||||
constructor() { |
||||
// Top Left items
|
||||
this.HOME = 0; |
||||
|
||||
this.AUDIT = 0; |
||||
this.APPSTORE = 2; |
||||
this.TEAM_N_AUTH = 3; |
||||
this.PROJ_METADATA = 4; |
||||
this.ROLE_VIEW = 5; |
||||
this.ROLE_VIEW_EDITOR = 6; |
||||
this.ROLE_VIEW_COMMENTER = 7; |
||||
this.ROLE_VIEW_VIEWER = 8; |
||||
this.ROLE_VIEW_RESET = 9; |
||||
|
||||
this.roleURL = {}; |
||||
} |
||||
|
||||
toolBarTopLeft(toolBarItem) { |
||||
return cy |
||||
.get("header.v-toolbar", { timeout: 20000 }) |
||||
.eq(0) |
||||
.find("a") |
||||
.eq(toolBarItem); |
||||
} |
||||
|
||||
toolBarTopRight(toolBarItem) { |
||||
return cy |
||||
.get("header.v-toolbar", { timeout: 20000 }) |
||||
.eq(0) |
||||
.find("button") |
||||
.eq(toolBarItem); |
||||
} |
||||
|
||||
navigationDraw(item) { |
||||
// open settings tab
|
||||
cy.get(".nc-project-menu").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-project-menu") |
||||
.find(`[data-menu-id="teamAndSettings"]`) |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
switch (item) { |
||||
case this.AUDIT: |
||||
return cy.get(".nc-settings-audit:visible").should("exist"); |
||||
case this.APPSTORE: |
||||
return cy.get(".nc-settings-appstore:visible").should("exist"); |
||||
case this.TEAM_N_AUTH: |
||||
return cy.get(".nc-settings-teamauth:visible").should("exist"); |
||||
case this.PROJ_METADATA: |
||||
return cy.get(".nc-settings-projmeta:visible").should("exist"); |
||||
} |
||||
} |
||||
|
||||
// add new user to specified role
|
||||
//
|
||||
addNewUserToProject = (userCred, roleType) => { |
||||
let linkText; |
||||
let roleIndex = ["creator", "editor", "commenter", "viewer"].indexOf( |
||||
roleType |
||||
); |
||||
|
||||
// click on New User button, feed details
|
||||
cy.getActiveModal(".nc-modal-settings") |
||||
.find("button.nc-invite-team") |
||||
.click(); |
||||
|
||||
// additional wait to ensure the modal is fully loaded
|
||||
cy.getActiveModal(".nc-modal-invite-user-and-share-base").should("exist"); |
||||
cy.getActiveModal(".nc-modal-invite-user-and-share-base") |
||||
.find('input[placeholder="E-mail"]') |
||||
.should("exist"); |
||||
|
||||
cy.getActiveModal(".nc-modal-invite-user-and-share-base") |
||||
.find('input[placeholder="E-mail"]') |
||||
.type(userCred.username); |
||||
cy.getActiveModal(".nc-modal-invite-user-and-share-base") |
||||
.find(".ant-select.nc-user-roles") |
||||
.click(); |
||||
|
||||
// opt-in requested role & submit
|
||||
// cy.getActiveSelection().contains(roleType).click({force: true});
|
||||
cy.getActiveSelection(".nc-dropdown-user-role") |
||||
.find(".nc-role-option") |
||||
.eq(roleIndex) |
||||
.should("exist") |
||||
.click(); |
||||
cy.getActiveModal(".nc-modal-invite-user-and-share-base") |
||||
.find("button.ant-btn-primary") |
||||
.click(); |
||||
|
||||
cy.toastWait("Successfully updated the user details"); |
||||
|
||||
// get URL, invoke
|
||||
cy.getActiveModal(".nc-modal-invite-user-and-share-base") |
||||
.find(".ant-alert-message") |
||||
.then(($obj) => { |
||||
linkText = $obj.text().trim(); |
||||
cy.log(linkText); |
||||
this.roleURL[roleType] = linkText; |
||||
|
||||
cy.get("body").click("right"); |
||||
}); |
||||
}; |
||||
|
||||
addNewRowExpand(table) { |
||||
cy.get(".nc-add-new-row-btn:visible").should("exist"); |
||||
cy.get(".nc-add-new-row-btn").click(); |
||||
|
||||
// cy.wait(2000);
|
||||
// cy.get(`.nc-tooltip-content:contains("Add new row")`).should("not.exist");
|
||||
|
||||
// 'Add new row' tooltip persists for a while; force click on header to make it disappear
|
||||
cy.get( |
||||
`.nc-drawer-expanded-form .nc-expanded-form-header :contains("${table}")` |
||||
) |
||||
.should("exist") |
||||
.click({ force: true }); |
||||
} |
||||
|
||||
// addExistingUserToProject = (emailId, role) => {
|
||||
// cy.get('.v-list-item:contains("Team & Auth")').click();
|
||||
// cy.get(`tr:contains(${emailId})`)
|
||||
// .find(".mdi-plus", { timeout: 2000 })
|
||||
// .click();
|
||||
// cy.get(`tr:contains(${emailId})`)
|
||||
// .find(".mdi-pencil-outline", { timeout: 2000 })
|
||||
// .click();
|
||||
//
|
||||
// cy.get("label:contains(Select User Role)").click();
|
||||
//
|
||||
// // opt-in requested role & submit
|
||||
// //
|
||||
// cy.getActiveMenu().contains(role).click();
|
||||
// cy.get(".nc-invite-or-save-btn").click();
|
||||
// cy.toastWait("Successfully updated the user details");
|
||||
//
|
||||
// this.roleURL[role] =
|
||||
// "http://localhost:3000/#/user/authentication/signin";
|
||||
// };
|
||||
|
||||
getCell = (columnHeader, cellNumber) => { |
||||
return cy |
||||
.get(`:nth-child(${cellNumber}) > [data-title="${columnHeader}"]`) |
||||
.last(); |
||||
}; |
||||
|
||||
getPagination = (pageNumber) => { |
||||
if (pageNumber == "<") |
||||
return cy.get(".nc-pagination > .ant-pagination-prev"); |
||||
if (pageNumber == ">") |
||||
return cy.get(".nc-pagination > .ant-pagination-next"); |
||||
|
||||
return cy.get( |
||||
`.nc-pagination > .ant-pagination-item.ant-pagination-item-${pageNumber}` |
||||
); |
||||
}; |
||||
|
||||
getRow = (rowIndex) => { |
||||
return cy.get(".xc-row-table").find("tr").eq(rowIndex); |
||||
}; |
||||
|
||||
addColumn = (colName, tableName) => { |
||||
cy.get(".nc-column-add").click(); |
||||
|
||||
cy.wait(2000); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column:has(.nc-column-name-input)") |
||||
.find("input.nc-column-name-input") |
||||
.should("exist") |
||||
.clear() |
||||
.type(colName); |
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".ant-btn-primary") |
||||
.contains("Save") |
||||
.should("exist") |
||||
.click(); |
||||
cy.toastWait(`Column created`); |
||||
|
||||
cy.wait(2000); |
||||
|
||||
cy.get(`th[data-title="${colName}"]`).should("exist"); |
||||
}; |
||||
|
||||
addColumnWithType = (colName, colType, tableName) => { |
||||
cy.get(".nc-column-add").click(); |
||||
|
||||
cy.wait(2000); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column:has(.nc-column-name-input)") |
||||
.find("input.nc-column-name-input") |
||||
.should("exist") |
||||
.clear() |
||||
.type(colName); |
||||
|
||||
// change column type and verify
|
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".nc-column-type-input") |
||||
.last() |
||||
.click(); |
||||
cy.getActiveSelection(".nc-dropdown-column-type") |
||||
.find(".ant-select-item-option") |
||||
.contains(colType) |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-grid-add-column") |
||||
.find(".ant-btn-primary:visible") |
||||
.contains("Save") |
||||
.click(); |
||||
|
||||
cy.toastWait(`Column created`); |
||||
|
||||
cy.wait(2000); |
||||
|
||||
cy.get(`th[data-title="${colName}"]`).should("exist"); |
||||
}; |
||||
|
||||
deleteColumn = (colName) => { |
||||
cy.get(`th:contains(${colName})`).should("exist"); |
||||
|
||||
cy.get(`th:contains(${colName}) .nc-icon.ant-dropdown-trigger`) |
||||
.trigger("mouseover", { force: true }) |
||||
.click({ force: true }); |
||||
|
||||
// cy.get(".nc-column-delete").click();
|
||||
cy.getActiveMenu(".nc-dropdown-column-operations") |
||||
.find(".nc-column-delete") |
||||
.click(); |
||||
|
||||
// cy.get(".nc-column-delete").should("not.be.visible");
|
||||
// cy.get(".ant-btn-dangerous:visible").contains("Delete").click();
|
||||
|
||||
cy.getActiveModal(".nc-modal-column-delete") |
||||
.find(".ant-btn-dangerous:visible") |
||||
.contains("Delete") |
||||
.click(); |
||||
|
||||
cy.get(`th:contains(${colName})`).should("not.exist"); |
||||
}; |
||||
|
||||
getAuthToken = () => { |
||||
let obj = JSON.parse(localStorage["vuex"]); |
||||
return obj["users"]["token"]; |
||||
}; |
||||
|
||||
configureSMTP = (from, host, port, secure) => { |
||||
cy.getActiveModal() |
||||
.find(".nc-app-store-card-SMTP") |
||||
.click() |
||||
.then((obj) => { |
||||
cy.wrap(obj).find(".nc-app-store-card-install").click({ force: true }); |
||||
}); |
||||
|
||||
cy.getActiveModal() |
||||
.find("#form_item_from") |
||||
.should("exist") |
||||
.clear() |
||||
.type(from); |
||||
cy.getActiveModal() |
||||
.find("#form_item_host") |
||||
.should("exist") |
||||
.clear() |
||||
.type(host); |
||||
cy.getActiveModal() |
||||
.find("#form_item_port") |
||||
.should("exist") |
||||
.clear() |
||||
.type(port); |
||||
// cy.getActiveModal().find('#form_item_secure').should('exist').clear().type(secure)
|
||||
cy.getActiveModal().find("button").contains("Save").click(); |
||||
|
||||
cy.toastWait( |
||||
"Successfully installed and email notification will use SMTP configuration" |
||||
); |
||||
settingsPage.closeMenu(); |
||||
}; |
||||
|
||||
resetSMTP = () => { |
||||
cy.getActiveModal() |
||||
.find(".nc-app-store-card-SMTP") |
||||
.click() |
||||
.then((obj) => { |
||||
cy.wrap(obj).find(".nc-app-store-card-reset").click({ force: true }); |
||||
}); |
||||
cy.getActiveModal().find("button").contains("Confirm").click(); |
||||
|
||||
cy.toastWait("Plugin uninstalled successfully"); |
||||
settingsPage.closeMenu(); |
||||
}; |
||||
|
||||
shareView = () => { |
||||
return cy.get(".nc-btn-share-view").should("exist"); |
||||
}; |
||||
|
||||
shareViewList = () => { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
return cy |
||||
.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Shared View List"); |
||||
}; |
||||
|
||||
downloadCsv = () => { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
return cy |
||||
.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Download as CSV"); |
||||
}; |
||||
|
||||
downloadExcel = () => { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
return cy |
||||
.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Download as XLSX"); |
||||
}; |
||||
|
||||
uploadCsv = () => { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
return cy |
||||
.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Upload CSV"); |
||||
}; |
||||
|
||||
automations = () => { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
return cy |
||||
.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".ant-dropdown-menu-item") |
||||
.contains("Webhooks"); |
||||
}; |
||||
|
||||
hideAllColumns = () => { |
||||
cy.get(".nc-fields-menu-btn").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(".ant-btn") |
||||
.contains("Hide all") |
||||
.click(); |
||||
cy.get(".nc-fields-menu-btn").should("exist").click(); |
||||
}; |
||||
|
||||
showAllColumns = () => { |
||||
cy.get(".nc-fields-menu-btn").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(".ant-btn") |
||||
.contains("Show all") |
||||
.click(); |
||||
cy.get(".nc-fields-menu-btn").should("exist").click(); |
||||
}; |
||||
|
||||
toggleShowSystemFields = () => { |
||||
cy.get(".nc-fields-menu-btn").should("exist").click(); |
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(".nc-fields-show-system-fields") |
||||
.click(); |
||||
cy.get(".nc-fields-menu-btn").should("exist").click(); |
||||
}; |
||||
|
||||
hideField = (field) => { |
||||
cy.get(`th[data-title="${field}"]`).should("be.visible"); |
||||
cy.get(".nc-fields-menu-btn").click(); |
||||
// cy.getActiveMenu(".nc-dropdown-fields-menu")
|
||||
// .find(`.nc-fields-list label:contains(${field}):visible`)
|
||||
// .click();
|
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(`.nc-fields-list label:visible`) |
||||
.contains(new RegExp("^" + field + "$", "g")) |
||||
.click(); |
||||
cy.get(".nc-fields-menu-btn").click(); |
||||
cy.get(`th[data-title="${field}"]`).should("not.exist"); |
||||
}; |
||||
|
||||
unhideField = (field, viewType = "grid") => { |
||||
if (viewType === "grid") { |
||||
cy.get(`th[data-title="${field}"]`).should("not.exist"); |
||||
} |
||||
cy.get(`th[data-title="${field}"]`).should("not.exist"); |
||||
cy.get(".nc-fields-menu-btn").click(); |
||||
// cy.getActiveMenu(".nc-dropdown-fields-menu")
|
||||
// .find(`.nc-fields-list label:contains(${field}):visible`)
|
||||
// .click();
|
||||
cy.getActiveMenu(".nc-dropdown-fields-menu") |
||||
.find(`.nc-fields-list label:visible`) |
||||
.contains(new RegExp("^" + field + "$", "g")) |
||||
.click(); |
||||
cy.get(".nc-fields-menu-btn").click(); |
||||
if (viewType === "grid") { |
||||
cy.get(`th[data-title="${field}"]`).should("be.visible"); |
||||
} |
||||
}; |
||||
|
||||
sortField = (field, criteria) => { |
||||
cy.get(".nc-sort-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-sort-menu") |
||||
.find(".ant-btn-primary") |
||||
.contains("Add Sort Option") |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-sort-menu:has(.nc-sort-field-select div)") |
||||
.find(".nc-sort-field-select div") |
||||
.first() |
||||
.click(); |
||||
cy.getActiveSelection(".nc-dropdown-toolbar-field-list") |
||||
.find(`.ant-select-item`) |
||||
.contains(new RegExp("^" + field + "$", "g")) |
||||
.should("exist") |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-sort-menu") |
||||
.find(".nc-sort-dir-select div") |
||||
.first() |
||||
.click(); |
||||
cy.getActiveSelection(".nc-dropdown-sort-dir") |
||||
.find(`.ant-select-item`) |
||||
.contains(criteria) |
||||
.should("exist") |
||||
.click(); |
||||
cy.get(".nc-sort-menu-btn").click(); |
||||
}; |
||||
|
||||
clearSort = () => { |
||||
cy.get(".nc-sort-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-sort-menu") |
||||
.find(".nc-sort-item-remove-btn") |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-sort-menu") |
||||
.find(".nc-sort-item-remove-btn:visible") |
||||
.should("not.exist"); |
||||
cy.get(".nc-sort-menu-btn").click(); |
||||
}; |
||||
|
||||
filterField = (field, operation, value) => { |
||||
cy.get(".nc-filter-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-filter-menu") |
||||
.find(".ant-btn-primary") |
||||
.contains("Add Filter") |
||||
.click(); |
||||
|
||||
cy.getActiveMenu(".nc-dropdown-filter-menu:has(.nc-filter-field-select)") |
||||
.find(".nc-filter-field-select") |
||||
.should("exist") |
||||
.last() |
||||
.click(); |
||||
cy.getActiveSelection(".nc-dropdown-toolbar-field-list") |
||||
.find(`.ant-select-item`) |
||||
.contains(new RegExp("^" + field + "$", "g")) |
||||
.should("exist") |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-filter-menu") |
||||
.find(".nc-filter-operation-select") |
||||
.should("exist") |
||||
.last() |
||||
.click(); |
||||
cy.getActiveSelection(".nc-dropdown-filter-comp-op") |
||||
.find(`.ant-select-item`) |
||||
.contains(operation) |
||||
.should("exist") |
||||
.click(); |
||||
if (operation != "is null" && operation != "is not null") { |
||||
cy.get(".nc-filter-value-select").should("exist").last().type(value); |
||||
} |
||||
cy.get(".nc-filter-menu-btn").click(); |
||||
}; |
||||
|
||||
filterReset = () => { |
||||
cy.get(".nc-filter-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-filter-menu") |
||||
.find(".nc-filter-item-remove-btn") |
||||
.click(); |
||||
cy.getActiveMenu(".nc-dropdown-filter-menu") |
||||
.find(".nc-filter-item-remove-btn") |
||||
.should("not.exist"); |
||||
cy.get(".nc-filter-menu-btn").click(); |
||||
}; |
||||
|
||||
// delete created views
|
||||
//
|
||||
deleteCreatedViews = () => { |
||||
this.shareViewList().click(); |
||||
|
||||
cy.get('th:contains("View Link")') |
||||
.should("be.visible") |
||||
.parent() |
||||
.parent() |
||||
.next() |
||||
.find("tr") |
||||
.each(($tableRow) => { |
||||
cy.log($tableRow[0].childElementCount); |
||||
|
||||
// one of the row would contain seggregation header ('other views)
|
||||
if (5 == $tableRow[0].childElementCount) { |
||||
cy.wrap($tableRow).find(".nc-icon").last().click(); |
||||
cy.toastWait("Deleted shared view successfully"); |
||||
} |
||||
}) |
||||
.then(() => { |
||||
cy.getActiveModal() |
||||
.find("button.ant-modal-close") |
||||
.should("exist") |
||||
.click(); |
||||
}); |
||||
}; |
||||
|
||||
// download CSV & verify
|
||||
// download folder is configurable in cypress.
|
||||
// trigger download
|
||||
// wait for a while & check in configured download folder for the intended file
|
||||
// if it exists, verify it against 'expectedRecords' passed in as parameter
|
||||
//
|
||||
downloadAndVerifyCsv = (filename, verifyCsv, role) => { |
||||
if (role === "commenter" || role === "viewer") { |
||||
cy.get(".nc-actions-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".nc-project-menu-item") |
||||
.contains("Download as CSV") |
||||
.click(); |
||||
} else { |
||||
cy.get(".nc-actions-menu-btn").click(); |
||||
cy.getActiveMenu(".nc-dropdown-actions-menu") |
||||
.find(".nc-project-menu-item") |
||||
.contains("Download") |
||||
.click(); |
||||
cy.get(".nc-project-menu-item:contains('Download as CSV')") |
||||
.should("exist") |
||||
.click(); |
||||
} |
||||
|
||||
cy.toastWait("Successfully exported all table data").then(() => { |
||||
// download folder path, read from config file
|
||||
const downloadsFolder = Cypress.config("downloadsFolder"); |
||||
let filePath = path.join(downloadsFolder, filename); |
||||
|
||||
// append download folder path with filename to generate full file path, retrieve file
|
||||
cy.readFile(filePath).then((fileData) => { |
||||
// from CSV, split into records (rows)
|
||||
const rows = fileData.replace(/\r\n/g, "\n").split("\n"); |
||||
verifyCsv(rows); |
||||
deleteDownloadsFolder(); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
downloadAndVerifyCsvFromSharedView = (filename, verifyCsv) => { |
||||
cy.get(".nc-actions-menu-btn").click(); |
||||
cy.get(".nc-project-menu-item:contains('Download as CSV')") |
||||
.should("exist") |
||||
.click(); |
||||
|
||||
cy.toastWait("Successfully exported all table data").then(() => { |
||||
// download folder path, read from config file
|
||||
const downloadsFolder = Cypress.config("downloadsFolder"); |
||||
let filePath = path.join(downloadsFolder, filename); |
||||
|
||||
// append download folder path with filename to generate full file path, retrieve file
|
||||
cy.readFile(filePath).then((fileData) => { |
||||
// from CSV, split into records (rows)
|
||||
const rows = fileData.replace(/\r\n/g, "\n").split("\n"); |
||||
verifyCsv(rows); |
||||
deleteDownloadsFolder(); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
getIFrameCell = (columnHeader, cellNumber) => { |
||||
return cy |
||||
.iframe() |
||||
.find(`tbody > :nth-child(${cellNumber}) > [data-col="${columnHeader}"]`); |
||||
}; |
||||
|
||||
// https://docs.cypress.io/guides/core-concepts/variables-and-aliases#Sharing-Context
|
||||
getDatatype = (tableName, columnName) => { |
||||
cy.window().then((win) => { |
||||
const col = win.$nuxt.$store.state.meta.metas[tableName].columns; |
||||
let dataType = ""; |
||||
col.forEach((element) => { |
||||
if (element.cn == columnName) dataType = element.uidt; |
||||
}); |
||||
cy.wrap(dataType).as("ncDatatype"); |
||||
}); |
||||
}; |
||||
|
||||
openMetaTab() { |
||||
// open Project metadata tab
|
||||
//
|
||||
settingsPage.openMenu(settingsPage.PROJ_METADATA); |
||||
settingsPage.openTab(settingsPage.METADATA); |
||||
} |
||||
|
||||
closeMetaTab() { |
||||
// close Project metadata tab
|
||||
settingsPage.closeMenu(); |
||||
} |
||||
|
||||
metaSyncValidate(tbl, msg) { |
||||
// http://localhost:8080/api/v1/db/meta/projects/p_bxp57hmks0n5o2/meta-diff
|
||||
cy.intercept("GET", "/api/v1/db/meta/projects/**").as("metaSync"); |
||||
|
||||
cy.get(".nc-btn-metasync-reload").should("exist").click(); |
||||
cy.wait("@metaSync"); |
||||
|
||||
cy.get(`.nc-metasync-row-${tbl}:contains(${msg})`).should("exist"); |
||||
cy.get(".nc-btn-metasync-sync-now") |
||||
.should("exist") |
||||
.click() |
||||
.then(() => { |
||||
cy.toastWait(`Table metadata recreated successfully`); |
||||
}); |
||||
cy.get(".nc-metasync-row").then((row) => { |
||||
for (let i = 0; i < row.length; i++) { |
||||
cy.wrap(row).contains("No change identified").should("exist"); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
tabReset() {} |
||||
|
||||
toggleRightSidebar() { |
||||
cy.get(".nc-toggle-right-navbar").should("exist").click(); |
||||
} |
||||
|
||||
openMiscTab() { |
||||
// open Project metadata tab
|
||||
//
|
||||
settingsPage.openMenu(settingsPage.PROJ_METADATA); |
||||
settingsPage.openTab(settingsPage.MISC); |
||||
} |
||||
|
||||
toggleShowMMSetting() { |
||||
// toggle show MM setting
|
||||
//
|
||||
this.openMiscTab(); |
||||
cy.get(".nc-settings-meta-misc").click(); |
||||
|
||||
settingsPage.openTab(settingsPage.TEAM_N_AUTH); |
||||
this.closeMetaTab(); |
||||
} |
||||
|
||||
openErdTab() { |
||||
// open Project metadata tab
|
||||
//
|
||||
settingsPage.openMenu(settingsPage.PROJ_METADATA); |
||||
settingsPage.openTab(settingsPage.ERD); |
||||
} |
||||
|
||||
openTableErdView() { |
||||
cy.get(".nc-actions-menu-btn").should("exist").click(); |
||||
cy.get(".nc-view-action-erd").should("exist").click(); |
||||
} |
||||
} |
||||
|
||||
export const mainPage = new _mainPage(); |
||||
export const settingsPage = new _settingsPage(); |
||||
|
||||
|
@ -1,289 +0,0 @@
|
||||
import { roles, staticProjects, defaultDbParams } from "./projectConstants"; |
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Sign in/ Sign up page
|
||||
|
||||
// list of hard-wired URL that can be used by nocodb
|
||||
// suffix to baseUrl needs to be defined here
|
||||
//
|
||||
const urlPool = { |
||||
ncUrlBase: "/", |
||||
ncUrlSignUp: "#/signup", |
||||
ncUrlSignIn: "#/signin", |
||||
}; |
||||
|
||||
export class _loginPage { |
||||
// prefix: baseUrl
|
||||
go(urlKey) { |
||||
cy.visit(urlKey); |
||||
} |
||||
|
||||
// visit SignIn URL, enter credentials passed as parameters
|
||||
//
|
||||
signIn(userCredentials) { |
||||
this.go(urlPool.ncUrlBase); |
||||
|
||||
cy.get('input[type="text"]', { timeout: 20000 }).type( |
||||
userCredentials.username |
||||
); |
||||
cy.get('input[type="password"]').type(userCredentials.password); |
||||
cy.get('button:contains("SIGN IN")').click(); |
||||
|
||||
this.waitProjectPageLoad(); |
||||
} |
||||
|
||||
// visit SignUp URL, enter credentials passed as parameters
|
||||
//
|
||||
signUp(userCredentials) { |
||||
this.go(urlPool.ncUrlSignUp); |
||||
|
||||
cy.get('input[type="text"]', { timeout: 20000 }).type( |
||||
userCredentials.username |
||||
); |
||||
cy.get('input[type="password"]').type(userCredentials.password); |
||||
cy.get('button:contains("SIGN UP")').click(); |
||||
|
||||
this.waitProjectPageLoad(); |
||||
} |
||||
|
||||
// logout signed up user
|
||||
//
|
||||
signOut() { |
||||
cy.get(".nc-user-menu").click(); |
||||
cy.get(".nc-user-menu-signout").click(); |
||||
|
||||
this.waitLoginPageLoad(); |
||||
} |
||||
|
||||
// delay/ wait utility routines
|
||||
//
|
||||
waitProjectPageLoad() { |
||||
cy.get(".nc-new-project-menu").should("exist"); |
||||
} |
||||
|
||||
waitLoginPageLoad() { |
||||
cy.get(".nc-form-signin").should("exist"); |
||||
} |
||||
|
||||
// standard pre-project activity
|
||||
//
|
||||
loginAndOpenProject(apiType, dbType) { |
||||
loginPage.signIn(roles.owner.credentials); |
||||
projectsPage.openConfiguredProject(apiType, dbType); |
||||
} |
||||
} |
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Projects page
|
||||
|
||||
export class _projectsPage { |
||||
// Project creation options
|
||||
//
|
||||
|
||||
// {dbType, apiType, name}
|
||||
// for external database, {databaseType, hostAddress, portNumber, username, password, databaseName}
|
||||
|
||||
openConfiguredProject(apiType, dbType) { |
||||
// http://localhost:8080/api/v1/db/meta/projects/p_kfxgmcd5jpyrje/users?limit=10&offset=0&query=
|
||||
cy.intercept("/**/users?limit=*&offset=*&query=*").as("waitForPageLoad"); |
||||
|
||||
if (dbType === "mysql") { |
||||
projectsPage.openProject(staticProjects.externalREST.basic.name); |
||||
} else if (dbType === "xcdb") { |
||||
projectsPage.openProject(staticProjects.sampleREST.basic.name); |
||||
} else if (dbType === "postgres") { |
||||
projectsPage.openProject(staticProjects.pgExternalREST.basic.name); |
||||
} |
||||
|
||||
cy.wait("@waitForPageLoad"); |
||||
|
||||
// close team & auth tab
|
||||
cy.closeTableTab(); |
||||
} |
||||
|
||||
// Open existing project
|
||||
//
|
||||
openProject(projectName) { |
||||
cy.get(".ant-table-row").contains(`${projectName}`).should("exist").click(); |
||||
|
||||
// takes a while to load project
|
||||
this.waitHomePageLoad(); |
||||
} |
||||
|
||||
// Create new project
|
||||
// Input:
|
||||
// projectData {dbType, apiType, name}
|
||||
// dbCredentials {databaseType, hostAddress, portNumber, username, password, databaseName}
|
||||
// Returns: projectName
|
||||
//
|
||||
// To configure
|
||||
// SSL & advanced parameters
|
||||
// Database type selection
|
||||
//
|
||||
createProject(projectData, cred) { |
||||
cy.get("body", { timeout: 2000 }); |
||||
|
||||
let projectName = projectData.name; |
||||
if (projectData.name == "") projectName = "test_proj" + Date.now(); |
||||
|
||||
// click on "New Project"
|
||||
cy.get(".nc-new-project-menu").should("exist").click(); |
||||
|
||||
if ("none" == projectData.dbType) { |
||||
// Subsequent form, select (+ Create) option
|
||||
cy.get(".nc-create-xc-db-project", { timeout: 20000 }).last().click({ |
||||
force: true, |
||||
}); |
||||
|
||||
// wait for page load by verifying required elements
|
||||
cy.get(".nc-metadb-project-name").should("exist"); |
||||
cy.contains("button", "Create").should("exist"); |
||||
|
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
// feed project name
|
||||
cy.get(".nc-metadb-project-name", { timeout: 20000 }) |
||||
.clear() |
||||
.type(projectName); |
||||
|
||||
// Submit
|
||||
cy.contains("button", "Create", { timeout: 20000 }).click(); |
||||
|
||||
// takes a while to load project
|
||||
this.waitHomePageLoad(); |
||||
|
||||
return projectName; |
||||
} |
||||
|
||||
// dbType == 'external'
|
||||
else { |
||||
// Subsequent form, select (+ Create by connection to external database) option
|
||||
cy.get(".nc-create-external-db-project", { timeout: 20000 }) |
||||
.last() |
||||
.click({ |
||||
force: true, |
||||
}); |
||||
|
||||
// wait for page load by verifying required elements
|
||||
cy.get(".nc-extdb-host-database").should("exist"); |
||||
cy.get(".nc-extdb-proj-name").should("exist"); |
||||
cy.get(".nc-extdb-btn-test-connection").should("exist"); |
||||
|
||||
cy.inputHighlightRenderWait(); |
||||
|
||||
cy.get(".nc-extdb-proj-name").clear().type(projectName); |
||||
|
||||
if (cred.databaseType === 1) { |
||||
cy.get(".nc-extdb-db-type").should("exist").click(); |
||||
cy.getActiveSelection(".nc-dropdown-ext-db-type") |
||||
.find(".ant-select-item-option") |
||||
.contains("PostgreSQL") |
||||
.click(); |
||||
} |
||||
|
||||
if (cred.databaseName !== "") { |
||||
cy.get(".nc-extdb-host-database").clear().type(cred.databaseName); |
||||
} |
||||
|
||||
// Test database connection
|
||||
cy.contains("Test Database Connection", { timeout: 20000 }).click(); |
||||
|
||||
// Create project
|
||||
cy.contains("Ok & Save Project", { timeout: 20000 }).click(); |
||||
|
||||
// takes a while to load project
|
||||
this.waitHomePageLoad(); |
||||
|
||||
return projectName; |
||||
} |
||||
} |
||||
|
||||
// // create REST default project (sakila DB)
|
||||
// //
|
||||
// createDefaulRestProject() {
|
||||
// return this.createProject(
|
||||
// { dbType: 1, apiType: 0, name: "" },
|
||||
// defaultDbParams
|
||||
// );
|
||||
// }
|
||||
|
||||
// // search project with given key
|
||||
// // return project-name array
|
||||
// //
|
||||
// searchProject(projectNameKey) {
|
||||
// cy.get('input[placeholder="Search Project"]').type(projectNameKey);
|
||||
//
|
||||
// const projectName = [];
|
||||
//
|
||||
// cy.get("table tr")
|
||||
// .each((tableRow) => {
|
||||
// cy.wrap(tableRow)
|
||||
// .find("td")
|
||||
// .eq(0)
|
||||
// .find(".title")
|
||||
// .then((input) => {
|
||||
// projectName.push(input.text());
|
||||
// });
|
||||
// })
|
||||
// .then(() => {
|
||||
// // TBD: validate project name to contain search key
|
||||
// console.log(projectName);
|
||||
// return projectName;
|
||||
// });
|
||||
// }
|
||||
|
||||
// remove specified project entry
|
||||
//
|
||||
deleteProject(projectName) { |
||||
cy.log("Delete project: " + projectName); |
||||
cy.get(".nc-noco-brand-icon").should("exist").click(); |
||||
cy.get(".ant-table-row") |
||||
.contains(`${projectName}`) |
||||
.should("exist") |
||||
.then(($obj) => { |
||||
cy.log($obj); |
||||
cy.wrap($obj).parent().parent().find(".ant-table-cell").last().click(); |
||||
}); |
||||
|
||||
// pop-up, submit
|
||||
cy.getActiveModal().find('button:contains("Yes")').click({}); |
||||
} |
||||
|
||||
// remove all projects created
|
||||
//
|
||||
// 1. read all project names to be deleted, store in array
|
||||
// 2. invoke delete project for each entry in array
|
||||
//
|
||||
// deleteAllProject() {
|
||||
|
||||
// const projectName = []
|
||||
|
||||
// cy.get('table tr').each((tableRow) => {
|
||||
|
||||
// cy.wrap(tableRow).find('td').eq(0).find('.title').then((input) => {
|
||||
// projectName.push(input.text())
|
||||
// })
|
||||
// })
|
||||
// .then(() => {
|
||||
// console.log(projectName)
|
||||
// projectName.forEach(element => {
|
||||
|
||||
// // bring back the DOM to normalcy
|
||||
// cy.get('div').parentsUntil('body')
|
||||
// this.deleteProject(element)
|
||||
|
||||
// // wait needed for pop up to disapper
|
||||
// this.waitDeletePageLoad()
|
||||
// })
|
||||
// })
|
||||
// }
|
||||
|
||||
waitHomePageLoad() { |
||||
cy.url({ timeout: 50000 }).should("contain", "/#/nc/p_"); |
||||
} |
||||
} |
||||
|
||||
export const loginPage = new _loginPage(); |
||||
export const projectsPage = new _projectsPage(); |
||||
|
||||
|
@ -1,180 +0,0 @@
|
||||
export const defaultDbParams = { |
||||
databaseType: 0, // MySQL
|
||||
hostAddress: "localhost", |
||||
portNumber: "3306", |
||||
username: "root", |
||||
password: "password", |
||||
databaseName: "sakila", |
||||
}; |
||||
|
||||
export const defaultPgDbParams = { |
||||
databaseType: 1, // Postgres
|
||||
hostAddress: "localhost", |
||||
portNumber: "5432", |
||||
username: "postgres", |
||||
password: "password", |
||||
databaseName: "postgres", |
||||
}; |
||||
|
||||
// database
|
||||
// validation details
|
||||
// advSettings: left navigation bar (audit, metadata, auth, transient view modes)
|
||||
// editSchema: create table, add/update/delete column
|
||||
// editData: add/ update/ delete row, cell contents
|
||||
// editComment: add comment
|
||||
// shareView: right navigation bar (share options)
|
||||
export const roles = { |
||||
owner: { |
||||
name: "owner", |
||||
credentials: { username: "user@nocodb.com", password: "Password123." }, |
||||
validations: { |
||||
advSettings: true, |
||||
editSchema: true, |
||||
editData: true, |
||||
editComment: true, |
||||
shareView: true, |
||||
}, |
||||
}, |
||||
creator: { |
||||
name: "creator", |
||||
credentials: { |
||||
username: "creator@nocodb.com", |
||||
password: "Password123.", |
||||
}, |
||||
validations: { |
||||
advSettings: true, |
||||
editSchema: true, |
||||
editData: true, |
||||
editComment: true, |
||||
shareView: true, |
||||
}, |
||||
}, |
||||
editor: { |
||||
name: "editor", |
||||
credentials: { |
||||
username: "editor@nocodb.com", |
||||
password: "Password123.", |
||||
}, |
||||
validations: { |
||||
advSettings: false, |
||||
editSchema: false, |
||||
editData: true, |
||||
editComment: true, |
||||
shareView: false, |
||||
}, |
||||
}, |
||||
commenter: { |
||||
name: "commenter", |
||||
credentials: { |
||||
username: "commenter@nocodb.com", |
||||
password: "Password123.", |
||||
}, |
||||
validations: { |
||||
advSettings: false, |
||||
editSchema: false, |
||||
editData: false, |
||||
editComment: true, |
||||
shareView: false, |
||||
}, |
||||
}, |
||||
viewer: { |
||||
name: "viewer", |
||||
credentials: { |
||||
username: "viewer@nocodb.com", |
||||
password: "Password123.", |
||||
}, |
||||
validations: { |
||||
advSettings: false, |
||||
editSchema: false, |
||||
editData: false, |
||||
editComment: false, |
||||
shareView: false, |
||||
}, |
||||
}, |
||||
}; |
||||
|
||||
// default projects
|
||||
//
|
||||
export const staticProjects = { |
||||
sampleREST: { |
||||
basic: { dbType: "none", apiType: "REST", name: "sampleREST" }, |
||||
config: {}, |
||||
}, |
||||
sampleGQL: { |
||||
basic: { dbType: "none", apiType: "GQL", name: "sampleGQL" }, |
||||
config: {}, |
||||
}, |
||||
externalREST: { |
||||
basic: { dbType: "external", apiType: "REST", name: "externalREST" }, |
||||
config: defaultDbParams, |
||||
}, |
||||
externalGQL: { |
||||
basic: { dbType: "external", apiType: "GQL", name: "externalGQL" }, |
||||
config: defaultDbParams, |
||||
}, |
||||
pgExternalREST: { |
||||
basic: { dbType: "external", apiType: "REST", name: "pgExtREST" }, |
||||
config: defaultPgDbParams, |
||||
}, |
||||
pgExternalGQL: { |
||||
basic: { dbType: "external", apiType: "GQL", name: "pgExternalGQL" }, |
||||
config: defaultPgDbParams, |
||||
}, |
||||
}; |
||||
|
||||
// return TRUE if test suite specified is activated from env-variables
|
||||
//
|
||||
export const isTestSuiteActive = (apiType, dbType) => { |
||||
const env = Cypress.env("testMode"); |
||||
return env.some( |
||||
(element) => element.apiType === apiType && element.dbType === dbType |
||||
); |
||||
}; |
||||
|
||||
let currentTestMode = { apiType: null, dbType: null }; |
||||
let xcdbProjectString = ``; |
||||
export function setCurrentMode(apiType, dbType) { |
||||
currentTestMode = { apiType: apiType, dbType: dbType }; |
||||
} |
||||
|
||||
export function getCurrentMode() { |
||||
return currentTestMode; |
||||
} |
||||
|
||||
export function isXcdb() { |
||||
return currentTestMode.dbType === "xcdb"; |
||||
} |
||||
|
||||
export function isPostgres() { |
||||
return currentTestMode.dbType === "postgres"; |
||||
} |
||||
|
||||
export function setProjectString(projStr) { |
||||
xcdbProjectString = projStr; |
||||
} |
||||
|
||||
export function getProjectString() { |
||||
return xcdbProjectString; |
||||
} |
||||
|
||||
const mysqlSakilaTables = [ |
||||
'actor', 'address', 'category', 'city', 'country', 'customer', 'film', 'film_text', 'language', 'payment', 'rental', 'staff' |
||||
] |
||||
|
||||
const mysqlSakilaSqlViews = [ |
||||
'actor_info', 'customer_list', 'film_list', 'nicer_but_slower_film_list', 'sales_by_film_category', 'sales_by_store', 'staff_list' |
||||
] |
||||
|
||||
const pgSakilaTables = [ |
||||
'actor', 'address', 'category', 'city', 'country', 'customer', 'film', 'language', 'payment', 'payment_p2007_01', 'payment_p2007_02', 'payment_p2007_03', 'payment_p2007_04', 'payment_p2007_05', 'payment_p2007_06', 'rental', 'staff' |
||||
] |
||||
|
||||
const pgSakilaSqlViews = [ |
||||
'actor_info', 'customer_list', 'film_list', 'nicer_but_slower_film_list', 'sales_by_film_category', 'sales_by_store', 'staff_list' |
||||
] |
||||
|
||||
const sqliteSakilaSqlViews = [ |
||||
'actor_info', 'customer_list', 'film_list', 'nice_but_slower_film_list', 'sales_by_film_category', 'sales_by_store', 'staff_list' |
||||
] |
||||
|
||||
export { mysqlSakilaTables, mysqlSakilaSqlViews, pgSakilaTables, pgSakilaSqlViews, sqliteSakilaSqlViews } |
Loading…
Reference in new issue