Browse Source

chore(test): remove cypress directory

pull/4492/head
Wing-Kam Wong 2 years ago
parent
commit
12715ebca4
  1. 53
      scripts/cypress/cypress.json
  2. 67
      scripts/cypress/docker-compose-cypress.yml
  3. 17
      scripts/cypress/docker-compose-pg-cy-quick.yml
  4. 17
      scripts/cypress/docker-compose-pg.yml
  5. 5
      scripts/cypress/fixtures/example.json
  6. BIN
      scripts/cypress/fixtures/images/avatar-1.JPG
  7. BIN
      scripts/cypress/fixtures/images/avatar-2.JPG
  8. BIN
      scripts/cypress/fixtures/images/avatar-3.JPG
  9. BIN
      scripts/cypress/fixtures/images/avatar-4.JPG
  10. BIN
      scripts/cypress/fixtures/images/avatar-5.JPG
  11. BIN
      scripts/cypress/fixtures/images/avatar-6.JPG
  12. 5
      scripts/cypress/fixtures/sampleFiles/1.json
  13. 4
      scripts/cypress/fixtures/sampleFiles/2.json
  14. 4
      scripts/cypress/fixtures/sampleFiles/3.json
  15. 4
      scripts/cypress/fixtures/sampleFiles/4.json
  16. 4
      scripts/cypress/fixtures/sampleFiles/5.json
  17. 4
      scripts/cypress/fixtures/sampleFiles/6.json
  18. BIN
      scripts/cypress/fixtures/sampleFiles/Financial Sample.xlsx
  19. 16
      scripts/cypress/fixtures/sampleFiles/iFrame.html
  20. BIN
      scripts/cypress/fixtures/sampleFiles/sample.xlsx
  21. BIN
      scripts/cypress/fixtures/sampleFiles/simple.xlsx
  22. 1250
      scripts/cypress/fixtures/sqlite-sakila/regenFiles/index.js
  23. 854
      scripts/cypress/fixtures/sqlite-sakila/regenFiles/package-lock.json
  24. 14
      scripts/cypress/fixtures/sqlite-sakila/regenFiles/package.json
  25. 6
      scripts/cypress/fixtures/sqlite-sakila/regenFiles/recreate_sakila_sqlite.sh
  26. 45
      scripts/cypress/fixtures/sqlite-sakila/regenFiles/sqlite-sakila-delete-data.sql
  27. 70
      scripts/cypress/fixtures/sqlite-sakila/regenFiles/sqlite-sakila-drop-objects.sql
  28. 231504
      scripts/cypress/fixtures/sqlite-sakila/regenFiles/sqlite-sakila-insert-data.sql
  29. 647
      scripts/cypress/fixtures/sqlite-sakila/regenFiles/sqlite-sakila-schema.sql
  30. BIN
      scripts/cypress/fixtures/sqlite-sakila/sakila.db
  31. 261
      scripts/cypress/integration/common/00_pre_configurations.js
  32. 106
      scripts/cypress/integration/common/1a_table_operations.js
  33. 200
      scripts/cypress/integration/common/1b_table_column_operations.js
  34. 143
      scripts/cypress/integration/common/1c_sql_view.js
  35. 147
      scripts/cypress/integration/common/1d_pg_table_view_drag_drop_reorder.js
  36. 156
      scripts/cypress/integration/common/1d_table_view_drag_drop_reorder.js
  37. 169
      scripts/cypress/integration/common/1e_meta_sync.js
  38. 182
      scripts/cypress/integration/common/1e_pg_meta_sync.js
  39. 118
      scripts/cypress/integration/common/2a_table_with_belongs_to_colulmn.js
  40. 130
      scripts/cypress/integration/common/2b_table_with_m2m_column.js
  41. 198
      scripts/cypress/integration/common/3a_filter_sort_fields_operations.js
  42. 369
      scripts/cypress/integration/common/3b_formula_column.js
  43. 110
      scripts/cypress/integration/common/3c_lookup_column.js
  44. 147
      scripts/cypress/integration/common/3d_rollup_column.js
  45. 296
      scripts/cypress/integration/common/3e_duration_column.js
  46. 380
      scripts/cypress/integration/common/3f_link_to_another_record.js
  47. 95
      scripts/cypress/integration/common/4a_table_view_grid_gallery_form.js
  48. 120
      scripts/cypress/integration/common/4b_table_view_share.js
  49. 406
      scripts/cypress/integration/common/4c_form_view_detailed.js
  50. 107
      scripts/cypress/integration/common/4d_table_view_grid_locked.js
  51. 226
      scripts/cypress/integration/common/4e_form_view_share.js
  52. 477
      scripts/cypress/integration/common/4f_grid_view_share.js
  53. 504
      scripts/cypress/integration/common/4f_pg_grid_view_share.js
  54. 210
      scripts/cypress/integration/common/4g_table_view_expanded_form.js
  55. 541
      scripts/cypress/integration/common/4h_kanban.js
  56. 191
      scripts/cypress/integration/common/4i_survey_form.js
  57. 285
      scripts/cypress/integration/common/5a_user_role.js
  58. 172
      scripts/cypress/integration/common/5b_preview_role.js
  59. 165
      scripts/cypress/integration/common/5c_super_user_role.js
  60. 76
      scripts/cypress/integration/common/6b_downloadCsv.js
  61. 236
      scripts/cypress/integration/common/6c_swagger_api.js
  62. 99
      scripts/cypress/integration/common/6d_language_validation.js
  63. 31
      scripts/cypress/integration/common/6e_project_operations.js
  64. 154
      scripts/cypress/integration/common/6f_attachments.js
  65. 187
      scripts/cypress/integration/common/6g_base_share.js
  66. 63
      scripts/cypress/integration/common/6h_change_password.js
  67. 291
      scripts/cypress/integration/common/7a_create_project_from_excel.js
  68. 80
      scripts/cypress/integration/common/7b_import_from_airtable.js
  69. 429
      scripts/cypress/integration/common/8a_webhook.js
  70. 500
      scripts/cypress/integration/common/9a_QuickTest.js
  71. 574
      scripts/cypress/integration/common/9b_ERD.js
  72. 339
      scripts/cypress/integration/spec/roleValidation.spec.js
  73. 18
      scripts/cypress/integration/test/db-independent.js
  74. 35
      scripts/cypress/integration/test/explicitLogin.js
  75. 52
      scripts/cypress/integration/test/pg-restMisc.js
  76. 21
      scripts/cypress/integration/test/pg-restRoles.js
  77. 40
      scripts/cypress/integration/test/pg-restTableOps.js
  78. 34
      scripts/cypress/integration/test/pg-restViews.js
  79. 19
      scripts/cypress/integration/test/quickTest.js
  80. 55
      scripts/cypress/integration/test/restMisc.js
  81. 21
      scripts/cypress/integration/test/restRoles.js
  82. 38
      scripts/cypress/integration/test/restTableOps.js
  83. 34
      scripts/cypress/integration/test/restViews.js
  84. 57
      scripts/cypress/integration/test/xcdb-restMisc.js
  85. 21
      scripts/cypress/integration/test/xcdb-restRoles.js
  86. 39
      scripts/cypress/integration/test/xcdb-restTableOps.js
  87. 32
      scripts/cypress/integration/test/xcdb-restViews.js
  88. 235
      scripts/cypress/plugins/index.js
  89. 33
      scripts/cypress/plugins/read-xlsx.js
  90. 63
      scripts/cypress/plugins/server.js
  91. 720
      scripts/cypress/support/commands.js
  92. 32
      scripts/cypress/support/index.js
  93. 714
      scripts/cypress/support/page_objects/mainPage.js
  94. 289
      scripts/cypress/support/page_objects/navigation.js
  95. 180
      scripts/cypress/support/page_objects/projectConstants.js

53
scripts/cypress/cypress.json

@ -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
}

67
scripts/cypress/docker-compose-cypress.yml

@ -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

17
scripts/cypress/docker-compose-pg-cy-quick.yml

@ -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

17
scripts/cypress/docker-compose-pg.yml

@ -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

5
scripts/cypress/fixtures/example.json

@ -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"
}

BIN
scripts/cypress/fixtures/images/avatar-1.JPG

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

BIN
scripts/cypress/fixtures/images/avatar-2.JPG

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

BIN
scripts/cypress/fixtures/images/avatar-3.JPG

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

BIN
scripts/cypress/fixtures/images/avatar-4.JPG

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

BIN
scripts/cypress/fixtures/images/avatar-5.JPG

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

BIN
scripts/cypress/fixtures/images/avatar-6.JPG

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

5
scripts/cypress/fixtures/sampleFiles/1.json

@ -1,5 +0,0 @@
{
"country": "Afghanistan",
"city": ["Kabul"]
}

4
scripts/cypress/fixtures/sampleFiles/2.json

@ -1,4 +0,0 @@
{
"country": "Algeria",
"city": ["Batna", "Bchar", "Skikda"]
}

4
scripts/cypress/fixtures/sampleFiles/3.json

@ -1,4 +0,0 @@
{
"country": "Americal Samoa",
"city": ["Tafuna"]
}

4
scripts/cypress/fixtures/sampleFiles/4.json

@ -1,4 +0,0 @@
{
"country": "Angola",
"city": ["Benguela", "Namibe"]
}

4
scripts/cypress/fixtures/sampleFiles/5.json

@ -1,4 +0,0 @@
{
"country": "Anguilla",
"city": ["South Hill"]
}

4
scripts/cypress/fixtures/sampleFiles/6.json

@ -1,4 +0,0 @@
{
"country": "Argentina",
"city": ["Almirante Brown", "Avellaneda", "Beha Blanca", "Crdoba"]
}

BIN
scripts/cypress/fixtures/sampleFiles/Financial Sample.xlsx

Binary file not shown.

16
scripts/cypress/fixtures/sampleFiles/iFrame.html

@ -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>

BIN
scripts/cypress/fixtures/sampleFiles/sample.xlsx

Binary file not shown.

BIN
scripts/cypress/fixtures/sampleFiles/simple.xlsx

Binary file not shown.

1250
scripts/cypress/fixtures/sqlite-sakila/regenFiles/index.js

File diff suppressed because it is too large Load Diff

854
scripts/cypress/fixtures/sqlite-sakila/regenFiles/package-lock.json generated

@ -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=="
}
}
}

14
scripts/cypress/fixtures/sqlite-sakila/regenFiles/package.json

@ -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"
}
}

6
scripts/cypress/fixtures/sqlite-sakila/regenFiles/recreate_sakila_sqlite.sh

@ -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

45
scripts/cypress/fixtures/sqlite-sakila/regenFiles/sqlite-sakila-delete-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
;

70
scripts/cypress/fixtures/sqlite-sakila/regenFiles/sqlite-sakila-drop-objects.sql

@ -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;

231504
scripts/cypress/fixtures/sqlite-sakila/regenFiles/sqlite-sakila-insert-data.sql

File diff suppressed because it is too large Load Diff

647
scripts/cypress/fixtures/sqlite-sakila/regenFiles/sqlite-sakila-schema.sql

@ -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;

BIN
scripts/cypress/fixtures/sqlite-sakila/sakila.db

Binary file not shown.

261
scripts/cypress/integration/common/00_pre_configurations.js

@ -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);
}
});
};

106
scripts/cypress/integration/common/1a_table_operations.js

@ -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");
});
});
};

200
scripts/cypress/integration/common/1b_table_column_operations.js

@ -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);
});
});
};

143
scripts/cypress/integration/common/1c_sql_view.js

@ -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");
}
});
});
};

147
scripts/cypress/integration/common/1d_pg_table_view_drag_drop_reorder.js

@ -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");
});
});
};

156
scripts/cypress/integration/common/1d_table_view_drag_drop_reorder.js

@ -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");
});
});
};

169
scripts/cypress/integration/common/1e_meta_sync.js

@ -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);
});
});
};

182
scripts/cypress/integration/common/1e_pg_meta_sync.js

@ -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");
});
});
};

118
scripts/cypress/integration/common/2a_table_with_belongs_to_colulmn.js

@ -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");
});
});
};

130
scripts/cypress/integration/common/2b_table_with_m2m_column.js

@ -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");
});
});
};

198
scripts/cypress/integration/common/3a_filter_sort_fields_operations.js

@ -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");
});
});
};

369
scripts/cypress/integration/common/3b_formula_column.js

@ -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");
});
});
};

110
scripts/cypress/integration/common/3c_lookup_column.js

@ -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");
});
});
};

147
scripts/cypress/integration/common/3d_rollup_column.js

@ -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");
});
});
};

296
scripts/cypress/integration/common/3e_duration_column.js

@ -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");
});
}
});
};

380
scripts/cypress/integration/common/3f_link_to_another_record.js

@ -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");
});
});
};

95
scripts/cypress/integration/common/4a_table_view_grid_gallery_form.js

@ -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
});
};

120
scripts/cypress/integration/common/4b_table_view_share.js

@ -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();
});
});
};

406
scripts/cypress/integration/common/4c_form_view_detailed.js

@ -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");
});
};

107
scripts/cypress/integration/common/4d_table_view_grid_locked.js

@ -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);
});
};

226
scripts/cypress/integration/common/4e_form_view_share.js

@ -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");
});
};

477
scripts/cypress/integration/common/4f_grid_view_share.js

@ -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();
});
});
};

504
scripts/cypress/integration/common/4f_pg_grid_view_share.js

@ -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();
});
});
};

210
scripts/cypress/integration/common/4g_table_view_expanded_form.js

@ -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
});
};

541
scripts/cypress/integration/common/4h_kanban.js

@ -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");
});
});
};

191
scripts/cypress/integration/common/4i_survey_form.js

@ -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);
});
});
};

285
scripts/cypress/integration/common/5a_user_role.js

@ -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");
};

172
scripts/cypress/integration/common/5b_preview_role.js

@ -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");
});
};

165
scripts/cypress/integration/common/5c_super_user_role.js

@ -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');
});
});
});
};

76
scripts/cypress/integration/common/6b_downloadCsv.js

@ -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");
});
});
};

236
scripts/cypress/integration/common/6c_swagger_api.js

@ -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!")
// })
// })
});
}
};

99
scripts/cypress/integration/common/6d_language_validation.js

@ -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]);
});
};

31
scripts/cypress/integration/common/6e_project_operations.js

@ -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();
});
});
};

154
scripts/cypress/integration/common/6f_attachments.js

@ -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();
});
});
};

187
scripts/cypress/integration/common/6g_base_share.js

@ -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");
});
});
};

63
scripts/cypress/integration/common/6h_change_password.js

@ -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");
})
})
});
};

291
scripts/cypress/integration/common/7a_create_project_from_excel.js

@ -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");
});
});
};

80
scripts/cypress/integration/common/7b_import_from_airtable.js

@ -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();
});
});
};

429
scripts/cypress/integration/common/8a_webhook.js

@ -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, "");
});
});
};

500
scripts/cypress/integration/common/9a_QuickTest.js

@ -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");

574
scripts/cypress/integration/common/9b_ERD.js

@ -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();
});
});
};

339
scripts/cypress/integration/spec/roleValidation.spec.js

@ -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);
}

18
scripts/cypress/integration/test/db-independent.js

@ -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");

35
scripts/cypress/integration/test/explicitLogin.js

@ -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");

52
scripts/cypress/integration/test/pg-restMisc.js

@ -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");

21
scripts/cypress/integration/test/pg-restRoles.js

@ -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");

40
scripts/cypress/integration/test/pg-restTableOps.js

@ -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");

34
scripts/cypress/integration/test/pg-restViews.js

@ -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");

19
scripts/cypress/integration/test/quickTest.js

@ -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");

55
scripts/cypress/integration/test/restMisc.js

@ -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");

21
scripts/cypress/integration/test/restRoles.js

@ -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");

38
scripts/cypress/integration/test/restTableOps.js

@ -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");

34
scripts/cypress/integration/test/restViews.js

@ -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");

57
scripts/cypress/integration/test/xcdb-restMisc.js

@ -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");

21
scripts/cypress/integration/test/xcdb-restRoles.js

@ -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");

39
scripts/cypress/integration/test/xcdb-restTableOps.js

@ -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");

32
scripts/cypress/integration/test/xcdb-restViews.js

@ -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");

235
scripts/cypress/plugins/index.js

@ -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();
});
});
}

33
scripts/cypress/plugins/read-xlsx.js

@ -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,
};

63
scripts/cypress/plugins/server.js

@ -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;

720
scripts/cypress/support/commands.js

@ -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,
}
)
*/

32
scripts/cypress/support/index.js

@ -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;
});

714
scripts/cypress/support/page_objects/mainPage.js

@ -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();

289
scripts/cypress/support/page_objects/navigation.js

@ -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();

180
scripts/cypress/support/page_objects/projectConstants.js

@ -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…
Cancel
Save