@@ -74,6 +74,16 @@ function createMockFrame(): jest.Mocked<EditorFrameInstance> {
7474 } ;
7575}
7676
77+ function createMockSearchService ( ) {
78+ let sessionIdCounter = 1 ;
79+ return {
80+ session : {
81+ start : jest . fn ( ( ) => `sessionId-${ sessionIdCounter ++ } ` ) ,
82+ clear : jest . fn ( ) ,
83+ } ,
84+ } ;
85+ }
86+
7787function createMockFilterManager ( ) {
7888 const unsubscribe = jest . fn ( ) ;
7989
@@ -118,16 +128,29 @@ function createMockQueryString() {
118128function createMockTimefilter ( ) {
119129 const unsubscribe = jest . fn ( ) ;
120130
131+ let timeFilter = { from : 'now-7d' , to : 'now' } ;
132+ let subscriber : ( ) => void ;
121133 return {
122- getTime : jest . fn ( ( ) => ( { from : 'now-7d' , to : 'now' } ) ) ,
123- setTime : jest . fn ( ) ,
134+ getTime : jest . fn ( ( ) => timeFilter ) ,
135+ setTime : jest . fn ( ( newTimeFilter ) => {
136+ timeFilter = newTimeFilter ;
137+ if ( subscriber ) {
138+ subscriber ( ) ;
139+ }
140+ } ) ,
124141 getTimeUpdate$ : ( ) => ( {
125142 subscribe : ( { next } : { next : ( ) => void } ) => {
143+ subscriber = next ;
126144 return unsubscribe ;
127145 } ,
128146 } ) ,
129147 getRefreshInterval : ( ) => { } ,
130148 getRefreshIntervalDefaults : ( ) => { } ,
149+ getAutoRefreshFetch$ : ( ) => ( {
150+ subscribe : ( { next } : { next : ( ) => void } ) => {
151+ return next ;
152+ } ,
153+ } ) ,
131154 } ;
132155}
133156
@@ -209,6 +232,7 @@ describe('Lens App', () => {
209232 return new Promise ( ( resolve ) => resolve ( { id } ) ) ;
210233 } ) ,
211234 } ,
235+ search : createMockSearchService ( ) ,
212236 } as unknown ) as DataPublicPluginStart ,
213237 storage : {
214238 get : jest . fn ( ) ,
@@ -295,6 +319,7 @@ describe('Lens App', () => {
295319 "query": "",
296320 },
297321 "savedQuery": undefined,
322+ "searchSessionId": "sessionId-1",
298323 "showNoDataPopover": [Function],
299324 },
300325 ],
@@ -1072,6 +1097,53 @@ describe('Lens App', () => {
10721097 } )
10731098 ) ;
10741099 } ) ;
1100+
1101+ it ( 'updates the searchSessionId when the user changes query or time in the search bar' , ( ) => {
1102+ const { component, frame, services } = mountWith ( { } ) ;
1103+ act ( ( ) =>
1104+ component . find ( TopNavMenu ) . prop ( 'onQuerySubmit' ) ! ( {
1105+ dateRange : { from : 'now-14d' , to : 'now-7d' } ,
1106+ query : { query : '' , language : 'lucene' } ,
1107+ } )
1108+ ) ;
1109+ component . update ( ) ;
1110+ expect ( frame . mount ) . toHaveBeenCalledWith (
1111+ expect . any ( Element ) ,
1112+ expect . objectContaining ( {
1113+ searchSessionId : `sessionId-1` ,
1114+ } )
1115+ ) ;
1116+
1117+ // trigger again, this time changing just the query
1118+ act ( ( ) =>
1119+ component . find ( TopNavMenu ) . prop ( 'onQuerySubmit' ) ! ( {
1120+ dateRange : { from : 'now-14d' , to : 'now-7d' } ,
1121+ query : { query : 'new' , language : 'lucene' } ,
1122+ } )
1123+ ) ;
1124+ component . update ( ) ;
1125+ expect ( frame . mount ) . toHaveBeenCalledWith (
1126+ expect . any ( Element ) ,
1127+ expect . objectContaining ( {
1128+ searchSessionId : `sessionId-2` ,
1129+ } )
1130+ ) ;
1131+
1132+ const indexPattern = ( { id : 'index1' } as unknown ) as IIndexPattern ;
1133+ const field = ( { name : 'myfield' } as unknown ) as IFieldType ;
1134+ act ( ( ) =>
1135+ services . data . query . filterManager . setFilters ( [
1136+ esFilters . buildExistsFilter ( field , indexPattern ) ,
1137+ ] )
1138+ ) ;
1139+ component . update ( ) ;
1140+ expect ( frame . mount ) . toHaveBeenCalledWith (
1141+ expect . any ( Element ) ,
1142+ expect . objectContaining ( {
1143+ searchSessionId : `sessionId-3` ,
1144+ } )
1145+ ) ;
1146+ } ) ;
10751147 } ) ;
10761148
10771149 describe ( 'saved query handling' , ( ) => {
@@ -1165,6 +1237,37 @@ describe('Lens App', () => {
11651237 ) ;
11661238 } ) ;
11671239
1240+ it ( 'updates the searchSessionId when the query is updated' , ( ) => {
1241+ const { component, frame } = mountWith ( { } ) ;
1242+ act ( ( ) => {
1243+ component . find ( TopNavMenu ) . prop ( 'onSaved' ) ! ( {
1244+ id : '1' ,
1245+ attributes : {
1246+ title : '' ,
1247+ description : '' ,
1248+ query : { query : '' , language : 'lucene' } ,
1249+ } ,
1250+ } ) ;
1251+ } ) ;
1252+ act ( ( ) => {
1253+ component . find ( TopNavMenu ) . prop ( 'onSavedQueryUpdated' ) ! ( {
1254+ id : '2' ,
1255+ attributes : {
1256+ title : 'new title' ,
1257+ description : '' ,
1258+ query : { query : '' , language : 'lucene' } ,
1259+ } ,
1260+ } ) ;
1261+ } ) ;
1262+ component . update ( ) ;
1263+ expect ( frame . mount ) . toHaveBeenCalledWith (
1264+ expect . any ( Element ) ,
1265+ expect . objectContaining ( {
1266+ searchSessionId : `sessionId-1` ,
1267+ } )
1268+ ) ;
1269+ } ) ;
1270+
11681271 it ( 'clears all existing unpinned filters when the active saved query is cleared' , ( ) => {
11691272 const { component, frame, services } = mountWith ( { } ) ;
11701273 act ( ( ) =>
@@ -1190,6 +1293,32 @@ describe('Lens App', () => {
11901293 } )
11911294 ) ;
11921295 } ) ;
1296+
1297+ it ( 'updates the searchSessionId when the active saved query is cleared' , ( ) => {
1298+ const { component, frame, services } = mountWith ( { } ) ;
1299+ act ( ( ) =>
1300+ component . find ( TopNavMenu ) . prop ( 'onQuerySubmit' ) ! ( {
1301+ dateRange : { from : 'now-14d' , to : 'now-7d' } ,
1302+ query : { query : 'new' , language : 'lucene' } ,
1303+ } )
1304+ ) ;
1305+ const indexPattern = ( { id : 'index1' } as unknown ) as IIndexPattern ;
1306+ const field = ( { name : 'myfield' } as unknown ) as IFieldType ;
1307+ const pinnedField = ( { name : 'pinnedField' } as unknown ) as IFieldType ;
1308+ const unpinned = esFilters . buildExistsFilter ( field , indexPattern ) ;
1309+ const pinned = esFilters . buildExistsFilter ( pinnedField , indexPattern ) ;
1310+ FilterManager . setFiltersStore ( [ pinned ] , esFilters . FilterStateStore . GLOBAL_STATE ) ;
1311+ act ( ( ) => services . data . query . filterManager . setFilters ( [ pinned , unpinned ] ) ) ;
1312+ component . update ( ) ;
1313+ act ( ( ) => component . find ( TopNavMenu ) . prop ( 'onClearSavedQuery' ) ! ( ) ) ;
1314+ component . update ( ) ;
1315+ expect ( frame . mount ) . toHaveBeenCalledWith (
1316+ expect . any ( Element ) ,
1317+ expect . objectContaining ( {
1318+ searchSessionId : `sessionId-2` ,
1319+ } )
1320+ ) ;
1321+ } ) ;
11931322 } ) ;
11941323
11951324 describe ( 'showing a confirm message when leaving' , ( ) => {
0 commit comments