graphdb-workbench-tests 3.4.0-TR4 → 3.4.0-TR5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/.editorconfig +17 -0
  2. package/.nycrc +10 -0
  3. package/cypress-flaky.config.js +20 -6
  4. package/cypress-legacy.config.js +47 -0
  5. package/cypress-security.config.js +36 -0
  6. package/cypress.config.js +45 -6
  7. package/{integration-flaky → e2e-flaky}/explore/visual.graph.spec.js +4 -1
  8. package/{integration-flaky → e2e-flaky}/import/import-server-files-operations.spec.js +2 -2
  9. package/{integration-flaky → e2e-flaky}/import/import-user-data-batch-operations.spec.js +3 -3
  10. package/e2e-flaky/import/import-user-data-url.spec.js +63 -0
  11. package/{integration-flaky → e2e-flaky}/setup/sparql-template-create.js +10 -18
  12. package/{integration-flaky → e2e-flaky}/sparql-editor/actions/execute-update-query.spec.js +2 -12
  13. package/{integration-flaky → e2e-flaky}/sparql-editor/actions/share-query.spec.js +1 -7
  14. package/{integration-flaky → e2e-flaky}/sparql-editor/yasr/table-plugin.spec.js +3 -7
  15. package/{integration → e2e-legacy}/cluster/cluster-states.spec.js +3 -3
  16. package/e2e-legacy/explore/class-hierarchy/class-hierarchy-with-selected-repository-without-class-hierarchy.spec.js +42 -0
  17. package/e2e-legacy/explore/class-hierarchy/class-hierarchy-with-selected-repository.spec.js +43 -0
  18. package/e2e-legacy/explore/class-hierarchy/class-hierarchy-without-selected-repository.spec.js +30 -0
  19. package/{integration/explore → e2e-legacy/explore/class-hierarchy}/class.hierarchy.spec.js +1 -1
  20. package/e2e-legacy/explore/class-relationships/class-relationships-repository-with-data.spec.js +42 -0
  21. package/e2e-legacy/explore/class-relationships/class-relationships-with-selected-repository.spec.js +39 -0
  22. package/e2e-legacy/explore/class-relationships/class-relationships-without-selected-repository.spec.js +21 -0
  23. package/{integration/explore/class.relationships.spec.js → e2e-legacy/explore/class-relationships/class-relationships.spec.js} +20 -50
  24. package/{integration/explore → e2e-legacy/explore/graphs-overview}/graphs.overview.spec.js +4 -4
  25. package/e2e-legacy/explore/graphs-overview/initial-state/graphs-overview-with-selected-repository.spec.js +44 -0
  26. package/e2e-legacy/explore/graphs-overview/initial-state/graphs-overview-without-selected-repository.spec.js +32 -0
  27. package/e2e-legacy/explore/similarity-index/similarity-index-with-repository.spec.js +38 -0
  28. package/e2e-legacy/explore/similarity-index/similarity-index-without-repository.spec.js +21 -0
  29. package/{integration → e2e-legacy}/explore/visual-graph/graphs-config.spec.js +5 -10
  30. package/e2e-legacy/explore/visual-graph/node-info-panel.spec.js +58 -0
  31. package/e2e-legacy/explore/visual-graph/visual-graph-links-limit.spec.js +142 -0
  32. package/{integration → e2e-legacy}/explore/visual-graph/visual-graph-node-labels.spec.js +14 -2
  33. package/e2e-legacy/explore/visual-graph/visual-graph-with-selected-repository.js +38 -0
  34. package/e2e-legacy/explore/visual-graph/visual-graph-without-selected-repository.js +21 -0
  35. package/{integration → e2e-legacy}/explore/visual-graph/visual.graph.spec.js +75 -96
  36. package/{integration → e2e-legacy}/graphql/create-graphql-endpoint.spec.js +0 -2
  37. package/{integration → e2e-legacy}/graphql/edit-graphql-enpoint.spec.js +1 -1
  38. package/{integration → e2e-legacy}/graphql/filter-graphql-endpoints-on-management-view.spec.js +1 -1
  39. package/{integration → e2e-legacy}/graphql/graphql-endpoint-management-view.spec.js +4 -4
  40. package/e2e-legacy/graphql/graphql-endpoint-management-with-endpoints.spec.js +43 -0
  41. package/e2e-legacy/graphql/graphql-endpoint-management-with-selected-repository.spec.js +39 -0
  42. package/e2e-legacy/graphql/graphql-endpoint-management-without-selected-repository.spec.js +21 -0
  43. package/e2e-legacy/graphql/graphql-playground-with-endpoints.spec.js +40 -0
  44. package/e2e-legacy/graphql/graphql-playground-with-selected-repository.spec.js +38 -0
  45. package/e2e-legacy/graphql/graphql-playground-without-selected-repository.spec.js +22 -0
  46. package/{integration → e2e-legacy}/graphql/graphql-playground.spec.js +1 -1
  47. package/e2e-legacy/graphql/graphql-theme.spec.js +73 -0
  48. package/{integration → e2e-legacy}/graphql/import-graphql-endpoint-definitions.spec.js +0 -6
  49. package/e2e-legacy/guides/autocomplete/enable-autocomplete-guide.spec.js +49 -0
  50. package/e2e-legacy/guides/class-hierarcy/class-hierarchy-guide.spec.js +89 -0
  51. package/e2e-legacy/guides/class-relations/class-relations-guide.spec.js +76 -0
  52. package/e2e-legacy/guides/connectors/connectors-guide.spec.js +163 -0
  53. package/e2e-legacy/guides/create-similarity-index/create-similarity-index-guide.spec.js +74 -0
  54. package/e2e-legacy/guides/download-guide-resource/download-guide-resource-guide.js +55 -0
  55. package/e2e-legacy/guides/execute-sparql-query/execute-sparql-query-guide.spec.js +92 -0
  56. package/e2e-legacy/guides/import-rdf-file/confirm-duplicate-rdf-file.spec.js +63 -0
  57. package/e2e-legacy/guides/import-rdf-file/import-rdf-file.spec.js +105 -0
  58. package/e2e-legacy/guides/main-menu/main-menu-guide.spec.js +302 -0
  59. package/e2e-legacy/guides/navigation/navigation-guide.spec.js +64 -0
  60. package/e2e-legacy/guides/rdf-rank/rdf-rank-guide.spec.js +42 -0
  61. package/e2e-legacy/guides/repositories/create-repository-guide.spec.js +69 -0
  62. package/e2e-legacy/guides/table-graph-explore/table-graph-explore-guide.spec.js +168 -0
  63. package/e2e-legacy/guides/ttyg/configure-agent/configure-agent-guide.spec.js +158 -0
  64. package/e2e-legacy/guides/ttyg/conversation/ttyg-conversation-guide.spec.js +92 -0
  65. package/e2e-legacy/guides/ttyg/edit-agent/edit-ttyg-agent-guide.spec.js +88 -0
  66. package/e2e-legacy/guides/visual-graph/visual-graph-guide.spec.js +372 -0
  67. package/e2e-legacy/guides/welcome/welcome-guide.spec.js +36 -0
  68. package/e2e-legacy/help/guides/guides-autostart.spec.js +126 -0
  69. package/e2e-legacy/help/guides/guides-confirm-cancel-dialog.js +83 -0
  70. package/e2e-legacy/help/guides/guides-with-repository.spec.js +32 -0
  71. package/e2e-legacy/help/guides/guides-without-repository.spec.js +20 -0
  72. package/e2e-legacy/help/guides/movies-interactive-guide.spec.js +71 -0
  73. package/{integration/guides/star-wars-interactive-guide.js → e2e-legacy/help/guides/star-wars-interactive-guide.spec.js} +3 -2
  74. package/e2e-legacy/help/rest-api-documentatio/rest-api-documentation-with-repository.spec.js +32 -0
  75. package/e2e-legacy/help/rest-api-documentatio/rest-api-documentation-without-repository.spec.js +20 -0
  76. package/e2e-legacy/help/system-information/system-information-with-repository.spec.js +32 -0
  77. package/e2e-legacy/help/system-information/system-information-without-repository.spec.js +20 -0
  78. package/e2e-legacy/home/cookie-policy/cookie-policy.spec.js +182 -0
  79. package/e2e-legacy/home/documentation-link.spec.js +41 -0
  80. package/{integration → e2e-legacy}/home/google-analytics.spec.js +4 -6
  81. package/e2e-legacy/home/home-page-with-selected-repository.spec.js +69 -0
  82. package/e2e-legacy/home/home-page-without-repositories.spec.js +87 -0
  83. package/e2e-legacy/home/home-page-without-selected-repository.spec.js +59 -0
  84. package/{integration → e2e-legacy}/home/language-change.spec.js +2 -2
  85. package/e2e-legacy/home/rdf-resource-search.spec.js +160 -0
  86. package/e2e-legacy/home/view-resource-autocomplete.spec.js +65 -0
  87. package/{integration → e2e-legacy}/import/import-server-files.spec.js +5 -3
  88. package/{integration → e2e-legacy}/import/import-user-data-file-upload.spec.js +19 -13
  89. package/{integration → e2e-legacy}/import/import-user-data-text-snippet.spec.js +0 -2
  90. package/{integration → e2e-legacy}/import/import-user-data-url.spec.js +0 -23
  91. package/{integration → e2e-legacy}/import/import-user-data.spec.js +11 -4
  92. package/e2e-legacy/import/initial-state/import-page-with-selected-repositor.js +51 -0
  93. package/e2e-legacy/import/initial-state/import-page-with-selected-repository-without-imported-files.js +45 -0
  94. package/e2e-legacy/import/initial-state/import-page-without-selected-repository.spec.js +28 -0
  95. package/e2e-legacy/license/license-with-repository.spec.js +113 -0
  96. package/e2e-legacy/license/license-without-repository.spec.js +103 -0
  97. package/{integration → e2e-legacy}/license/license.spec.js +4 -4
  98. package/e2e-legacy/monitor/backup-and-restore/backup-and-restore-with-repository.spec.js +36 -0
  99. package/e2e-legacy/monitor/backup-and-restore/backup-and-restore-without-repository.spec.js +25 -0
  100. package/{integration/monitor/monitor.backup-and-restore.spec.js → e2e-legacy/monitor/backup-and-restore/backup-and-restore.spec.js} +2 -2
  101. package/{integration → e2e-legacy}/monitor/global-operation-statuses-component.spec.js +12 -5
  102. package/e2e-legacy/monitor/query-and-updates/queries-and-updates-with-repository.spec.js +39 -0
  103. package/e2e-legacy/monitor/query-and-updates/queries-and-updates-without-repository.spec.js +21 -0
  104. package/{integration/monitor → e2e-legacy/monitor/system}/monitor.resources.spec.js +3 -2
  105. package/e2e-legacy/monitor/system/system-monitoring-with-repository.spec.js +32 -0
  106. package/e2e-legacy/monitor/system/system-monitoring-without-repository.spec.js +20 -0
  107. package/e2e-legacy/not-found/not-found.spec.js +23 -0
  108. package/{integration → e2e-legacy}/repository/ontop-repository.spec.js +1 -1
  109. package/{integration → e2e-legacy}/repository/repositories.spec.js +37 -45
  110. package/e2e-legacy/repository/url-with-repository-id-parameter.spec.js +181 -0
  111. package/{integration → e2e-legacy}/resource/resource.spec.js +50 -20
  112. package/e2e-legacy/setup/aclmanagement/acl-management-with-selected repository.spec.js +84 -0
  113. package/e2e-legacy/setup/aclmanagement/acl-management-without-repositories.spec.js +21 -0
  114. package/{integration → e2e-legacy}/setup/aclmanagement/create-rule.spec.js +4 -0
  115. package/e2e-legacy/setup/autocomplete/autocomplete-with-repository.spec.js +40 -0
  116. package/e2e-legacy/setup/autocomplete/autocomplete-without-repository.spec.js +27 -0
  117. package/{integration/setup → e2e-legacy/setup/autocomplete}/autocomplete.spec.js +6 -7
  118. package/e2e-legacy/setup/cluster/cluster-initial-state-with-cluster.spec.js +34 -0
  119. package/e2e-legacy/setup/cluster/cluster-initial-state-without-cluster.spec.js +25 -0
  120. package/e2e-legacy/setup/connectors/connectors-initial-state-with-selected-repository.spec.js +41 -0
  121. package/e2e-legacy/setup/connectors/connectors-initial-state-without-repositories.spec.js +21 -0
  122. package/{integration → e2e-legacy}/setup/connectors-lucene.spec.js +26 -10
  123. package/{integration → e2e-legacy}/setup/jdbc/jdbc-create.spec.js +4 -4
  124. package/e2e-legacy/setup/jdbc/jdbc-with-repository.spec.js +39 -0
  125. package/e2e-legacy/setup/jdbc/jdbc-without-repository.spec.js +27 -0
  126. package/e2e-legacy/setup/namespaces/namespaces-with-repository.spec.js +44 -0
  127. package/e2e-legacy/setup/namespaces/namespaces-without-repository.spec.js +27 -0
  128. package/{integration/setup → e2e-legacy/setup/namespaces}/namespaces.spec.js +6 -5
  129. package/e2e-legacy/setup/plugins/plugins-with-repository.spec.js +38 -0
  130. package/e2e-legacy/setup/plugins/plugins-without-repository.spec.js +28 -0
  131. package/{integration/setup → e2e-legacy/setup/plugins}/plugins.spec.js +3 -3
  132. package/e2e-legacy/setup/rdf-rank/rdf-rank-with-repository.spec.js +40 -0
  133. package/e2e-legacy/setup/rdf-rank/rdf-rank-without-repository.spec.js +30 -0
  134. package/{integration/setup → e2e-legacy/setup/rdf-rank}/rdf-rank.spec.js +3 -5
  135. package/e2e-legacy/setup/repositories/repositories-view-with-repositories.spec.js +40 -0
  136. package/e2e-legacy/setup/repositories/repositories-view-without-repositories.spec.js +28 -0
  137. package/e2e-legacy/setup/settings/my-settings-initial-state.spec.js +86 -0
  138. package/e2e-legacy/setup/settings/my-settings.spec.js +207 -0
  139. package/{integration/setup/sparql-template-create.js → e2e-legacy/setup/sparql-template/sparql-template-create.spec.js} +16 -8
  140. package/e2e-legacy/setup/sparql-template/sparql-template-with-repository.spec.js +39 -0
  141. package/e2e-legacy/setup/sparql-template/sparql-template-without-repository.spec.js +29 -0
  142. package/{integration/setup → e2e-legacy/setup/sparql-template}/sparql-templates.spec.js +4 -4
  143. package/{integration/setup → e2e-legacy/setup/users-and-access}/user-and-access.spec.js +184 -87
  144. package/e2e-legacy/setup/users-and-access/users-and-access-initial-state.spec.js +25 -0
  145. package/{integration → e2e-legacy}/sparql-editor/actions/expand-results-over-sameas.spec.js +12 -12
  146. package/{integration → e2e-legacy}/sparql-editor/actions/include-inferred-statements.spec.js +6 -6
  147. package/{integration → e2e-legacy}/sparql-editor/actions/inferred-sameas.spec.js +10 -8
  148. package/{integration → e2e-legacy}/sparql-editor/actions/show-saved-queries.spec.js +1 -6
  149. package/{integration → e2e-legacy}/sparql-editor/saved-query/abort-query.spec.js +1 -1
  150. package/{integration → e2e-legacy}/sparql-editor/saved-query/edit-query.spec.js +3 -3
  151. package/{integration → e2e-legacy}/sparql-editor/saved-query/readonly-query.spec.js +15 -24
  152. package/{integration → e2e-legacy}/sparql-editor/saved-query/share-query.spec.js +32 -1
  153. package/e2e-legacy/sparql-editor/sparql-page-with-selected-repository.spec.js +33 -0
  154. package/e2e-legacy/sparql-editor/sparql-page-without-selected-repository.spec.js +26 -0
  155. package/{integration → e2e-legacy}/sparql-editor/yasgui-tabs.spec.js +2 -12
  156. package/e2e-legacy/sparql-editor/yasqe-themes.spec.js +54 -0
  157. package/{integration → e2e-legacy}/sparql-editor/yasr/pagination.spec.js +5 -18
  158. package/{integration → e2e-legacy}/sparql-editor/yasr/table-plugin.spec.js +1 -6
  159. package/e2e-legacy/sparql-editor/yasr/toolbar/visual-graph-button.spec.js +106 -0
  160. package/e2e-legacy/sparql-editor/yasr/yasr.spec.js +80 -0
  161. package/{integration → e2e-legacy}/ttyg/agent-list.spec.js +53 -2
  162. package/{integration → e2e-legacy}/ttyg/agent-select-menu.spec.js +25 -2
  163. package/{integration → e2e-legacy}/ttyg/chat-list.spec.js +3 -14
  164. package/{integration → e2e-legacy}/ttyg/chat-panel.spec.js +74 -6
  165. package/{integration → e2e-legacy}/ttyg/clone-agent.spec.js +24 -2
  166. package/{integration → e2e-legacy}/ttyg/create-agent.spec.js +37 -66
  167. package/{integration → e2e-legacy}/ttyg/create-chat.spec.js +6 -4
  168. package/{integration → e2e-legacy}/ttyg/delete-agent.spec.js +1 -2
  169. package/e2e-legacy/ttyg/edit-agent.spec.js +178 -0
  170. package/e2e-legacy/ttyg/ttyg-initial-state-with-configured-api-key.spec.js +46 -0
  171. package/e2e-legacy/ttyg/ttyg-initial-state-with-selected-repository.spec.js +45 -0
  172. package/e2e-legacy/ttyg/ttyg-initial-state-without-repositories.spec.js +21 -0
  173. package/{integration-flaky → e2e-legacy}/ttyg/ttyg-permission.spec.js +23 -17
  174. package/{integration → e2e-legacy}/ttyg/ttyg-view.spec.js +2 -2
  175. package/e2e-security/repository/url-with-repository-id-parameter.spec.js +57 -0
  176. package/e2e-security/setup/home/cookie-policy.spec.js +290 -0
  177. package/e2e-security/setup/users-and-access/create-user-permissions.spec.js +193 -0
  178. package/e2e-security/setup/users-and-access/graphql-user.spec.js +126 -0
  179. package/e2e-security/setup/users-and-access/repo-admin-role.spec.js +70 -0
  180. package/e2e-security/setup/users-and-access/turn-on-security-and-password-change.spec.js +99 -0
  181. package/e2e-security/setup/users-and-access/user-and-access.spec.js +87 -0
  182. package/e2e-security/setup/users-and-access/users-and-access-initial-state.spec.js +38 -0
  183. package/eslint.config.js +39 -0
  184. package/fixtures/graph/graph-configurations.json +59 -0
  185. package/fixtures/guides/autocomplete/enable-autocomplete-guide.json +12 -0
  186. package/fixtures/guides/class-hierarchy/class-hierarchy-guide.json +35 -0
  187. package/fixtures/guides/class-relations/class-relations-guide.json +33 -0
  188. package/fixtures/guides/confirm-cancel-dialog/confirm-cancel-dialog-guide.json +15 -0
  189. package/fixtures/guides/connectors/connectors-guide.json +66 -0
  190. package/fixtures/guides/connectors/lucene-connector-guide.json +120 -0
  191. package/fixtures/guides/create-repository/create-repository-guide.json +25 -0
  192. package/fixtures/guides/create-similarity-index/create-similarity-index-guide.json +36 -0
  193. package/fixtures/guides/download-guide-resource/download-guide-resource-guide.json +25 -0
  194. package/fixtures/guides/download-resource.ttl +629 -0
  195. package/fixtures/guides/execute-sparql-query/execute-sparql-query-guide.json +54 -0
  196. package/fixtures/guides/import-rdf-file/confirm-duplicate-rdf-file-guide.json +30 -0
  197. package/fixtures/guides/import-rdf-file/import-rdf-file-guide.json +21 -0
  198. package/fixtures/guides/main-menu/main-menu-guide.json +98 -0
  199. package/fixtures/guides/navigation/navigation-guide.json +60 -0
  200. package/fixtures/guides/rdf-rank/rdf-rank-guide.json +18 -0
  201. package/fixtures/guides/table-graph-explore/table-graph-explore-guide.json +51 -0
  202. package/fixtures/guides/table-graph-explore/table-graph-explore-without-substeps-guide.json +25 -0
  203. package/fixtures/guides/ttyg/configure-agent/configure-ttyg-agent-guide.json +74 -0
  204. package/fixtures/guides/ttyg/conversation/ttyg-conversation-guide.json +26 -0
  205. package/fixtures/guides/ttyg/edit-ttyg-agent/edit-ttyg-agent-guide.json +22 -0
  206. package/fixtures/guides/visual-graph/visual-graph-config-guide.json +39 -0
  207. package/fixtures/guides/visual-graph/visual-graph-guide.json +85 -0
  208. package/fixtures/guides/welcome/welcome-guide.json +18 -0
  209. package/fixtures/repositories/free-access.json +13 -0
  210. package/fixtures/similarity/get-ttyg-similarity-instances.json +10 -0
  211. package/fixtures/ttyg/agent/get-agent-defaults-assistant-api.json +44 -0
  212. package/fixtures/ttyg/agent/get-agent-defaults.json +9 -2
  213. package/fixtures/ttyg/agent/get-agent-list-with-incompatible-agents.json +79 -0
  214. package/fixtures/ttyg/agent/get-similarity-indexes-for-another-repo.json +8 -0
  215. package/fixtures/ttyg/agent/get-similarity-indexes.json +22 -0
  216. package/fixtures/ttyg/chats/ask-question-cancel.json +12 -0
  217. package/fixtures/ttyg/chats/ask-question.json +12 -2
  218. package/fixtures/ttyg/chats/cancel-question-response.json +1 -0
  219. package/fixtures/ttyg/chats/create/create-chat-response.json +10 -14
  220. package/fixtures/ttyg/chats/create/question-response-after-chat-creation.json +29 -0
  221. package/fixtures/ttyg/chats/explain-response-1.json +2 -48
  222. package/fixtures/ttyg/chats/explain-response-3.json +12 -0
  223. package/fixtures/ttyg/chats/get-chat.json +6 -1
  224. package/npm-shrinkwrap.json +11004 -3815
  225. package/package.json +58 -42
  226. package/plugins/index.js +10 -5
  227. package/steps/application-steps.js +8 -6
  228. package/steps/base-steps.js +29 -0
  229. package/steps/class-views-steps.js +35 -7
  230. package/steps/cluster/cluster-page-steps.js +12 -2
  231. package/steps/cookie-policy/cookie-consent-banner-steps.js +21 -0
  232. package/steps/cookie-policy/cookie-policy-modal.steps.js +56 -0
  233. package/steps/error-page-steps.js +9 -0
  234. package/steps/error-steps.js +15 -3
  235. package/steps/explore/class-relationships-steps.js +64 -0
  236. package/steps/explore/graphs-overview-steps.js +21 -1
  237. package/steps/explore/similarity-index-create-steps.js +5 -3
  238. package/steps/explore/similarity-indexes-steps.js +16 -2
  239. package/steps/graphql/graphql-endpoint-management-steps.js +2 -2
  240. package/steps/graphql/playground-editor-steps.js +46 -0
  241. package/steps/guides/guide-dialog-steps.js +81 -2
  242. package/steps/guides/guide-steps.js +54 -2
  243. package/steps/guides/movies-guide-steps.js +2 -1
  244. package/steps/header-steps.js +22 -0
  245. package/steps/home-steps.js +184 -77
  246. package/steps/import/import-resource-message-dialog.js +1 -1
  247. package/steps/import/import-steps.js +12 -16
  248. package/steps/import/import-user-data-steps.js +5 -1
  249. package/steps/language-selector-steps.js +2 -2
  250. package/steps/license-steps.js +91 -9
  251. package/steps/login-steps.js +31 -6
  252. package/steps/main-menu-steps.js +244 -19
  253. package/steps/modal-dialog-steps.js +32 -1
  254. package/steps/monitoring/backup-and-restore-steps.js +9 -3
  255. package/steps/monitoring/queries-and-updates-steps.js +20 -0
  256. package/steps/monitoring/system-monitoring-steps.js +40 -0
  257. package/steps/not-found/not-found-steps.js +23 -0
  258. package/steps/operations-statuses-component-steps.js +5 -10
  259. package/steps/rdf-resource-search-steps.js +55 -0
  260. package/steps/repository-selector-steps.js +3 -3
  261. package/steps/repository-steps.js +88 -18
  262. package/steps/resource/resource-steps.js +6 -10
  263. package/steps/rest-api-documentation-steps.js +15 -0
  264. package/steps/setup/acl-management-steps.js +18 -2
  265. package/steps/setup/autocomplete-steps.js +23 -8
  266. package/steps/setup/connectors-steps.js +32 -0
  267. package/steps/setup/jdbc-steps.js +18 -4
  268. package/steps/setup/namespace-steps.js +10 -7
  269. package/steps/setup/plugins-steps.js +12 -5
  270. package/steps/setup/rdf-rank-steps.js +23 -9
  271. package/steps/setup/settings-steps.js +101 -2
  272. package/steps/setup/sparql-templates-steps.js +19 -1
  273. package/steps/setup/user-and-access-steps.js +50 -16
  274. package/steps/shared-modal-dialog-steps.js +45 -0
  275. package/steps/sparql-editor-steps.js +21 -2
  276. package/steps/sparql-steps.js +13 -1
  277. package/steps/system-information-steps.js +70 -0
  278. package/steps/toaster-steps.js +18 -6
  279. package/steps/ttyg/chat-panel-steps.js +40 -2
  280. package/steps/ttyg/ttyg-agent-settings-modal.steps.js +136 -31
  281. package/steps/ttyg/ttyg-view-steps.js +80 -10
  282. package/steps/visual-graph-split-button-steps.js +45 -0
  283. package/steps/visual-graph-steps.js +106 -10
  284. package/steps/widgets/active-repository-widget-steps.js +29 -0
  285. package/steps/widgets/license-widget-steps.js +9 -0
  286. package/steps/widgets/repository-errors-widget-steps.js +21 -0
  287. package/steps/widgets/saved-sparql-queries-widget-steps.js +9 -0
  288. package/steps/yasgui/yasgui-loader.js +3 -3
  289. package/steps/yasgui/yasgui-steps.js +1 -1
  290. package/steps/yasgui/yasqe-steps.js +35 -4
  291. package/steps/yasgui/yasr-steps.js +35 -5
  292. package/stubs/autocomplete/autocomplete-stubs.js +7 -0
  293. package/stubs/browser-stubs.js +21 -0
  294. package/stubs/environment-stubs.js +9 -1
  295. package/stubs/graph-config-stubs.js +17 -0
  296. package/stubs/guides/guides-stubs.js +103 -0
  297. package/stubs/license-stubs.js +51 -0
  298. package/stubs/repositories/repositories-stubs.js +180 -75
  299. package/stubs/saved-queries-stubs.js +5 -0
  300. package/stubs/security-stubs.js +12 -0
  301. package/stubs/similarity-index-stubs.js +4 -0
  302. package/stubs/sparql-stubs.js +10 -0
  303. package/stubs/ttyg/ttyg-stubs.js +64 -15
  304. package/stubs/yasgui/query-stubs.js +5 -1
  305. package/support/commands.js +22 -1
  306. package/support/connector-commands.js +13 -0
  307. package/support/e2e-security.js +9 -0
  308. package/support/{index.js → e2e.js} +9 -3
  309. package/support/repository-commands.js +29 -4
  310. package/support/settings-commands.js +33 -1
  311. package/support/url-commands.js +13 -0
  312. package/support/user-commands.js +9 -4
  313. package/utils/html-util.js +24 -4
  314. package/Dockerfile +0 -11
  315. package/fixtures/locale-en.json +0 -3342
  316. package/integration/explore/similarity-index/similarity-index-create.spec.js +0 -333
  317. package/integration/explore/similarity-index/similarity-index.spec.js +0 -88
  318. package/integration/explore/similarity-index/similarity.spec.js +0 -628
  319. package/integration/guides/movies-interactive-guide.spec.js +0 -73
  320. package/integration/home/cookie-policy.spec.js +0 -90
  321. package/integration/home/documentation-link.spec.js +0 -60
  322. package/integration/home/language-selector.spec.js +0 -19
  323. package/integration/home/rdf-resource-search.spec.js +0 -177
  324. package/integration/home/view-resource-autocomplete.spec.js +0 -52
  325. package/integration/home/workbench.home.spec.js +0 -30
  326. package/integration/monitor/monitor.queries.spec.js +0 -31
  327. package/integration/setup/my-settings.spec.js +0 -289
  328. package/integration/sparql-editor/yasr/toolbar/visual-graph-button.spec.js +0 -57
  329. package/integration/ttyg/edit-agent.spec.js +0 -99
  330. package/integration-flaky/setup/users-and-access/security-and-free-access.spec.js +0 -54
  331. package/stubs/repositories-stub.js +0 -73
  332. package/{integration-flaky → e2e-flaky}/import/import.server.files.spec.js +0 -0
  333. package/{integration-flaky → e2e-flaky}/sparql-editor/lucene-connector.spec.js +0 -0
  334. package/{integration-flaky → e2e-flaky}/sparql-editor/plugins/error-plugin.spec.js +0 -0
  335. package/{integration → e2e-legacy}/cluster/cluster-configuration/cluster-configuration-multi-region.spec.js +0 -0
  336. package/{integration → e2e-legacy}/cluster/cluster-configuration/cluster-configuration-nodes.spec.js +0 -0
  337. package/{integration → e2e-legacy}/cluster/cluster-configuration/cluster-configuration-properties.spec.js +0 -0
  338. package/{integration → e2e-legacy}/cluster/cluster-configuration/cluster-configuration.spec.js +0 -0
  339. package/{integration → e2e-legacy}/cluster/cluster-legend.spec.js +0 -0
  340. package/{integration → e2e-legacy}/cluster/edit-cluster-nodes-modal.spec.js +0 -0
  341. package/{integration → e2e-legacy}/graphql/activate-deactivate-graphql-endpoint.spec.js +0 -0
  342. package/{integration → e2e-legacy}/graphql/delete-graphql-endpoint.spec.js +0 -0
  343. package/{integration → e2e-legacy}/graphql/export-graphql-endpoint-definition.spec.js +0 -0
  344. package/{integration → e2e-legacy}/graphql/set-default-graphql-endpoint.spec.js +0 -0
  345. package/{integration/help → e2e-legacy/help/system-information}/system-information.spec.js +0 -0
  346. package/{integration → e2e-legacy}/home/create-repository.spec.js +0 -0
  347. package/{integration → e2e-legacy}/import/import-server-files-batch-operations.spec.js +0 -0
  348. package/{integration → e2e-legacy}/import/import-user-data-settings-dialog.spec.js +0 -0
  349. package/{integration → e2e-legacy}/import/import-view.spec.js +0 -0
  350. package/{integration → e2e-legacy}/repository/attach-remote-location.spec.js +1 -1
  351. /package/{integration → e2e-legacy}/repository/repository-commands.spec.js +0 -0
  352. /package/{integration → e2e-legacy}/setup/aclmanagement/delete-rule.spec.js +0 -0
  353. /package/{integration → e2e-legacy}/setup/aclmanagement/edit-rule.spec.js +0 -0
  354. /package/{integration → e2e-legacy}/setup/aclmanagement/render-rules.spec.js +0 -0
  355. /package/{integration → e2e-legacy}/setup/aclmanagement/reorder-rules.spec.js +0 -0
  356. /package/{integration → e2e-legacy}/setup/aclmanagement/revert-rules.spec.js +0 -0
  357. /package/{integration → e2e-legacy}/setup/aclmanagement/scopes.spec.js +0 -0
  358. /package/{integration → e2e-legacy}/setup/aclmanagement/update-rules.spec.js +0 -0
  359. /package/{integration → e2e-legacy}/setup/jdbc/jdbc.spec.js +0 -0
  360. /package/{integration → e2e-legacy}/sparql-editor/actions/execute-query.spec.js +0 -0
  361. /package/{integration → e2e-legacy}/sparql-editor/actions/save-query.spec.js +0 -0
  362. /package/{integration → e2e-legacy}/sparql-editor/internationalization.spec.js +0 -0
  363. /package/{integration → e2e-legacy}/sparql-editor/saved-query/delete-query.spec.js +0 -0
  364. /package/{integration → e2e-legacy}/sparql-editor/sparql-editor.spec.js +0 -0
  365. /package/{integration → e2e-legacy}/sparql-editor/yasr/download-as.spec.js +0 -0
@@ -0,0 +1,106 @@
1
+ import {SparqlEditorSteps} from '../../../../steps/sparql-editor-steps';
2
+ import {YasqeSteps} from '../../../../steps/yasgui/yasqe-steps';
3
+ import {QueryStubs} from '../../../../stubs/yasgui/query-stubs';
4
+ import {GraphConfigStubs} from '../../../../stubs/graph-config-stubs.js';
5
+ import {BrowserStubs} from '../../../../stubs/browser-stubs.js';
6
+ import {VisualGraphSplitButtonSteps} from '../../../../steps/visual-graph-split-button-steps.js';
7
+
8
+ describe('"Visualize" split button', () => {
9
+ let repositoryId;
10
+
11
+ beforeEach(() => {
12
+ repositoryId = 'yasr-vizualize-split-button' + Date.now();
13
+ QueryStubs.stubQueryCountResponse();
14
+ cy.createRepository({id: repositoryId});
15
+ cy.presetRepository(repositoryId);
16
+ // Given I visit a page with 'ontotex-yasgu-web-component' in it.
17
+ SparqlEditorSteps.visitSparqlEditorPage();
18
+ });
19
+
20
+ afterEach(() => {
21
+ cy.deleteRepository(repositoryId);
22
+ });
23
+
24
+ it('should display "Visualize" split button when user execute a CONSTRUCT query', () => {
25
+ // WHEN: I visit a page with 'ontotext-yasgui-web-component' on it, and execute select query.
26
+ executeSelectQuery();
27
+ // THEN: I expect the 'Visualize' button to not be visible.
28
+ VisualGraphSplitButtonSteps.getVisualizeMainButton().should('not.be.visible');
29
+
30
+ // WHEN: I execute a CONSTRUCT query.
31
+ executeConstructQuery();
32
+ // THEN: I expect the 'Visualize' button to be visible.
33
+ VisualGraphSplitButtonSteps.getVisualizeMainButton().should('be.visible');
34
+
35
+ // WHEN: I execute SELECT query again.
36
+ executeSelectQuery();
37
+ // THEN: I expect the 'Visualize' button to not be visible.
38
+ VisualGraphSplitButtonSteps.getVisualizeMainButton().should('not.be.visible');
39
+ });
40
+
41
+ it('should inform user that there no created graph configurations', () => {
42
+ // GIVEN: There are no graph configurations.
43
+ GraphConfigStubs.stubGetEmptyGraphConfigs();
44
+ // AND: I visit a page with 'ontotext-yasgui-web-component' on it, and the 'Visualize' button is visible.
45
+ executeConstructQuery();
46
+
47
+ // WHEN: I open the dropdown.
48
+ VisualGraphSplitButtonSteps.toggleGraphConfigDropdown();
49
+ // THEN: I expect to see message that informs that there are no graph configurations.
50
+ VisualGraphSplitButtonSteps.getNoConfigurationsMessage().should('contain.text', 'No advanced graph configuration.');
51
+
52
+ // WHEN: I click on create link.
53
+ BrowserStubs.stubWindowOpen();
54
+ VisualGraphSplitButtonSteps.clickCreateGraphConfigLink();
55
+ // THEN: I expect to be navigated to graph configurations page.
56
+ cy.get(BrowserStubs.WINDOW_OPEN_ALIAS()).should('have.been.calledWithMatch', 'graphs-visualizations', '_blank', 'noopener,noreferrer');
57
+ });
58
+
59
+ it('should open graphs-visualizations view when click on main button', () => {
60
+ // GIVEN: I visit a page with 'ontotext-yasgui-web-component' on it, and the 'Visualize' button is visible.
61
+ executeConstructQuery();
62
+
63
+ // WHEN: I click on main button
64
+ VisualGraphSplitButtonSteps.clickOnVisualizeMainButton();
65
+ // THEN: I expect to be navigated to graphs-visualizations view.
66
+ cy.url().should('include', 'graphs-visualizations');
67
+ cy.getQueryParam('query').should('include', 'PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>PREFIX onto: <http://www.ontotext.com/>CONSTRUCT {?source rdf:type ?destination .} WHERE {?bag rdf:type ?source .?flight rdf:type ?destination}');
68
+ cy.getQueryParam('config').should('not.exist');
69
+ });
70
+
71
+ it('should open graphs-visualizations view when select a graph configuration', () => {
72
+ // GIVEN: I visit a page with 'ontotext-yasgui-web-component' on it, and the 'Visualize' button is visible.
73
+ executeConstructQuery();
74
+ GraphConfigStubs.stubGetGraphConfigs();
75
+
76
+ // WHEN: I open the dropdown.
77
+ VisualGraphSplitButtonSteps.toggleGraphConfigDropdown();
78
+ // THEN: I expect to see all graph configurations.
79
+ VisualGraphSplitButtonSteps.getGraphConfigs().should('have.length', 3);
80
+
81
+ // WHEN: I select a graph configuration
82
+ VisualGraphSplitButtonSteps.selectGraphConfig();
83
+ // THEN: I expect to be navigated to graphs-visualizations view.
84
+ cy.url().should('include', 'graphs-visualizations');
85
+ cy.getQueryParam('query').should('include', 'PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>PREFIX onto: <http://www.ontotext.com/>CONSTRUCT {?source rdf:type ?destination .} WHERE {?bag rdf:type ?source .?flight rdf:type ?destination}');
86
+ cy.getQueryParam('config').should('eq', 'de99fd5de7f94ef98f1875dff55fc1c9');
87
+ });
88
+ });
89
+
90
+ const executeSelectQuery = () => {
91
+ YasqeSteps.pasteQuery('select * where {?s ?p ?o.}');
92
+ YasqeSteps.executeQuery();
93
+ };
94
+
95
+ const executeConstructQuery = () => {
96
+ YasqeSteps.pasteQuery(
97
+ 'PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>' +
98
+ 'PREFIX onto: <http://www.ontotext.com/>' +
99
+ 'CONSTRUCT {' +
100
+ '?source rdf:type ?destination .' +
101
+ '} WHERE {' +
102
+ '?bag rdf:type ?source .' +
103
+ '?flight rdf:type ?destination' +
104
+ '}');
105
+ YasqeSteps.executeQuery();
106
+ };
@@ -0,0 +1,80 @@
1
+ import {SparqlEditorSteps} from '../../../steps/sparql-editor-steps.js';
2
+ import {YasrSteps} from '../../../steps/yasgui/yasr-steps.js';
3
+ import {YasqeSteps} from '../../../steps/yasgui/yasqe-steps.js';
4
+
5
+ describe('YASR', () => {
6
+ let repositoryId;
7
+ let secondRepositoryId;
8
+
9
+ beforeEach(() => {
10
+ repositoryId = 'yasr-' + Date.now();
11
+ cy.createRepository({id: repositoryId});
12
+ cy.presetRepository(repositoryId);
13
+ });
14
+
15
+ afterEach(() => {
16
+ cy.deleteRepository(repositoryId);
17
+ cy.deleteRepository(secondRepositoryId);
18
+ });
19
+
20
+ it('should load YASR in fullscreen with plugin config from URL', () => {
21
+ // WHEN: I visit SPARQL Query & Update page with url parameters: embedded and pluginName
22
+ SparqlEditorSteps.visitSparqlEditorPageAndWaitForResults(getUrl(repositoryId, 'pivotTable', true));
23
+ // THEN: YASR is in fullscreen mode because the workbench is embedded.
24
+ YasrSteps.getYasr().should('have.class', 'yasr-fullscreen');
25
+ // AND: I expect the raw response plugin to be visible
26
+ YasrSteps.getPivotTablePlugin().should('be.visible');
27
+
28
+ // WHEN: I press the ESC key.
29
+ YasrSteps.typeEscapeKey();
30
+ // THEN: I see YASR results in fullscreen mode because Escape is disabled in this mode.
31
+ YasrSteps.getYasr().should('have.class', 'yasr-fullscreen');
32
+
33
+ // WHEN: I visit SPARQL Query & Update page with without embedded url parameter.
34
+ SparqlEditorSteps.visitSparqlEditorPageAndWaitForResults(getUrl(repositoryId, 'googleChart'));
35
+ // THEN: I expect yasr to be in non-fullscreen mode
36
+ YasrSteps.getYasr().should('not.have.class', 'yasr-fullscreen');
37
+ // AND: I expect Google Chart plugin to be visible
38
+ YasrSteps.getGoogleChartPlugin().should('be.visible');
39
+
40
+ // WHEN: I visit SPARQL Query & Update page with without embedded and pluginName url parameters.
41
+ SparqlEditorSteps.visitSparqlEditorPageAndWaitForResults(getUrl(repositoryId));
42
+ // THEN: I expect yasr to be in non-fullscreen mode
43
+ YasrSteps.getYasr().should('not.have.class', 'yasr-fullscreen');
44
+ // AND: I expect Google Chart plugin to be visible, because it was the last used plugin.
45
+ YasrSteps.getGoogleChartPlugin().should('be.visible');
46
+
47
+ // WHEN: I visit SPARQL Query & Update page with without embedded and pluginName url parameters.
48
+ // AND: There are no persisted yasr data.
49
+ cy.clearLocalStorage('yagui__graphdb-workbench-sparql-editor');
50
+ SparqlEditorSteps.visitSparqlEditorPageAndWaitForResults(getUrl(repositoryId));
51
+ // THEN: I expect yasr to be in non-fullscreen mode
52
+ YasrSteps.getYasr().should('not.have.class', 'yasr-fullscreen');
53
+ // AND: I expect the default plugin to be visible
54
+ YasrSteps.getExtendedTablePlugin().should('be.visible');
55
+ });
56
+
57
+ it('should trigger YASR fullscreen mode', () => {
58
+ // GIVEN: I open a page that contains "ontotext-yasgui-web-component".
59
+ SparqlEditorSteps.visitSparqlEditorPage();
60
+
61
+ // WHEN: I execute a query.
62
+ YasqeSteps.executeQuery();
63
+ // THEN: I should see YASR results in non-fullscreen mode.
64
+ YasrSteps.getYasr().should('not.have.class', 'yasr-fullscreen');
65
+
66
+ // WHEN: I toggle to fullscreen mode.
67
+ YasrSteps.toggleFullscreen();
68
+ // THEN: I should see YASR results in fullscreen mode.
69
+ YasrSteps.getYasr().should('have.class', 'yasr-fullscreen');
70
+
71
+ // WHEN: I press the ESC key.
72
+ YasrSteps.typeEscapeKey();
73
+ // THEN: I should see YASR results in non-fullscreen mode, because escape is enabled when workbench is not embedded.
74
+ YasrSteps.getYasr().should('not.have.class', 'yasr-fullscreen');
75
+ });
76
+ });
77
+
78
+ const getUrl = (repositoryId, pluginName, embedded = false) => {
79
+ return `repositoryId=${repositoryId}${pluginName ? ('&pluginName=' + pluginName) : ''}${embedded ? '&embedded' : ''}&query=SELECT * { ?s ?p ?o }&execute=true`;
80
+ }
@@ -1,12 +1,12 @@
1
1
  import {TTYGViewSteps} from "../../steps/ttyg/ttyg-view-steps";
2
2
  import {TTYGStubs} from "../../stubs/ttyg/ttyg-stubs";
3
3
  import {RepositoriesStubs} from "../../stubs/repositories/repositories-stubs";
4
- import {RepositoriesStub} from "../../stubs/repositories-stub";
4
+ import {TtygAgentSettingsModalSteps} from "../../steps/ttyg/ttyg-agent-settings-modal.steps";
5
5
 
6
6
  describe('TTYG agent list', () => {
7
7
  beforeEach(() => {
8
8
  RepositoriesStubs.stubRepositories(0, '/repositories/get-ttyg-repositories.json');
9
- RepositoriesStub.stubBaseEndpoints('starwars');
9
+ RepositoriesStubs.stubBaseEndpoints('starwars');
10
10
  cy.presetRepository('starwars');
11
11
  });
12
12
 
@@ -73,4 +73,55 @@ describe('TTYG agent list', () => {
73
73
  {name: 'Databricks-biomarkers', repositoryId: 'biomarkers', isRepositoryDeleted: false}
74
74
  ]);
75
75
  });
76
+
77
+ it('should filter agent actions based on compatibility', () => {
78
+ TTYGStubs.stubAgentListWithIncompatibleGet();
79
+ // When: I visit the ttyg page with incompatible agents
80
+ TTYGViewSteps.visit();
81
+ // Then: Only the delete action should be available for incompatible agents
82
+ TTYGViewSteps.expandAgentsSidebar();
83
+ TTYGViewSteps.getAgentsPanel(0).should('be.visible');
84
+ TTYGViewSteps.getOpenAgentActionsButton(0).should('be.visible');
85
+ TTYGViewSteps.toggleAgentActionMenu(0);
86
+ TTYGViewSteps.getDeleteAgentButton(0).should('be.visible');
87
+ TTYGViewSteps.getCloneAgentButton(0).should('not.exist');
88
+ TTYGViewSteps.getEditAgentButton(0).should('not.exist');
89
+ TTYGViewSteps.toggleAgentActionMenu(0);
90
+ // And: All actions should be available for compatible agents
91
+ TTYGViewSteps.toggleAgentActionMenu(1);
92
+ TTYGViewSteps.getDeleteAgentButton(1).should('be.visible');
93
+ TTYGViewSteps.getCloneAgentButton(1).should('be.visible');
94
+ TTYGViewSteps.getEditAgentButton(1).should('be.visible');
95
+ });
96
+
97
+ it('should allow copy of External integration configuration from agent list', () => {
98
+ TTYGStubs.stubAgentListGet('/ttyg/agent/get-agent-list-autocomplete-query.json');
99
+ TTYGStubs.getExternalUrl();
100
+ // Given I have opened the ttyg page
101
+ TTYGViewSteps.visit();
102
+ cy.wait('@get-agent-list');
103
+ // When I select an agent from the sidebar
104
+ TTYGViewSteps.expandAgentsSidebar();
105
+ TTYGViewSteps.toggleAgentActionMenu(0);
106
+ TTYGViewSteps.getExternalIntegrationConfigButton(0).should('be.visible');
107
+ TTYGViewSteps.openExternalIntegrationConfigButton(0);
108
+ cy.wait('@external-url');
109
+ // The url dialog should open
110
+ TtygAgentSettingsModalSteps.getExternalIntegrationModal().should('be.visible');
111
+ // The dialog should have all the fields
112
+ TtygAgentSettingsModalSteps.getAgentUrlField().invoke('val')
113
+ .then((val) => {
114
+ expect(val).to.equal('asst_G8EtHyT8kAGeDmCa3Nh6y74v');
115
+ });
116
+
117
+ TtygAgentSettingsModalSteps.getMethodUrlField().invoke('val')
118
+ .then((val) => {
119
+ expect(val).to.equal('http://user-pc:7200/rest/llm/tool/ttyg/asst_G8EtHyT8kAGeDmCa3Nh6y74v');
120
+ });
121
+
122
+ TtygAgentSettingsModalSteps.getDifyUrlField().invoke('val')
123
+ .then((val) => {
124
+ expect(val).to.equal('http://user-pc:7200/rest/llm/ttyg/asst_G8EtHyT8kAGeDmCa3Nh6y74v/dify');
125
+ });
126
+ });
76
127
  });
@@ -2,7 +2,6 @@ import {TTYGViewSteps} from "../../steps/ttyg/ttyg-view-steps";
2
2
  import {TTYGStubs} from "../../stubs/ttyg/ttyg-stubs";
3
3
  import {RepositoriesStubs} from "../../stubs/repositories/repositories-stubs";
4
4
  import {ModalDialogSteps} from "../../steps/modal-dialog-steps";
5
- import {RepositoriesStub} from "../../stubs/repositories-stub";
6
5
 
7
6
  describe('TTYG agent select menu', () => {
8
7
 
@@ -10,7 +9,7 @@ describe('TTYG agent select menu', () => {
10
9
 
11
10
  beforeEach(() => {
12
11
  RepositoriesStubs.stubRepositories(0, '/repositories/get-ttyg-repositories.json');
13
- RepositoriesStub.stubBaseEndpoints(repositoryId);
12
+ RepositoriesStubs.stubBaseEndpoints(repositoryId);
14
13
  cy.presetRepository(repositoryId);
15
14
  TTYGStubs.stubChatsListGetNoResults();
16
15
  });
@@ -29,6 +28,30 @@ describe('TTYG agent select menu', () => {
29
28
  ]);
30
29
  });
31
30
 
31
+ it('should not allow selecting an incompatible agent from the menu', () => {
32
+ TTYGStubs.stubAgentListWithIncompatibleGet();
33
+ // Given: I have opened the ttyg page
34
+ TTYGViewSteps.visit();
35
+ // And: The agent dropdown menu is not visible
36
+ TTYGViewSteps.getAgentsDropdownMenu().should('not.be.visible');
37
+ // And: The first agent is selected
38
+ TTYGViewSteps.getAgentsMenuToggleButton().should('contain', 'agent-1');
39
+
40
+ // When: I open the agent selection menu
41
+ TTYGViewSteps.openAgentsMenu();
42
+ // Then: I should see that the first agent is marked as incompatible
43
+ TTYGViewSteps.getAgentFromMenu(0)
44
+ .trigger('mouseover')
45
+ .should('have.css', 'cursor', 'not-allowed');
46
+
47
+ // When: I attempt to select an incompatible agent from the menu
48
+ TTYGViewSteps.selectAgent(0);
49
+ // Then: The incompatible agent should not be selected
50
+ TTYGViewSteps.getAgentsMenuToggleButton().should('contain', 'agent-1');
51
+ // And: The dropdown menu should remain open
52
+ TTYGViewSteps.getAgentsDropdownMenu().should('be.visible');
53
+ });
54
+
32
55
  it('Should be able to select agent from the menu', () => {
33
56
  TTYGStubs.stubAgentListGet();
34
57
  // Given I have opened the ttyg page
@@ -6,13 +6,12 @@ import {ApplicationSteps} from "../../steps/application-steps";
6
6
  import HomeSteps from "../../steps/home-steps";
7
7
  import {ChatPanelSteps} from "../../steps/ttyg/chat-panel-steps";
8
8
  import {AlertDialogSteps} from "../../steps/alert-dialog-steps";
9
- import {RepositoriesStub} from "../../stubs/repositories-stub";
10
9
 
11
10
  describe('TTYG chat list', () => {
12
11
 
13
12
  beforeEach(() => {
14
13
  RepositoriesStubs.stubRepositories(0, '/repositories/get-ttyg-repositories.json');
15
- RepositoriesStub.stubBaseEndpoints('starwars');
14
+ RepositoriesStubs.stubBaseEndpoints('starwars');
16
15
  cy.presetRepository('starwars');
17
16
  });
18
17
 
@@ -62,12 +61,7 @@ describe('TTYG chat list', () => {
62
61
  TTYGViewSteps.getChatByDayGroups().should('have.length', 0);
63
62
  });
64
63
 
65
- it('Should be able to edit an existing chat name by double click on the chat in the list', {
66
- retries: {
67
- runMode: 1,
68
- openMode: 0
69
- }
70
- }, () => {
64
+ it('Should be able to edit an existing chat name by double click on the chat in the list', () => {
71
65
  TTYGStubs.stubChatsListGet();
72
66
  TTYGStubs.stubChatGet();
73
67
  TTYGStubs.stubAgentListGet();
@@ -91,12 +85,7 @@ describe('TTYG chat list', () => {
91
85
  TTYGViewSteps.getChatFromGroup(1, 0).should('contain', 'New chat name');
92
86
  });
93
87
 
94
- it('Should be able to edit an existing chat name through the action menu', {
95
- retries: {
96
- runMode: 1,
97
- openMode: 0
98
- }
99
- }, () => {
88
+ it('Should be able to edit an existing chat name through the action menu', () => {
100
89
  TTYGStubs.stubChatsListGet();
101
90
  TTYGStubs.stubChatGet();
102
91
  TTYGStubs.stubAgentListGet();
@@ -3,14 +3,15 @@ import {TTYGStubs} from "../../stubs/ttyg/ttyg-stubs";
3
3
  import {TTYGViewSteps} from "../../steps/ttyg/ttyg-view-steps";
4
4
  import {ChatPanelSteps} from "../../steps/ttyg/chat-panel-steps";
5
5
  import {ApplicationSteps} from "../../steps/application-steps";
6
- import {RepositoriesStub} from "../../stubs/repositories-stub";
6
+ import {TtygAgentSettingsModalSteps} from '../../steps/ttyg/ttyg-agent-settings-modal.steps.js';
7
+ import {SparqlStubs} from '../../stubs/sparql-stubs.js';
7
8
 
8
9
  describe('Ttyg ChatPanel', () => {
9
10
 
10
11
  beforeEach(() => {
11
12
  // Create an actual repository to prevent stubbing all background requests that are not related to the ttyg view
12
13
  RepositoriesStubs.stubRepositories(0, '/repositories/get-ttyg-repositories.json');
13
- RepositoriesStub.stubBaseEndpoints('starwars');
14
+ RepositoriesStubs.stubBaseEndpoints('starwars');
14
15
  cy.presetRepository('starwars');
15
16
  TTYGStubs.stubChatsListGet();
16
17
  TTYGStubs.stubAgentListGet();
@@ -42,7 +43,7 @@ describe('Ttyg ChatPanel', () => {
42
43
  // When the new question input is empty.
43
44
  // The "Ask" button must be disabled.
44
45
  ChatPanelSteps.getAskButtonElement().should('be.disabled');
45
- ChatPanelSteps.getQuestionInputElement().should('be.disabled');
46
+ ChatPanelSteps.getQuestionInputElement().should('have.attr', 'disabled');
46
47
 
47
48
  // Then I expect the "Ask" button be not active because agent is not selected
48
49
  ChatPanelSteps.getAskButtonElement().should('not.be.enabled');
@@ -54,7 +55,8 @@ describe('Ttyg ChatPanel', () => {
54
55
  // When I type a question
55
56
  ChatPanelSteps.getQuestionInputElement()
56
57
  .should('be.visible')
57
- .and('not.be.disabled')
58
+ .and('not.have.attr', 'disabled');
59
+ ChatPanelSteps.getQuestionInputElement()
58
60
  .type('Who is Han Solo?');
59
61
 
60
62
  // Then I expect the "Ask" button be active.
@@ -68,13 +70,22 @@ describe('Ttyg ChatPanel', () => {
68
70
  ChatPanelSteps.getChatDetailsElements().should('have.length', 3);
69
71
  ChatPanelSteps.getChatDetailQuestionElement(2).contains('Who is Han Solo?');
70
72
  // and input field be empty,
71
- ChatPanelSteps.getQuestionInputElement().should('be.enabled');
73
+ ChatPanelSteps.getQuestionInputElement().should('not.have.attr', 'disabled');
72
74
  ChatPanelSteps.getQuestionInputElement().should('have.value', '');
73
75
  // and "Ask" button be disabled.
74
76
  ChatPanelSteps.getAskButtonElement().should('be.disabled');
75
77
  // and only the actions for the last message are visible.
76
78
  ChatPanelSteps.getChatDetailActions(2, 0).should('not.be.visible');
77
79
  ChatPanelSteps.getChatDetailActions(2, 1).should('be.visible');
80
+ // When: I hover over the token usage info button
81
+ TTYGViewSteps.hoverTokenUsageInfoButton(0);
82
+ // Then: I expect the token usage info popover to be displayed.
83
+ TTYGViewSteps.getTokenUsageInfoPopover()
84
+ .should("exist")
85
+ .and('contain', '10,246')
86
+ .and('contain', 'prompt tokens')
87
+ .and('contain', '82')
88
+ .and('contain', 'completion tokens');
78
89
 
79
90
  // When I click on regenerate button on the last response => +2 messages
80
91
  TTYGStubs.stubAnswerQuestion();
@@ -129,14 +140,22 @@ describe('Ttyg ChatPanel', () => {
129
140
 
130
141
  // When I click on first explain response button
131
142
  TTYGViewSteps.getExplainResponseButton(0).realHover();
132
- // Then I expect to explain button to be visible.
143
+ // Then I expect to explain button to be visible and not disabled.
133
144
  TTYGViewSteps.getExplainResponseButton(0).should('be.visible');
145
+ TTYGViewSteps.getExplainResponseButton(0).should('not.be.disabled');
134
146
 
135
147
  // When I click on the button.
136
148
  TTYGStubs.stubExplainResponse();
137
149
  TTYGViewSteps.clickOnExplainResponse(0);
138
150
  // Then I expect the hint message to not exist (it should only exist for the last 'Explain' response).
139
151
  TTYGViewSteps.getHowDeliverAnswerButton().should('not.exist');
152
+ // When I click on the open in sparql editor button for the explain response
153
+ SparqlStubs.spyAddKnownPrefixes();
154
+ TtygAgentSettingsModalSteps.clickOpenQueryInSparqlEditor(0);
155
+ // Then I expect a request for appending prefixes to be sent with the correct query.
156
+ cy.wait('@addKnownPrefixes').its('request.body').then((body) => {
157
+ expect(body).to.contain('SELECT ?name ?height WHERE {\n ?character voc:height ?height;\n rdfs:label ?name.\n FILTER(?name = "Luke Skywalker" || ?name = "Leia Organa")\n}');
158
+ });
140
159
 
141
160
  // Then when I click on explain response button on the second answer
142
161
  TTYGStubs.stubExplainResponse('/ttyg/chats/explain-response-2.json');
@@ -164,6 +183,55 @@ describe('Ttyg ChatPanel', () => {
164
183
  TTYGViewSteps.getExplainQueryQueryElement(1, 2).contains("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-sch");
165
184
  });
166
185
 
186
+ it('Should display info about used tokens for response', () => {
187
+ // Given: I visit the TTYG page, a chat with two questions and answers is loaded.
188
+ // Wait to chat be loaded
189
+ ChatPanelSteps.getChatDetailsElements().should('have.length', 2);
190
+
191
+ // When: I hover over the token usage info button
192
+ TTYGViewSteps.hoverTokenUsageInfoButton(0);
193
+ // Then: I expect the token usage info popover to be displayed.
194
+ TTYGViewSteps.getTokenUsageInfoPopover()
195
+ .should("exist")
196
+ .and('contain', '10,245')
197
+ .and('contain', 'prompt tokens')
198
+ .and('contain', '81')
199
+ .and('contain', 'completion tokens');
200
+ });
201
+
202
+ it('Should abort question', () => {
203
+ // When I type a question
204
+ ChatPanelSteps.getQuestionInputElement()
205
+ .should('be.visible')
206
+ .and('not.have.attr', 'disabled');
207
+ ChatPanelSteps.getQuestionInputElement()
208
+ .type('Who is Han Solo?');
209
+
210
+ // Then I expect the "Ask" button be active
211
+ ChatPanelSteps.getAskButtonElement().should('be.enabled');
212
+
213
+ // When I click on "Ask" button
214
+ TTYGStubs.stubAnswerQuestionWithDelay();
215
+ TTYGStubs.stubCancelQuestion();
216
+ ChatPanelSteps.askQuestion();
217
+ // Then the Cancel button should become visible and the Ask button should be hidden
218
+ ChatPanelSteps.getAskButtonElement().should('not.exist');
219
+ ChatPanelSteps.getCancelButton().should('be.visible');
220
+ // When I cancel the question
221
+ ChatPanelSteps.cancelQuestion();
222
+ // Then the Cancel button should be replaced with the Ask button
223
+ ChatPanelSteps.getCancelButton().should('not.exist');
224
+ ChatPanelSteps.getAskButtonElement().should('be.visible');
225
+ // Then the default Agent response should be visible
226
+ ChatPanelSteps.getAssistantAnswer(2).invoke('text').then((text) => {
227
+ expect(text.trim()).to.equal('Request cancelled by the user.');
228
+ });
229
+ ChatPanelSteps.getAssistantIcon(2).should('not.exist');
230
+ // And I expect the explain response button to be visible but disabled
231
+ TTYGViewSteps.getExplainResponseButton(2).should('be.visible');
232
+ TTYGViewSteps.getExplainResponseButton(2).should('be.disabled');
233
+ });
234
+
167
235
  // Can't test this on CI
168
236
  it.skip('Should copy an answer when click on copy button', () => {
169
237
  // When I click on copy button
@@ -2,14 +2,13 @@ import {RepositoriesStubs} from "../../stubs/repositories/repositories-stubs";
2
2
  import {TTYGViewSteps} from "../../steps/ttyg/ttyg-view-steps";
3
3
  import {TTYGStubs} from "../../stubs/ttyg/ttyg-stubs";
4
4
  import {TtygAgentSettingsModalSteps} from "../../steps/ttyg/ttyg-agent-settings-modal.steps";
5
- import {RepositoriesStub} from "../../stubs/repositories-stub";
6
5
 
7
6
  describe('TTYG clone an agent', () => {
8
7
  const repositoryId = 'starwars';
9
8
 
10
9
  beforeEach(() => {
11
10
  RepositoriesStubs.stubRepositories(0, '/repositories/get-ttyg-repositories.json');
12
- RepositoriesStub.stubBaseEndpoints(repositoryId);
11
+ RepositoriesStubs.stubBaseEndpoints(repositoryId);
13
12
  cy.presetRepository(repositoryId);
14
13
  TTYGStubs.stubAgentDefaultsGet();
15
14
  });
@@ -18,6 +17,7 @@ describe('TTYG clone an agent', () => {
18
17
  TTYGStubs.stubAgentListGet();
19
18
  TTYGStubs.stubChatsListGet();
20
19
  TTYGStubs.stubChatGet();
20
+ RepositoriesStubs.stubRepositoryModel(repositoryId);
21
21
  // Given I have opened the ttyg page
22
22
  TTYGViewSteps.visit();
23
23
  cy.wait('@get-all-repositories');
@@ -46,11 +46,13 @@ describe('TTYG clone an agent', () => {
46
46
  TTYGStubs.stubAgentCreate();
47
47
  TtygAgentSettingsModalSteps.saveAgent();
48
48
  cy.wait('@create-agent').then((interception) => {
49
+ // eslint-disable-next-line no-undef
49
50
  assert.deepEqual(interception.request.body, {
50
51
  "id": "asst_gAPcrHQQ9ZIxD5eXWH2BNFfo",
51
52
  "name": "agent-11",
52
53
  "repositoryId": "starwars",
53
54
  "model": "gpt-4o",
55
+ "contextSize": 128000,
54
56
  "temperature": 0,
55
57
  "topP": 0,
56
58
  "seed": 0,
@@ -72,4 +74,24 @@ describe('TTYG clone an agent', () => {
72
74
  });
73
75
  });
74
76
  });
77
+
78
+ it('should not be able to clone an agent if an extraction method is selected but the precondition has failed', () => {
79
+ TTYGStubs.stubAgentListGet();
80
+ TTYGStubs.stubChatsListGet();
81
+ TTYGStubs.stubChatGet();
82
+ RepositoriesStubs.stubFtsSearchDisabled(repositoryId);
83
+
84
+ // GIVEN: I have opened the TTYG page
85
+ TTYGViewSteps.visit();
86
+ cy.wait('@get-all-repositories');
87
+ cy.wait('@get-agent-list');
88
+ cy.wait('@get-chat');
89
+
90
+ // WHEN: I try to clone an agent that has the FTS extraction method enabled, but FTS is disabled in the repository
91
+ TTYGViewSteps.expandAgentsSidebar();
92
+ TTYGViewSteps.triggerCloneAgentActionMenu(0);
93
+
94
+ // THEN: The Save Agent button should be disabled
95
+ TtygAgentSettingsModalSteps.getSaveAgentButton().should('be.disabled');
96
+ });
75
97
  });