@@ -10,6 +10,7 @@ import {
1010 screenshotIfFailed ,
1111 DEFAULT_CONNECTION_NAME_1 ,
1212 skipForWeb ,
13+ screenshotPathName ,
1314} from '../helpers/compass' ;
1415import type { Compass } from '../helpers/compass' ;
1516import * as Selectors from '../helpers/selectors' ;
@@ -48,124 +49,129 @@ describe('MongoDB Assistant', function () {
4849 const collectionName = 'entryPoints' ;
4950
5051 before ( async function ( ) {
51- mockAtlasServer = await startMockAtlasServiceServer ( ) ;
52- mockAssistantServer = await startMockAssistantServer ( ) ;
52+ try {
53+ mockAtlasServer = await startMockAtlasServiceServer ( ) ;
54+ mockAssistantServer = await startMockAssistantServer ( ) ;
5355
54- process . env . COMPASS_ATLAS_SERVICE_UNAUTH_BASE_URL_OVERRIDE =
55- mockAtlasServer . endpoint ;
56+ process . env . COMPASS_ATLAS_SERVICE_UNAUTH_BASE_URL_OVERRIDE =
57+ mockAtlasServer . endpoint ;
5658
57- telemetry = await startTelemetryServer ( ) ;
58- compass = await init ( this . test ?. fullTitle ( ) ) ;
59+ telemetry = await startTelemetryServer ( ) ;
60+ compass = await init ( this . test ?. fullTitle ( ) ) ;
5961
60- sendMessage = async (
61- text : string ,
62- {
63- response = {
64- status : 200 ,
65- body : testResponse ,
66- } ,
67- expectedResult = 'success' ,
68- } : {
69- response ?: MockAssistantResponse ;
70- expectedResult ?: 'success' | 'opt-in' ;
71- } = { }
72- ) => {
73- const existingMessages = await getDisplayedMessages ( browser ) ;
74-
75- mockAssistantServer . setResponse ( response ) ;
76- const chatInput = browser . $ ( Selectors . AssistantChatInputTextArea ) ;
77- await chatInput . waitForDisplayed ( ) ;
78- await chatInput . setValue ( text ) ;
79- await browser . clickVisible ( Selectors . AssistantChatSubmitButton ) ;
80-
81- switch ( expectedResult ) {
82- case 'success' :
83- await browser . waitUntil ( async ( ) => {
84- const newMessages = await getDisplayedMessages ( browser ) ;
85- return (
86- newMessages . length > existingMessages . length &&
87- newMessages . some (
88- ( message ) =>
89- message . text === response ?. body &&
90- message . role === 'assistant'
91- ) &&
92- newMessages . some (
93- ( message ) => message . text === text && message . role === 'user'
94- )
95- ) ;
96- } ) ;
97- break ;
98- case 'opt-in' :
99- await browser
100- . $ ( Selectors . AIOptInModalAcceptButton )
101- . waitForDisplayed ( ) ;
102- }
103- } ;
104-
105- const setup = async ( ) => {
106- browser = compass . browser ;
107- await setAIFeatures ( true ) ;
108-
109- await browser . setupDefaultConnections ( ) ;
110- await browser . connectToDefaults ( ) ;
111- await browser . selectConnectionMenuItem (
112- DEFAULT_CONNECTION_NAME_1 ,
113- Selectors . CreateDatabaseButton ,
114- false
115- ) ;
116- await browser . addDatabase ( dbName , collectionName ) ;
117-
118- await browser . navigateToCollectionTab (
119- DEFAULT_CONNECTION_NAME_1 ,
120- dbName ,
121- collectionName ,
122- 'Aggregations'
123- ) ;
124- } ;
125-
126- setAIFeatures = async ( newValue : boolean ) => {
127- if ( isTestingWeb ( ) ) {
128- await browser . setEnv (
129- 'COMPASS_OVERRIDE_ENABLE_AI_FEATURES' ,
130- newValue ? 'true' : 'false'
62+ sendMessage = async (
63+ text : string ,
64+ {
65+ response = {
66+ status : 200 ,
67+ body : testResponse ,
68+ } ,
69+ expectedResult = 'success' ,
70+ } : {
71+ response ?: MockAssistantResponse ;
72+ expectedResult ?: 'success' | 'opt-in' ;
73+ } = { }
74+ ) => {
75+ const existingMessages = await getDisplayedMessages ( browser ) ;
76+
77+ mockAssistantServer . setResponse ( response ) ;
78+ const chatInput = browser . $ ( Selectors . AssistantChatInputTextArea ) ;
79+ await chatInput . waitForDisplayed ( ) ;
80+ await chatInput . setValue ( text ) ;
81+ await browser . clickVisible ( Selectors . AssistantChatSubmitButton ) ;
82+
83+ switch ( expectedResult ) {
84+ case 'success' :
85+ await browser . waitUntil ( async ( ) => {
86+ const newMessages = await getDisplayedMessages ( browser ) ;
87+ return (
88+ newMessages . length > existingMessages . length &&
89+ newMessages . some (
90+ ( message ) =>
91+ message . text === response ?. body &&
92+ message . role === 'assistant'
93+ ) &&
94+ newMessages . some (
95+ ( message ) => message . text === text && message . role === 'user'
96+ )
97+ ) ;
98+ } ) ;
99+ break ;
100+ case 'opt-in' :
101+ await browser
102+ . $ ( Selectors . AIOptInModalAcceptButton )
103+ . waitForDisplayed ( ) ;
104+ }
105+ } ;
106+
107+ const setup = async ( ) => {
108+ browser = compass . browser ;
109+ await setAIFeatures ( true ) ;
110+
111+ await browser . setupDefaultConnections ( ) ;
112+ await browser . connectToDefaults ( ) ;
113+ await browser . selectConnectionMenuItem (
114+ DEFAULT_CONNECTION_NAME_1 ,
115+ Selectors . CreateDatabaseButton ,
116+ false
131117 ) ;
132- }
133- await browser . setFeature ( 'enableGenAIFeatures' , newValue ) ;
118+ await browser . addDatabase ( dbName , collectionName ) ;
134119
135- if ( newValue ) {
136- await browser . $ ( Selectors . AssistantDrawerButton ) . waitForDisplayed ( ) ;
137- } else {
138- await browser . $ ( Selectors . AssistantDrawerButton ) . waitForDisplayed ( {
139- reverse : true ,
140- } ) ;
141- }
142- } ;
143-
144- setAIOptIn = async ( newValue : boolean ) => {
145- if (
146- isTestingWeb ( ) ||
147- ( ( await browser . getFeature ( 'optInGenAIFeatures' ) ) === true &&
148- newValue === false )
149- ) {
150- await cleanup ( compass ) ;
151- // Reseting the opt-in to false can be tricky so it's best to start over in this case.
152- compass = await init ( this . test ?. fullTitle ( ) , { firstRun : true } ) ;
153- await setup ( ) ;
120+ await browser . navigateToCollectionTab (
121+ DEFAULT_CONNECTION_NAME_1 ,
122+ dbName ,
123+ collectionName ,
124+ 'Aggregations'
125+ ) ;
126+ } ;
154127
128+ setAIFeatures = async ( newValue : boolean ) => {
155129 if ( isTestingWeb ( ) ) {
156- await setAIFeatures ( true ) ;
130+ await browser . setEnv (
131+ 'COMPASS_OVERRIDE_ENABLE_AI_FEATURES' ,
132+ newValue ? 'true' : 'false'
133+ ) ;
157134 }
158- await browser . setFeature (
159- 'optInGenAIFeatures' ,
160- newValue ? 'true' : 'false'
161- ) ;
162- return ;
163- }
135+ await browser . setFeature ( 'enableGenAIFeatures' , newValue ) ;
164136
165- await browser . setFeature ( 'optInGenAIFeatures' , newValue ) ;
166- } ;
137+ if ( newValue ) {
138+ await browser . $ ( Selectors . AssistantDrawerButton ) . waitForDisplayed ( ) ;
139+ } else {
140+ await browser . $ ( Selectors . AssistantDrawerButton ) . waitForDisplayed ( {
141+ reverse : true ,
142+ } ) ;
143+ }
144+ } ;
145+
146+ setAIOptIn = async ( newValue : boolean ) => {
147+ if (
148+ isTestingWeb ( ) ||
149+ ( ( await browser . getFeature ( 'optInGenAIFeatures' ) ) === true &&
150+ newValue === false )
151+ ) {
152+ await cleanup ( compass ) ;
153+ // Reseting the opt-in to false can be tricky so it's best to start over in this case.
154+ compass = await init ( this . test ?. fullTitle ( ) , { firstRun : true } ) ;
155+ await setup ( ) ;
156+
157+ if ( isTestingWeb ( ) ) {
158+ await setAIFeatures ( true ) ;
159+ }
160+ await browser . setFeature (
161+ 'optInGenAIFeatures' ,
162+ newValue ? 'true' : 'false'
163+ ) ;
164+ return ;
165+ }
166+
167+ await browser . setFeature ( 'optInGenAIFeatures' , newValue ) ;
168+ } ;
167169
168- await setup ( ) ;
170+ await setup ( ) ;
171+ } catch ( err ) {
172+ await browser . screenshot ( screenshotPathName ( 'before-MongoDB-Assistant' ) ) ;
173+ throw err ;
174+ }
169175 } ) ;
170176
171177 after ( async function ( ) {
@@ -179,10 +185,17 @@ describe('MongoDB Assistant', function () {
179185 } ) ;
180186
181187 afterEach ( async function ( ) {
182- mockAssistantServer . clearRequests ( ) ;
183- await clearChat ( browser ) ;
184-
185188 await screenshotIfFailed ( compass , this . currentTest ) ;
189+
190+ try {
191+ mockAssistantServer . clearRequests ( ) ;
192+ await clearChat ( browser ) ;
193+ } catch ( err ) {
194+ await browser . screenshot (
195+ screenshotPathName ( 'afterEach-MongoDB-Assistant' )
196+ ) ;
197+ throw err ;
198+ }
186199 } ) ;
187200
188201 describe ( 'drawer visibility' , function ( ) {
@@ -296,8 +309,13 @@ describe('MongoDB Assistant', function () {
296309 this ,
297310 'E2E testing for opt-in on compass-web is not yet implemented'
298311 ) ;
299- await setAIOptIn ( false ) ;
300- await openAssistantDrawer ( browser ) ;
312+ try {
313+ await setAIOptIn ( false ) ;
314+ await openAssistantDrawer ( browser ) ;
315+ } catch ( err ) {
316+ await browser . screenshot ( screenshotPathName ( 'before-opting-in' ) ) ;
317+ throw err ;
318+ }
301319 } ) ;
302320
303321 it ( 'sends the message if the user opts in' , async function ( ) {
@@ -323,8 +341,13 @@ describe('MongoDB Assistant', function () {
323341
324342 describe ( 'after opt-in' , function ( ) {
325343 before ( async function ( ) {
326- await setAIOptIn ( true ) ;
327- await openAssistantDrawer ( browser ) ;
344+ try {
345+ await setAIOptIn ( true ) ;
346+ await openAssistantDrawer ( browser ) ;
347+ } catch ( err ) {
348+ await browser . screenshot ( screenshotPathName ( 'before-after-opting-in' ) ) ;
349+ throw err ;
350+ }
328351 } ) ;
329352
330353 describe ( 'clear chat button' , function ( ) {
@@ -442,13 +465,20 @@ describe('MongoDB Assistant', function () {
442465 describe ( 'entry points' , function ( ) {
443466 describe ( 'explain plan entry point' , function ( ) {
444467 before ( async function ( ) {
445- await setAIOptIn ( true ) ;
446- await setAIFeatures ( true ) ;
447-
448- mockAssistantServer . setResponse ( {
449- status : 200 ,
450- body : 'You should create an index.' ,
451- } ) ;
468+ try {
469+ await setAIOptIn ( true ) ;
470+ await setAIFeatures ( true ) ;
471+
472+ mockAssistantServer . setResponse ( {
473+ status : 200 ,
474+ body : 'You should create an index.' ,
475+ } ) ;
476+ } catch ( err ) {
477+ await browser . screenshot (
478+ screenshotPathName ( 'before-explain-plan-entry-point' )
479+ ) ;
480+ throw err ;
481+ }
452482 } ) ;
453483
454484 it ( 'opens assistant with explain plan prompt when clicking "Interpret for me"' , async function ( ) {
0 commit comments