@@ -225,4 +225,100 @@ define([
225225 expect ( request . requestBody ) . toMatch ( / l a n g u a g e = e n / ) ;
226226 } ) ;
227227 } ) ;
228+
229+ describe ( 'discovery.DiscoveryFactory URL sync' , function ( ) {
230+ var originalSearch ;
231+ var replaceStateSpy ;
232+
233+ function setUrlSearch ( search ) {
234+ // Override window.location.search for the factory to read
235+ originalSearch = window . location . search ;
236+ // Use history.replaceState to set query parameters without navigation
237+ history . replaceState ( null , '' , window . location . pathname + search ) ;
238+ }
239+
240+ beforeEach ( function ( ) {
241+ originalSearch = window . location . search ;
242+ replaceStateSpy = spyOn ( history , 'replaceState' ) . and . callThrough ( ) ;
243+ loadFixtures ( 'js/fixtures/discovery.html' ) ;
244+ TemplateHelpers . installTemplates ( [
245+ 'templates/discovery/course_card' ,
246+ 'templates/discovery/facet' ,
247+ 'templates/discovery/facet_option' ,
248+ 'templates/discovery/filter' ,
249+ 'templates/discovery/filter_bar'
250+ ] ) ;
251+ jasmine . clock ( ) . install ( ) ;
252+ } ) ;
253+
254+ afterEach ( function ( ) {
255+ jasmine . clock ( ) . uninstall ( ) ;
256+ // Restore original URL
257+ history . replaceState ( null , '' , window . location . pathname + originalSearch ) ;
258+ } ) ;
259+
260+ it ( 'pre-populates filters from URL query params' , function ( ) {
261+ setUrlSearch ( '?modes=honor' ) ;
262+ DiscoveryFactory ( MEANINGS ) ;
263+
264+ var requests = AjaxHelpers . requests ( this ) ;
265+ $ ( '.discovery-submit' ) . trigger ( 'click' ) ;
266+ var request = AjaxHelpers . currentRequest ( requests ) ;
267+ expect ( request . requestBody ) . toMatch ( / m o d e s = h o n o r / ) ;
268+ expect ( $ ( '.active-filter' ) . length ) . toBe ( 1 ) ;
269+ } ) ;
270+
271+ it ( 'overrides default language filter with URL param' , function ( ) {
272+ // Set URL with language filter different from the default
273+ setUrlSearch ( '?language=hr' ) ;
274+ // Call DiscoveryFactory with userLanguage='en' and setDefaultFilter=true
275+ DiscoveryFactory ( MEANINGS , '' , 'en' , 'Europe/Lisbon' , true ) ;
276+
277+ var requests = AjaxHelpers . requests ( this ) ;
278+ $ ( '.discovery-submit' ) . trigger ( 'click' ) ;
279+ var request = AjaxHelpers . currentRequest ( requests ) ;
280+ expect ( request . requestBody ) . toMatch ( / l a n g u a g e = h r / ) ;
281+ expect ( request . requestBody ) . not . toMatch ( / l a n g u a g e = e n / ) ;
282+ } ) ;
283+
284+ it ( 'ignores unrecognized URL params' , function ( ) {
285+ setUrlSearch ( '?bogus=value' ) ;
286+ DiscoveryFactory ( MEANINGS ) ;
287+
288+ var requests = AjaxHelpers . requests ( this ) ;
289+ $ ( '.discovery-submit' ) . trigger ( 'click' ) ;
290+ var request = AjaxHelpers . currentRequest ( requests ) ;
291+ expect ( request . requestBody ) . not . toMatch ( / b o g u s / ) ;
292+ expect ( $ ( '.active-filter' ) . length ) . toBe ( 0 ) ;
293+ } ) ;
294+
295+ it ( 'updates URL after search completes' , function ( ) {
296+ setUrlSearch ( '' ) ;
297+ DiscoveryFactory ( MEANINGS ) ;
298+
299+ var requests = AjaxHelpers . requests ( this ) ;
300+ $ ( '.discovery-input' ) . val ( 'test' ) ;
301+ $ ( '.discovery-submit' ) . trigger ( 'click' ) ;
302+ AjaxHelpers . respondWithJson ( requests , JSON_RESPONSE ) ;
303+ expect ( replaceStateSpy ) . toHaveBeenCalled ( ) ;
304+ var lastCall = replaceStateSpy . calls . mostRecent ( ) ;
305+ expect ( lastCall . args [ 2 ] ) . toMatch ( / s e a r c h _ q u e r y = t e s t / ) ;
306+ } ) ;
307+
308+ it ( 'clears URL params when filters are reset' , function ( ) {
309+ setUrlSearch ( '?language=en' ) ;
310+ DiscoveryFactory ( MEANINGS ) ;
311+
312+ var requests = AjaxHelpers . requests ( this ) ;
313+ // Trigger initial search to load results
314+ $ ( '.discovery-submit' ) . trigger ( 'click' ) ;
315+ AjaxHelpers . respondWithJson ( requests , JSON_RESPONSE ) ;
316+ // Clear all filters
317+ $ ( '#clear-all-filters' ) . trigger ( 'click' ) ;
318+ // The clear triggers a new search with empty query
319+ AjaxHelpers . respondWithJson ( requests , JSON_RESPONSE ) ;
320+ var lastCall = replaceStateSpy . calls . mostRecent ( ) ;
321+ expect ( lastCall . args [ 2 ] ) . toBe ( window . location . pathname ) ;
322+ } ) ;
323+ } ) ;
228324} ) ;
0 commit comments