@servicetitan/titan-chatbot-ui-cypress 3.1.1 → 3.1.2

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 (168) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/index.d.ts +0 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +0 -3
  5. package/dist/index.js.map +1 -1
  6. package/package.json +5 -12
  7. package/src/index.ts +0 -3
  8. package/tsconfig.tsbuildinfo +1 -1
  9. package/dist/tests/index.d.ts +0 -30
  10. package/dist/tests/index.d.ts.map +0 -1
  11. package/dist/tests/index.js +0 -30
  12. package/dist/tests/index.js.map +0 -1
  13. package/dist/tests/titan-chat-ui/chat-error.shared-tests.d.ts +0 -3
  14. package/dist/tests/titan-chat-ui/chat-error.shared-tests.d.ts.map +0 -1
  15. package/dist/tests/titan-chat-ui/chat-error.shared-tests.js +0 -138
  16. package/dist/tests/titan-chat-ui/chat-error.shared-tests.js.map +0 -1
  17. package/dist/tests/titan-chat-ui/chat-input-file.shared-tests.d.ts +0 -7
  18. package/dist/tests/titan-chat-ui/chat-input-file.shared-tests.d.ts.map +0 -1
  19. package/dist/tests/titan-chat-ui/chat-input-file.shared-tests.js +0 -123
  20. package/dist/tests/titan-chat-ui/chat-input-file.shared-tests.js.map +0 -1
  21. package/dist/tests/titan-chat-ui/chat-input.shared-tests.d.ts +0 -3
  22. package/dist/tests/titan-chat-ui/chat-input.shared-tests.d.ts.map +0 -1
  23. package/dist/tests/titan-chat-ui/chat-input.shared-tests.js +0 -71
  24. package/dist/tests/titan-chat-ui/chat-input.shared-tests.js.map +0 -1
  25. package/dist/tests/titan-chat-ui/chat-log.shared-tests.d.ts +0 -9
  26. package/dist/tests/titan-chat-ui/chat-log.shared-tests.d.ts.map +0 -1
  27. package/dist/tests/titan-chat-ui/chat-log.shared-tests.js +0 -73
  28. package/dist/tests/titan-chat-ui/chat-log.shared-tests.js.map +0 -1
  29. package/dist/tests/titan-chat-ui/chat-messages.shared-tests.d.ts +0 -8
  30. package/dist/tests/titan-chat-ui/chat-messages.shared-tests.d.ts.map +0 -1
  31. package/dist/tests/titan-chat-ui/chat-messages.shared-tests.js +0 -118
  32. package/dist/tests/titan-chat-ui/chat-messages.shared-tests.js.map +0 -1
  33. package/dist/tests/titan-chat-ui/chat-notifications.shared-tests.d.ts +0 -3
  34. package/dist/tests/titan-chat-ui/chat-notifications.shared-tests.d.ts.map +0 -1
  35. package/dist/tests/titan-chat-ui/chat-notifications.shared-tests.js +0 -110
  36. package/dist/tests/titan-chat-ui/chat-notifications.shared-tests.js.map +0 -1
  37. package/dist/tests/titan-chat-ui/chat-timer.shared-tests.d.ts +0 -3
  38. package/dist/tests/titan-chat-ui/chat-timer.shared-tests.d.ts.map +0 -1
  39. package/dist/tests/titan-chat-ui/chat-timer.shared-tests.js +0 -76
  40. package/dist/tests/titan-chat-ui/chat-timer.shared-tests.js.map +0 -1
  41. package/dist/tests/titan-chat-ui/chat.shared-tests.d.ts +0 -9
  42. package/dist/tests/titan-chat-ui/chat.shared-tests.d.ts.map +0 -1
  43. package/dist/tests/titan-chat-ui/chat.shared-tests.js +0 -111
  44. package/dist/tests/titan-chat-ui/chat.shared-tests.js.map +0 -1
  45. package/dist/tests/titan-chat-ui/message-agent.shared-tests.d.ts +0 -27
  46. package/dist/tests/titan-chat-ui/message-agent.shared-tests.d.ts.map +0 -1
  47. package/dist/tests/titan-chat-ui/message-agent.shared-tests.js +0 -67
  48. package/dist/tests/titan-chat-ui/message-agent.shared-tests.js.map +0 -1
  49. package/dist/tests/titan-chat-ui/message-content-file.shared-tests.d.ts +0 -10
  50. package/dist/tests/titan-chat-ui/message-content-file.shared-tests.d.ts.map +0 -1
  51. package/dist/tests/titan-chat-ui/message-content-file.shared-tests.js +0 -88
  52. package/dist/tests/titan-chat-ui/message-content-file.shared-tests.js.map +0 -1
  53. package/dist/tests/titan-chat-ui/message-system.shared-tests.d.ts +0 -16
  54. package/dist/tests/titan-chat-ui/message-system.shared-tests.d.ts.map +0 -1
  55. package/dist/tests/titan-chat-ui/message-system.shared-tests.js +0 -65
  56. package/dist/tests/titan-chat-ui/message-system.shared-tests.js.map +0 -1
  57. package/dist/tests/titan-chat-ui/message-timeout.shared-tests.d.ts +0 -8
  58. package/dist/tests/titan-chat-ui/message-timeout.shared-tests.d.ts.map +0 -1
  59. package/dist/tests/titan-chat-ui/message-timeout.shared-tests.js +0 -63
  60. package/dist/tests/titan-chat-ui/message-timeout.shared-tests.js.map +0 -1
  61. package/dist/tests/titan-chat-ui/message-typing.shared-tests.d.ts +0 -12
  62. package/dist/tests/titan-chat-ui/message-typing.shared-tests.d.ts.map +0 -1
  63. package/dist/tests/titan-chat-ui/message-typing.shared-tests.js +0 -46
  64. package/dist/tests/titan-chat-ui/message-typing.shared-tests.js.map +0 -1
  65. package/dist/tests/titan-chat-ui/message-user.shared-tests.d.ts +0 -10
  66. package/dist/tests/titan-chat-ui/message-user.shared-tests.d.ts.map +0 -1
  67. package/dist/tests/titan-chat-ui/message-user.shared-tests.js +0 -64
  68. package/dist/tests/titan-chat-ui/message-user.shared-tests.js.map +0 -1
  69. package/dist/tests/titan-chatbot-ui/chatbot-filters.shared-tests.d.ts +0 -7
  70. package/dist/tests/titan-chatbot-ui/chatbot-filters.shared-tests.d.ts.map +0 -1
  71. package/dist/tests/titan-chatbot-ui/chatbot-filters.shared-tests.js +0 -118
  72. package/dist/tests/titan-chatbot-ui/chatbot-filters.shared-tests.js.map +0 -1
  73. package/dist/tests/titan-chatbot-ui/chatbot-help-center.shared-tests.d.ts +0 -9
  74. package/dist/tests/titan-chatbot-ui/chatbot-help-center.shared-tests.d.ts.map +0 -1
  75. package/dist/tests/titan-chatbot-ui/chatbot-help-center.shared-tests.js +0 -162
  76. package/dist/tests/titan-chatbot-ui/chatbot-help-center.shared-tests.js.map +0 -1
  77. package/dist/tests/titan-chatbot-ui/chatbot-links.shared-tests.d.ts +0 -15
  78. package/dist/tests/titan-chatbot-ui/chatbot-links.shared-tests.d.ts.map +0 -1
  79. package/dist/tests/titan-chatbot-ui/chatbot-links.shared-tests.js +0 -123
  80. package/dist/tests/titan-chatbot-ui/chatbot-links.shared-tests.js.map +0 -1
  81. package/dist/tests/titan-chatbot-ui/chatbot-live.shared-tests.d.ts +0 -9
  82. package/dist/tests/titan-chatbot-ui/chatbot-live.shared-tests.d.ts.map +0 -1
  83. package/dist/tests/titan-chatbot-ui/chatbot-live.shared-tests.js +0 -84
  84. package/dist/tests/titan-chatbot-ui/chatbot-live.shared-tests.js.map +0 -1
  85. package/dist/tests/titan-chatbot-ui/chatbot-message-answer-readonly.shared-tests.d.ts +0 -8
  86. package/dist/tests/titan-chatbot-ui/chatbot-message-answer-readonly.shared-tests.d.ts.map +0 -1
  87. package/dist/tests/titan-chatbot-ui/chatbot-message-answer-readonly.shared-tests.js +0 -142
  88. package/dist/tests/titan-chatbot-ui/chatbot-message-answer-readonly.shared-tests.js.map +0 -1
  89. package/dist/tests/titan-chatbot-ui/chatbot-message-answer.shared-tests.d.ts +0 -8
  90. package/dist/tests/titan-chatbot-ui/chatbot-message-answer.shared-tests.d.ts.map +0 -1
  91. package/dist/tests/titan-chatbot-ui/chatbot-message-answer.shared-tests.js +0 -105
  92. package/dist/tests/titan-chatbot-ui/chatbot-message-answer.shared-tests.js.map +0 -1
  93. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-form-guardrail.shared-tests.d.ts +0 -3
  94. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-form-guardrail.shared-tests.d.ts.map +0 -1
  95. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-form-guardrail.shared-tests.js +0 -86
  96. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-form-guardrail.shared-tests.js.map +0 -1
  97. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-form.shared-tests.d.ts +0 -3
  98. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-form.shared-tests.d.ts.map +0 -1
  99. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-form.shared-tests.js +0 -143
  100. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-form.shared-tests.js.map +0 -1
  101. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-popover.shared-tests.d.ts +0 -8
  102. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-popover.shared-tests.d.ts.map +0 -1
  103. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-popover.shared-tests.js +0 -200
  104. package/dist/tests/titan-chatbot-ui/chatbot-message-feedback-popover.shared-tests.js.map +0 -1
  105. package/dist/tests/titan-chatbot-ui/chatbot-message-typing.shared-tests.d.ts +0 -11
  106. package/dist/tests/titan-chatbot-ui/chatbot-message-typing.shared-tests.d.ts.map +0 -1
  107. package/dist/tests/titan-chatbot-ui/chatbot-message-typing.shared-tests.js +0 -81
  108. package/dist/tests/titan-chatbot-ui/chatbot-message-typing.shared-tests.js.map +0 -1
  109. package/dist/tests/titan-chatbot-ui/chatbot-restart-dialog.shared-tests.d.ts +0 -8
  110. package/dist/tests/titan-chatbot-ui/chatbot-restart-dialog.shared-tests.d.ts.map +0 -1
  111. package/dist/tests/titan-chatbot-ui/chatbot-restart-dialog.shared-tests.js +0 -60
  112. package/dist/tests/titan-chatbot-ui/chatbot-restart-dialog.shared-tests.js.map +0 -1
  113. package/dist/tests/titan-chatbot-ui/chatbot-restart-link.shared-tests.d.ts +0 -8
  114. package/dist/tests/titan-chatbot-ui/chatbot-restart-link.shared-tests.d.ts.map +0 -1
  115. package/dist/tests/titan-chatbot-ui/chatbot-restart-link.shared-tests.js +0 -77
  116. package/dist/tests/titan-chatbot-ui/chatbot-restart-link.shared-tests.js.map +0 -1
  117. package/dist/tests/titan-chatbot-ui/chatbot-session-feedback-modal.shared-tests.d.ts +0 -7
  118. package/dist/tests/titan-chatbot-ui/chatbot-session-feedback-modal.shared-tests.d.ts.map +0 -1
  119. package/dist/tests/titan-chatbot-ui/chatbot-session-feedback-modal.shared-tests.js +0 -130
  120. package/dist/tests/titan-chatbot-ui/chatbot-session-feedback-modal.shared-tests.js.map +0 -1
  121. package/dist/tests/titan-chatbot-ui/chatbot-titan-chatbot.shared-tests.d.ts +0 -9
  122. package/dist/tests/titan-chatbot-ui/chatbot-titan-chatbot.shared-tests.d.ts.map +0 -1
  123. package/dist/tests/titan-chatbot-ui/chatbot-titan-chatbot.shared-tests.js +0 -157
  124. package/dist/tests/titan-chatbot-ui/chatbot-titan-chatbot.shared-tests.js.map +0 -1
  125. package/dist/tests/titan-chatbot-ui/chatbot.shared-tests.d.ts +0 -9
  126. package/dist/tests/titan-chatbot-ui/chatbot.shared-tests.d.ts.map +0 -1
  127. package/dist/tests/titan-chatbot-ui/chatbot.shared-tests.js +0 -114
  128. package/dist/tests/titan-chatbot-ui/chatbot.shared-tests.js.map +0 -1
  129. package/dist/utils/test-utils-chatbot.d.ts +0 -5
  130. package/dist/utils/test-utils-chatbot.d.ts.map +0 -1
  131. package/dist/utils/test-utils-chatbot.js +0 -55
  132. package/dist/utils/test-utils-chatbot.js.map +0 -1
  133. package/dist/utils/test-utils.d.ts +0 -6
  134. package/dist/utils/test-utils.d.ts.map +0 -1
  135. package/dist/utils/test-utils.js +0 -38
  136. package/dist/utils/test-utils.js.map +0 -1
  137. package/src/tests/index.ts +0 -30
  138. package/src/tests/titan-chat-ui/chat-error.shared-tests.tsx +0 -185
  139. package/src/tests/titan-chat-ui/chat-input-file.shared-tests.tsx +0 -182
  140. package/src/tests/titan-chat-ui/chat-input.shared-tests.tsx +0 -99
  141. package/src/tests/titan-chat-ui/chat-log.shared-tests.tsx +0 -117
  142. package/src/tests/titan-chat-ui/chat-messages.shared-tests.tsx +0 -156
  143. package/src/tests/titan-chat-ui/chat-notifications.shared-tests.tsx +0 -153
  144. package/src/tests/titan-chat-ui/chat-timer.shared-tests.tsx +0 -106
  145. package/src/tests/titan-chat-ui/chat.shared-tests.tsx +0 -158
  146. package/src/tests/titan-chat-ui/message-agent.shared-tests.tsx +0 -170
  147. package/src/tests/titan-chat-ui/message-content-file.shared-tests.tsx +0 -139
  148. package/src/tests/titan-chat-ui/message-system.shared-tests.tsx +0 -147
  149. package/src/tests/titan-chat-ui/message-timeout.shared-tests.tsx +0 -117
  150. package/src/tests/titan-chat-ui/message-typing.shared-tests.tsx +0 -92
  151. package/src/tests/titan-chat-ui/message-user.shared-tests.tsx +0 -138
  152. package/src/tests/titan-chatbot-ui/chatbot-filters.shared-tests.tsx +0 -164
  153. package/src/tests/titan-chatbot-ui/chatbot-help-center.shared-tests.tsx +0 -225
  154. package/src/tests/titan-chatbot-ui/chatbot-links.shared-tests.tsx +0 -189
  155. package/src/tests/titan-chatbot-ui/chatbot-live.shared-tests.tsx +0 -127
  156. package/src/tests/titan-chatbot-ui/chatbot-message-answer-readonly.shared-tests.tsx +0 -187
  157. package/src/tests/titan-chatbot-ui/chatbot-message-answer.shared-tests.tsx +0 -144
  158. package/src/tests/titan-chatbot-ui/chatbot-message-feedback-form-guardrail.shared-tests.tsx +0 -127
  159. package/src/tests/titan-chatbot-ui/chatbot-message-feedback-form.shared-tests.tsx +0 -198
  160. package/src/tests/titan-chatbot-ui/chatbot-message-feedback-popover.shared-tests.tsx +0 -285
  161. package/src/tests/titan-chatbot-ui/chatbot-message-typing.shared-tests.tsx +0 -112
  162. package/src/tests/titan-chatbot-ui/chatbot-restart-dialog.shared-tests.tsx +0 -91
  163. package/src/tests/titan-chatbot-ui/chatbot-restart-link.shared-tests.tsx +0 -116
  164. package/src/tests/titan-chatbot-ui/chatbot-session-feedback-modal.shared-tests.tsx +0 -182
  165. package/src/tests/titan-chatbot-ui/chatbot-titan-chatbot.shared-tests.tsx +0 -221
  166. package/src/tests/titan-chatbot-ui/chatbot.shared-tests.tsx +0 -158
  167. package/src/utils/test-utils-chatbot.tsx +0 -73
  168. package/src/utils/test-utils.tsx +0 -52
@@ -1,182 +0,0 @@
1
- import { Container } from '@servicetitan/react-ioc';
2
- import {
3
- CHATBOT_API_CLIENT,
4
- CHATBOT_UI_STORE_TOKEN,
5
- ChatbotUiStore,
6
- IChatbotUiStore,
7
- Models,
8
- ModelsMocks,
9
- } from '@servicetitan/titan-chatbot-api';
10
- import { FC, ReactElement } from 'react';
11
- import { CypressMocks, testInitContainerChatbot, testRenderWrapperChatbot } from '../..';
12
- import { ChatUiSelectors } from '../../utils/chat-ui-selectors';
13
-
14
- interface IChatbotSessionFeedbackModalProps {
15
- onClose: () => void;
16
- }
17
-
18
- export function runChatbotSessionFeedbackModalSharedTests(
19
- ChatbotSessionFeedbackModalComponent: FC<IChatbotSessionFeedbackModalProps>,
20
- wrapperComponent?: (component: ReactElement) => ReactElement
21
- ) {
22
- let container: Container;
23
- let api: CypressMocks.ChatbotApiClientMock;
24
- let chatbotUiStore: IChatbotUiStore;
25
-
26
- const mockApiClient = () => {
27
- api.postSession = cy.stub().resolves(ModelsMocks.mockSession());
28
- api.getOptions = cy.stub().resolves(ModelsMocks.mockFrontendModel());
29
- };
30
-
31
- beforeEach(() => {
32
- container = testInitContainerChatbot();
33
- api = container.get<CypressMocks.ChatbotApiClientMock>(CHATBOT_API_CLIENT);
34
- chatbotUiStore = container.get<ChatbotUiStore>(CHATBOT_UI_STORE_TOKEN);
35
- mockApiClient();
36
- cy.viewport(550, 800);
37
- });
38
-
39
- const assertButtonSelection = (element: Cypress.Chainable<JQuery>, selected: boolean) => {
40
- element.should($el => {
41
- const hasClass = $el.hasClass('Button--selected');
42
- const hasAttr = $el.attr('aria-pressed') === 'true';
43
- expect(hasClass || hasAttr).to.equal(selected);
44
- });
45
- };
46
-
47
- const render = (onAfterInit?: () => void, onClose = cy.stub()) => {
48
- return cy.wrap(null).then(() => {
49
- const TestComponent: FC = () => {
50
- const component = <ChatbotSessionFeedbackModalComponent onClose={onClose} />;
51
- return wrapperComponent ? wrapperComponent(component) : component;
52
- };
53
- return testRenderWrapperChatbot(container, <TestComponent />, onAfterInit);
54
- });
55
- };
56
-
57
- it('should render the feedback modal with all elements', () => {
58
- render();
59
-
60
- ChatUiSelectors.chatbotSessionFeedbackModal.should('be.visible');
61
- ChatUiSelectors.chatbotSessionFeedbackThumbsUp.should('be.visible');
62
- ChatUiSelectors.chatbotSessionFeedbackThumbsDown.should('be.visible');
63
- ChatUiSelectors.chatbotSessionFeedbackComment.should('be.visible');
64
- ChatUiSelectors.chatbotSessionFeedbackCancel.should('be.visible');
65
- ChatUiSelectors.chatbotSessionFeedbackSubmit.should('be.visible');
66
- ChatUiSelectors.chatbotSessionFeedbackSubmit.should('be.disabled');
67
- });
68
-
69
- it('should enable submit button when thumbs up is selected', () => {
70
- render();
71
-
72
- ChatUiSelectors.chatbotSessionFeedbackThumbsUp.click();
73
- ChatUiSelectors.chatbotSessionFeedbackSubmit.should('not.be.disabled');
74
- assertButtonSelection(ChatUiSelectors.chatbotSessionFeedbackThumbsUp, true);
75
- assertButtonSelection(ChatUiSelectors.chatbotSessionFeedbackThumbsDown, false);
76
- });
77
-
78
- it('should enable submit button when thumbs down is selected', () => {
79
- render();
80
-
81
- ChatUiSelectors.chatbotSessionFeedbackThumbsDown.click();
82
- ChatUiSelectors.chatbotSessionFeedbackSubmit.should('not.be.disabled');
83
- assertButtonSelection(ChatUiSelectors.chatbotSessionFeedbackThumbsDown, true);
84
- });
85
-
86
- it('should allow switching between thumbs up and thumbs down', () => {
87
- render();
88
-
89
- ChatUiSelectors.chatbotSessionFeedbackThumbsUp.click();
90
- assertButtonSelection(ChatUiSelectors.chatbotSessionFeedbackThumbsUp, true);
91
- assertButtonSelection(ChatUiSelectors.chatbotSessionFeedbackThumbsDown, false);
92
-
93
- ChatUiSelectors.chatbotSessionFeedbackThumbsDown.click();
94
- assertButtonSelection(ChatUiSelectors.chatbotSessionFeedbackThumbsDown, true);
95
- assertButtonSelection(ChatUiSelectors.chatbotSessionFeedbackThumbsUp, false);
96
- });
97
-
98
- it('should allow entering a comment', () => {
99
- render();
100
-
101
- const testComment = 'This is my feedback comment';
102
- ChatUiSelectors.chatbotSessionFeedbackComment.type(testComment);
103
- ChatUiSelectors.chatbotSessionFeedbackComment.should('have.value', testComment);
104
- });
105
-
106
- it('should call onClose when cancel button is clicked', () => {
107
- const onClose = cy.stub().as('onClose');
108
- render(undefined, onClose);
109
-
110
- ChatUiSelectors.chatbotSessionFeedbackCancel.click();
111
- cy.then(() => {
112
- cy.get('@onClose').should('have.been.called');
113
- });
114
- });
115
-
116
- it('should submit feedback with thumbs up and close modal', () => {
117
- const onClose = cy.stub().as('onClose');
118
- render(undefined, onClose);
119
-
120
- ChatUiSelectors.chatbotSessionFeedbackThumbsUp.click();
121
- ChatUiSelectors.chatbotSessionFeedbackSubmit.click();
122
-
123
- cy.wait(1).then(() => {
124
- cy.get('@onClose').should('have.been.called');
125
- });
126
- });
127
-
128
- it('should submit feedback with thumbs down, comment and close modal', () => {
129
- const onClose = cy.stub().as('onClose');
130
- render(undefined, onClose);
131
-
132
- const testComment = 'This did not help me at all';
133
- ChatUiSelectors.chatbotSessionFeedbackThumbsDown.click();
134
- ChatUiSelectors.chatbotSessionFeedbackComment.type(testComment);
135
- ChatUiSelectors.chatbotSessionFeedbackSubmit.click();
136
-
137
- cy.wait(1).then(() => {
138
- cy.get('@onClose').should('have.been.called');
139
- });
140
- });
141
-
142
- it('should send session feedback to the store when submitting', () => {
143
- const onClose = cy.stub();
144
- render(undefined, onClose);
145
-
146
- cy.spy(chatbotUiStore, 'sendSessionFeedback').as('sendSessionFeedback');
147
-
148
- ChatUiSelectors.chatbotSessionFeedbackThumbsUp.click();
149
- ChatUiSelectors.chatbotSessionFeedbackSubmit.click();
150
-
151
- cy.get('@sendSessionFeedback').should('have.been.called');
152
- cy.get('@sendSessionFeedback').should(
153
- 'have.been.calledWith',
154
- new Models.Feedback({
155
- sessionId: ModelsMocks.mockSession().id,
156
- rating: Models.FeedbackRatings.ThumbsUp,
157
- })
158
- );
159
- });
160
-
161
- it('should send session feedback with comment when submitting', () => {
162
- const onClose = cy.stub();
163
- render(undefined, onClose);
164
-
165
- cy.spy(chatbotUiStore, 'sendSessionFeedback').as('sendSessionFeedback');
166
-
167
- const testComment = 'Great experience!';
168
- ChatUiSelectors.chatbotSessionFeedbackThumbsUp.click();
169
- ChatUiSelectors.chatbotSessionFeedbackComment.type(testComment);
170
- ChatUiSelectors.chatbotSessionFeedbackSubmit.click();
171
-
172
- cy.get('@sendSessionFeedback').should('have.been.called');
173
- cy.get('@sendSessionFeedback').should(
174
- 'have.been.calledWithMatch',
175
- new Models.Feedback({
176
- sessionId: ModelsMocks.mockSession().id,
177
- rating: Models.FeedbackRatings.ThumbsUp,
178
- description: testComment,
179
- })
180
- );
181
- });
182
- }
@@ -1,221 +0,0 @@
1
- import { ILog, Log } from '@servicetitan/log-service';
2
- import { Container, Provider } from '@servicetitan/react-ioc';
3
- import {
4
- ApiClientTitanChat,
5
- CHATBOT_API_CLIENT,
6
- CHATBOT_CLIENT_SETTINGS,
7
- CHATBOT_UI_BACKEND_STORE_TOKEN,
8
- CHATBOT_UI_STORE_TOKEN,
9
- ChatbotCustomizations,
10
- ChatbotUiBackendStore,
11
- ChatbotUiStore,
12
- IChatbotApiClient,
13
- IChatbotUiBackendStore,
14
- IChatbotUiStore,
15
- Models,
16
- } from '@servicetitan/titan-chatbot-api';
17
- import { mount } from 'cypress/react';
18
- import { FC, ReactElement, useMemo } from 'react';
19
- import { CypressMocks } from '../..';
20
- import { ChatUiSelectors } from '../../utils/chat-ui-selectors';
21
-
22
- const ChatbotBaseUrl = 'https://chatbot-api.example.com/base/url';
23
- const ChatbotVersion = 2;
24
-
25
- const initializeTitanChatbotContainer = () => {
26
- const rootContainer = new Container();
27
- const container = new Container();
28
- container.parent = rootContainer;
29
- container.bind<ILog>(Log).to(CypressMocks.LogMock).inSingletonScope();
30
- container.bind<IChatbotUiStore>(CHATBOT_UI_STORE_TOKEN).to(ChatbotUiStore).inSingletonScope();
31
- container
32
- .bind<IChatbotUiBackendStore>(CHATBOT_UI_BACKEND_STORE_TOKEN)
33
- .to(ChatbotUiBackendStore)
34
- .inSingletonScope();
35
-
36
- // Set up Helpcenter API client
37
- const clientSettings: ApiClientTitanChat.IChatbotClientSettingsTitanChat = {
38
- clientId: 'TitanChatClientId',
39
- version: String(ChatbotVersion),
40
- constructorParametersFactory: () => ({
41
- baseUrl: ChatbotBaseUrl,
42
- }),
43
- };
44
- container
45
- .bind<ApiClientTitanChat.IChatbotClientSettingsTitanChat>(CHATBOT_CLIENT_SETTINGS)
46
- .toConstantValue(clientSettings);
47
- container
48
- .bind<IChatbotApiClient>(CHATBOT_API_CLIENT)
49
- .to(ApiClientTitanChat.ChatbotApiClient)
50
- .inSingletonScope();
51
- return container;
52
- };
53
-
54
- interface IChatbotProps {
55
- className?: string;
56
- customizations?: ChatbotCustomizations;
57
- }
58
-
59
- export function runChatbotTitanChatbotSharedTests(
60
- ChatbotComponent: FC<IChatbotProps>,
61
- wrapperComponent?: (component: ReactElement) => ReactElement
62
- ) {
63
- let container: Container;
64
- let log: CypressMocks.LogMock;
65
- let apiClientSettings: ApiClientTitanChat.IChatbotClientSettingsTitanChat;
66
- let apiClient: ApiClientTitanChat.ChatbotApiClient;
67
- let uiStore: ChatbotUiStore;
68
- let uiBackendStore: ChatbotUiBackendStore;
69
-
70
- beforeEach(() => {
71
- container = initializeTitanChatbotContainer();
72
- log = container.get<CypressMocks.LogMock>(Log);
73
- apiClientSettings =
74
- container.get<ApiClientTitanChat.IChatbotClientSettingsTitanChat>(
75
- CHATBOT_CLIENT_SETTINGS
76
- );
77
- apiClient = container.get<ApiClientTitanChat.ChatbotApiClient>(CHATBOT_API_CLIENT);
78
- uiStore = container.get<ChatbotUiStore>(CHATBOT_UI_STORE_TOKEN);
79
- uiBackendStore = container.get<ChatbotUiBackendStore>(CHATBOT_UI_BACKEND_STORE_TOKEN);
80
- cy.viewport(550, 800);
81
- cy.clock(Date.parse('2023-10-01T00:00:00Z'));
82
- });
83
-
84
- const render = () => {
85
- const ChatbotWrapper: FC = () => {
86
- const customizationContext = useMemo<ChatbotCustomizations>(
87
- () => ({
88
- filters: { enabled: true },
89
- feedback: { title: 'TITLE' },
90
- }),
91
- []
92
- );
93
-
94
- const component = (
95
- <ChatbotComponent
96
- className="h-100vh max-h-100vh of-x-hidden"
97
- customizations={customizationContext}
98
- />
99
- );
100
-
101
- const wrappedComponent = wrapperComponent ? wrapperComponent(component) : component;
102
-
103
- return (
104
- <Provider
105
- singletons={[
106
- {
107
- provide: Log,
108
- useValue: log,
109
- },
110
- {
111
- provide: CHATBOT_CLIENT_SETTINGS,
112
- useValue: apiClientSettings,
113
- },
114
- { provide: CHATBOT_API_CLIENT, useValue: apiClient },
115
- {
116
- provide: CHATBOT_UI_STORE_TOKEN,
117
- useValue: uiStore,
118
- },
119
- {
120
- provide: CHATBOT_UI_BACKEND_STORE_TOKEN,
121
- useValue: uiBackendStore,
122
- },
123
- ]}
124
- >
125
- {wrappedComponent}
126
- </Provider>
127
- );
128
- };
129
- cy.spy(uiStore, 'run').as('runSpy');
130
- mount(<ChatbotWrapper />);
131
- return cy.wrap(
132
- new Promise(resolve => {
133
- cy.get('@runSpy')
134
- .should('have.been.calledOnce')
135
- .then((invocation: any) => {
136
- const initPromise = invocation.firstCall.returnValue as ReturnType<
137
- IChatbotUiStore['run']
138
- >;
139
- initPromise.then(resolve);
140
- });
141
- })
142
- );
143
- };
144
-
145
- it('should render the chatbot with titan chat API', () => {
146
- const optionsMock = CypressMocks.TC.Options;
147
- const sessionMock = CypressMocks.TC.SessionPost;
148
- const messageMock = CypressMocks.TC.MessagePost;
149
- const messageFeedbackMock = CypressMocks.TC.MessageFeedbackPost;
150
- const sessionFeedbackMock = CypressMocks.TC.SessionFeedbackPost;
151
-
152
- const aliasOptions = optionsMock.intercept(ChatbotBaseUrl, ChatbotVersion);
153
- const aliasSession = sessionMock.intercept(ChatbotBaseUrl, ChatbotVersion);
154
- const aliasMessage = messageMock.intercept(ChatbotBaseUrl, ChatbotVersion);
155
- const { aliasPostMessage, aliasPostSession } = CypressMocks.TC.interceptFeedback(
156
- ChatbotBaseUrl,
157
- ChatbotVersion
158
- );
159
-
160
- render().then(() => {
161
- cy.log('Getting options...');
162
- cy.wait(aliasOptions).then(interception => {
163
- expect(interception.request.url).to.equal(
164
- `${ChatbotBaseUrl}/api/v${ChatbotVersion}/options`
165
- );
166
- expect(interception.response?.statusCode).to.equal(200);
167
- expect(interception.response?.body).to.deep.equal(optionsMock.response);
168
- });
169
-
170
- // Ask the bot a question
171
- cy.log('Sending message...');
172
- ChatUiSelectors.chatInput.type(`${messageMock.request.question}{enter}`, { delay: 0 });
173
-
174
- // Check that the session was created
175
- cy.wait(aliasSession).then(interception => {
176
- expect(interception.request.url).to.equal(
177
- `${ChatbotBaseUrl}/api/v${ChatbotVersion}/session`
178
- );
179
- expect(interception.request.body).to.deep.equal(sessionMock.request);
180
- expect(interception.response?.body).to.deep.equal(sessionMock.response);
181
- expect(interception.response?.statusCode).to.equal(200);
182
- });
183
-
184
- // Check the user message is sent
185
- cy.wait(aliasMessage).then(interception => {
186
- expect(interception.request.url).to.equal(
187
- `${ChatbotBaseUrl}/api/v${ChatbotVersion}/message`
188
- );
189
- expect(interception.request.body).to.deep.equal(messageMock.request);
190
- expect(interception.response?.body).to.deep.equal(messageMock.response);
191
- expect(interception.response?.statusCode).to.equal(200);
192
- });
193
-
194
- cy.tick(100);
195
- // Send session feedback (manually)
196
- cy.log('Sending session feedback...');
197
- uiStore.sendSessionFeedback(new Models.Feedback(sessionFeedbackMock.request));
198
- cy.wait(aliasPostSession).then(interception => {
199
- expect(interception.request.url).to.equal(
200
- `${ChatbotBaseUrl}/api/v${ChatbotVersion}/feedback`
201
- );
202
- expect(interception.request.body).to.deep.equal(sessionFeedbackMock.request);
203
- expect(interception.response?.body).to.deep.equal(sessionFeedbackMock.response);
204
- expect(interception.response?.statusCode).to.equal(200);
205
- });
206
-
207
- cy.tick(100);
208
- // Check the feedback is sent with thumbs up
209
- cy.log('Sending message feedback...');
210
- ChatUiSelectors.chatbotMessageFeedbackThumbsUp.scrollIntoView().click({ force: true });
211
- cy.wait(aliasPostMessage).then(interception => {
212
- expect(interception.request.url).to.equal(
213
- `${ChatbotBaseUrl}/api/v${ChatbotVersion}/feedback`
214
- );
215
- expect(interception.request.body).to.deep.equal(messageFeedbackMock.request);
216
- expect(interception.response?.body).to.deep.equal(messageFeedbackMock.response);
217
- expect(interception.response?.statusCode).to.equal(200);
218
- });
219
- });
220
- });
221
- }
@@ -1,158 +0,0 @@
1
- import { Container } from '@servicetitan/react-ioc';
2
- import {
3
- CHATBOT_API_CLIENT,
4
- CHATBOT_UI_STORE_TOKEN,
5
- ChatbotCustomizations,
6
- ChatbotUiStore,
7
- IChatbotUiStore,
8
- Models,
9
- ModelsMocks,
10
- } from '@servicetitan/titan-chatbot-api';
11
- import { CSSProperties, FC, ReactElement } from 'react';
12
- import { CypressMocks, testInitContainerChatbot, testRenderWrapperChatbot } from '../..';
13
- import { ChatUiSelectors } from '../../utils/chat-ui-selectors';
14
-
15
- interface IChatbotProps {
16
- style?: CSSProperties;
17
- customizations?: ChatbotCustomizations;
18
- }
19
-
20
- export function runChatbotSharedTests(
21
- ChatbotComponent: FC<IChatbotProps>,
22
- wrapperComponent?: (component: ReactElement) => ReactElement
23
- ) {
24
- let container: Container;
25
- let api: CypressMocks.ChatbotApiClientMock;
26
- let chatbotUiStore: IChatbotUiStore;
27
-
28
- const mockApiClient = () => {
29
- api.postSession = cy.stub().resolves(ModelsMocks.mockSession());
30
- api.getOptions = cy.stub().resolves(ModelsMocks.mockFrontendModel());
31
- };
32
-
33
- const mockAskBotApi = (answer: string) => {
34
- api.postMessage = cy.stub().as('askBot').resolves(
35
- ModelsMocks.mockBotMessage({
36
- answer,
37
- })
38
- );
39
- api.postFeedback = cy
40
- .stub()
41
- .as('askBotFeedback')
42
- .resolves(
43
- ModelsMocks.mockFeedback({
44
- rating: Models.FeedbackRatings.ThumbsUp,
45
- })
46
- );
47
- };
48
-
49
- beforeEach(() => {
50
- container = testInitContainerChatbot();
51
- api = container.get<CypressMocks.ChatbotApiClientMock>(CHATBOT_API_CLIENT);
52
- chatbotUiStore = container.get<ChatbotUiStore>(CHATBOT_UI_STORE_TOKEN);
53
- mockApiClient();
54
- cy.viewport(550, 800);
55
- });
56
-
57
- const render = (onAfterInit?: () => void) => {
58
- return cy.wrap(null).then(() => {
59
- const customizationContext: ChatbotCustomizations = {
60
- filters: { enabled: true },
61
- feedback: { title: 'TITLE' },
62
- };
63
- const component = (
64
- <ChatbotComponent
65
- style={{
66
- height: '100vh',
67
- width: '100%',
68
- maxWidth: '100vh',
69
- overflowX: 'hidden',
70
- }}
71
- customizations={customizationContext}
72
- />
73
- );
74
- const wrappedComponent = wrapperComponent ? wrapperComponent(component) : component;
75
-
76
- return testRenderWrapperChatbot(container, wrappedComponent, onAfterInit);
77
- });
78
- };
79
-
80
- const doAskBot = (message: string) => {
81
- ChatUiSelectors.chatInput.type(`${message}{enter}`, { delay: 0 });
82
- };
83
- const doTriggerFile = () => {
84
- chatbotUiStore.setFilePickerEnabled(true);
85
- cy.then(() => {
86
- ChatUiSelectors.chatUploadFile.should('be.visible');
87
- });
88
- };
89
-
90
- it('should render the chatbot component', () => {
91
- mockAskBotApi("Hello! I'm chatbot mocked response!!!");
92
-
93
- render();
94
-
95
- // Pick filter
96
- ChatUiSelectors.chatbotFilterButton.first().click();
97
- ChatUiSelectors.chatbotFilterOptions.find('label').first().click();
98
- ChatUiSelectors.chatbotFilterButton.first().click();
99
-
100
- // Ask chatbot
101
- doAskBot('Hello, Chatbot!');
102
- doAskBot('Hello, Chatbot! Hello, Chatbot! Hello, Chatbot! Hello, Chatbot! Hello, Chatbot!');
103
- doTriggerFile();
104
-
105
- // Check if the message is sent
106
- cy.get('@askBot').should('have.been.calledTwice');
107
- });
108
-
109
- describe('with error handling', () => {
110
- const mockAskBotApiError = (errorMessage: string) => {
111
- api.postMessage = cy.stub().as('askBot').rejects(new Error(errorMessage));
112
- };
113
-
114
- it('should react on send message API error', () => {
115
- mockAskBotApiError('Chatbot API error');
116
- render();
117
-
118
- doAskBot('Hello, Chatbot!');
119
-
120
- cy.then(() => {
121
- ChatUiSelectors.chatMessageFooter
122
- .last()
123
- .should('be.visible')
124
- .should('contain.text', 'Message not delivered. Retry');
125
- const errorBanner = ChatUiSelectors.chatError.should('be.visible').within(() => {
126
- errorBanner
127
- .find('.Banner__text > .Banner__title, [class^="_title-container"]')
128
- .should('contain.text', 'Chat Error');
129
- ChatUiSelectors.chatErrorText
130
- .should('be.visible')
131
- .should('contain.text', 'Failed to send message');
132
- });
133
- });
134
-
135
- cy.then(() => {
136
- mockAskBotApi("Hello! I'm chatbot mocked response!!!");
137
- ChatUiSelectors.chatMessageErrorRetry.click();
138
- ChatUiSelectors.chatMessageContentAgent
139
- .should('be.visible')
140
- .should('contain.text', "Hello! I'm chatbot mocked response!!!");
141
- });
142
- });
143
- });
144
-
145
- describe('with message feedback', () => {
146
- it('should render the chatbot component', () => {
147
- mockAskBotApi("Hello! I'm chatbot mocked response!!!");
148
- render();
149
-
150
- doAskBot('Hello!');
151
- ChatUiSelectors.chatbotMessageFeedbackThumbsUp.should('be.visible').click();
152
- cy.get('@askBotFeedback').should('have.been.calledOnce');
153
- ChatUiSelectors.chatbotMessageFeedbackSuccess
154
- .should('be.visible')
155
- .should('contain.text', 'Thanks for your feedback.');
156
- });
157
- });
158
- }
@@ -1,73 +0,0 @@
1
- import { ILog, Log } from '@servicetitan/log-service';
2
- import { Container, provide } from '@servicetitan/react-ioc';
3
- import { ChatParticipantIcon } from '@servicetitan/titan-chat-ui-common';
4
- import {
5
- CHATBOT_API_CLIENT,
6
- CHATBOT_UI_BACKEND_STORE_TOKEN,
7
- CHATBOT_UI_STORE_TOKEN,
8
- ChatbotUiBackendStore,
9
- ChatbotUiStore,
10
- IChatbotApiClient,
11
- IChatbotUiBackendStore,
12
- IChatbotUiStore,
13
- } from '@servicetitan/titan-chatbot-api';
14
- import { mount } from 'cypress/react';
15
- import { FC, ReactNode } from 'react';
16
- import { CypressMocks } from '..';
17
-
18
- export const testInitContainerChatbot = () => {
19
- const rootContainer = new Container();
20
- const container = new Container();
21
- container.parent = rootContainer;
22
- container.bind<ILog>(Log).to(CypressMocks.LogMock).inSingletonScope();
23
- container
24
- .bind<IChatbotApiClient>(CHATBOT_API_CLIENT)
25
- .to(CypressMocks.ChatbotApiClientMock)
26
- .inSingletonScope();
27
- container.bind<IChatbotUiStore>(CHATBOT_UI_STORE_TOKEN).to(ChatbotUiStore).inSingletonScope();
28
- container
29
- .bind<IChatbotUiBackendStore>(CHATBOT_UI_BACKEND_STORE_TOKEN)
30
- .to(ChatbotUiBackendStore)
31
- .inSingletonScope();
32
- return container;
33
- };
34
-
35
- export const testRenderWrapperChatbot = async (
36
- container: Container,
37
- component: ReactNode,
38
- onAfterInit: () => void = () => {}
39
- ) => {
40
- const log = container.get<ILog>(Log);
41
- const chatbotApiClient = container.get<IChatbotApiClient>(CHATBOT_API_CLIENT);
42
- const chatbotUiStore = container.get<IChatbotUiStore>(CHATBOT_UI_STORE_TOKEN);
43
- const chatbotUiBackendStore = container.get<IChatbotUiBackendStore>(
44
- CHATBOT_UI_BACKEND_STORE_TOKEN
45
- );
46
-
47
- chatbotUiBackendStore.subscribe();
48
- await chatbotUiStore.run({
49
- agentName: 'EchoBot',
50
- agentIcon: ChatParticipantIcon.Bot,
51
- });
52
- onAfterInit?.();
53
-
54
- const RenderWrapper: FC = provide({
55
- singletons: [
56
- {
57
- provide: Log,
58
- useValue: log,
59
- },
60
- { provide: CHATBOT_API_CLIENT, useValue: chatbotApiClient },
61
- {
62
- provide: CHATBOT_UI_STORE_TOKEN,
63
- useValue: chatbotUiStore,
64
- },
65
- {
66
- provide: CHATBOT_UI_BACKEND_STORE_TOKEN,
67
- useValue: chatbotUiBackendStore,
68
- },
69
- ],
70
- })(() => component);
71
- RenderWrapper.displayName = 'RenderWrapper';
72
- mount(<RenderWrapper />);
73
- };
@@ -1,52 +0,0 @@
1
- import { Container, provide } from '@servicetitan/react-ioc';
2
- import {
3
- CHAT_UI_BACKEND_STORE_TOKEN,
4
- CHAT_UI_STORE_TOKEN,
5
- ChatParticipantIcon,
6
- ChatUiBackendEchoStore,
7
- ChatUiStore,
8
- IChatUiBackendStore,
9
- IChatUiStore,
10
- } from '@servicetitan/titan-chat-ui-common';
11
- import { mount } from 'cypress/react';
12
- import { FC, ReactNode } from 'react';
13
-
14
- export const testInitContainer = () => {
15
- const rootContainer = new Container();
16
- const container = new Container();
17
- container.parent = rootContainer;
18
- container.bind<IChatUiStore>(CHAT_UI_STORE_TOKEN).to(ChatUiStore).inSingletonScope();
19
- container
20
- .bind<IChatUiBackendStore>(CHAT_UI_BACKEND_STORE_TOKEN)
21
- .to(ChatUiBackendEchoStore)
22
- .inSingletonScope();
23
- return container;
24
- };
25
-
26
- export const testRenderWrapper = async (
27
- chatUiStore: IChatUiStore,
28
- chatUiBackendStore: IChatUiBackendStore,
29
- component: ReactNode,
30
- onAfterInit: () => void = () => {}
31
- ) => {
32
- chatUiBackendStore.subscribe();
33
- await chatUiStore.run({
34
- agentName: 'EchoBot',
35
- agentIcon: ChatParticipantIcon.Bot,
36
- });
37
- onAfterInit?.();
38
- const RenderWrapper: FC = provide({
39
- singletons: [
40
- {
41
- provide: CHAT_UI_STORE_TOKEN,
42
- useValue: chatUiStore,
43
- },
44
- {
45
- provide: CHAT_UI_BACKEND_STORE_TOKEN,
46
- useValue: chatUiBackendStore,
47
- },
48
- ],
49
- })(() => component);
50
- RenderWrapper.displayName = 'RenderWrapper';
51
- mount(<RenderWrapper />);
52
- };