1 /* eslint-disable camelcase */
2 /* eslint no-underscore-dangle: "off" */
4 var mockFilterStructure
= [ {
7 type
: 'send_unselected_if_any',
9 { name
: 'filter1', cssClass
: 'filter1class', default: true },
10 { name
: 'filter2', cssClass
: 'filter2class' }
15 type
: 'send_unselected_if_any',
17 { name
: 'filter3', cssClass
: 'filter3class' },
18 { name
: 'filter4', cssClass
: 'filter4class', default: true }
23 type
: 'string_options',
25 { name
: 'filter5', cssClass
: 'filter5class' },
26 { name
: 'filter6' } // Not supporting highlights
34 { name
: 'stickyFilter7', cssClass
: 'filter7class' },
35 { name
: 'stickyFilter8', cssClass
: 'filter8class' }
38 minimalDefaultParams
= {
43 QUnit
.module( 'mediawiki.rcfilters - UriProcessor' );
45 QUnit
.test( 'getVersion', function ( assert
) {
46 var uriProcessor
= new mw
.rcfilters
.UriProcessor( new mw
.rcfilters
.dm
.FiltersViewModel() );
49 uriProcessor
.getVersion( { param1
: 'foo', urlversion
: '2' } ),
51 'Retrieving the version from the URI query'
55 uriProcessor
.getVersion( { param1
: 'foo' } ),
57 'Getting version 1 if no version is specified'
61 QUnit
.test( 'getUpdatedUri', function ( assert
) {
63 filtersModel
= new mw
.rcfilters
.dm
.FiltersViewModel(),
64 makeUri = function ( queryParams
) {
65 var uri
= new mw
.Uri();
66 uri
.query
= queryParams
;
70 filtersModel
.initializeFilters( mockFilterStructure
);
71 uriProcessor
= new mw
.rcfilters
.UriProcessor( filtersModel
);
74 ( uriProcessor
.getUpdatedUri( makeUri( {} ) ) ).query
,
76 'Empty model state with empty uri state, assumes the given uri is already normalized, and adds urlversion=2'
80 ( uriProcessor
.getUpdatedUri( makeUri( { foo
: 'bar' } ) ) ).query
,
81 { urlversion
: '2', foo
: 'bar' },
82 'Empty model state with unrecognized params retains unrecognized params'
86 filtersModel
.toggleFiltersSelected( {
87 group1__filter1
: true, // Param: filter2: '1'
88 group3__filter5
: true // Param: group3: 'filter5'
92 ( uriProcessor
.getUpdatedUri( makeUri( {} ) ) ).query
,
93 { urlversion
: '2', filter2
: '1', group3
: 'filter5' },
94 'Model state is reflected in the updated URI'
98 ( uriProcessor
.getUpdatedUri( makeUri( { foo
: 'bar' } ) ) ).query
,
99 { urlversion
: '2', filter2
: '1', group3
: 'filter5', foo
: 'bar' },
100 'Model state is reflected in the updated URI with existing uri params'
104 QUnit
.test( 'updateModelBasedOnQuery', function ( assert
) {
106 filtersModel
= new mw
.rcfilters
.dm
.FiltersViewModel();
108 filtersModel
.initializeFilters( mockFilterStructure
);
109 uriProcessor
= new mw
.rcfilters
.UriProcessor( filtersModel
);
111 uriProcessor
.updateModelBasedOnQuery( {} );
113 filtersModel
.getCurrentParameterState(),
114 minimalDefaultParams
,
115 'Version 1: Empty url query sets model to defaults'
118 uriProcessor
.updateModelBasedOnQuery( { urlversion
: '2' } );
120 filtersModel
.getCurrentParameterState(),
122 'Version 2: Empty url query sets model to all-false'
125 uriProcessor
.updateModelBasedOnQuery( { filter1
: '1', urlversion
: '2' } );
127 filtersModel
.getCurrentParameterState(),
128 $.extend( true, {}, { filter1
: '1' } ),
129 'Parameters in Uri query set parameter value in the model'
133 QUnit
.test( 'isNewState', function ( assert
) {
135 filtersModel
= new mw
.rcfilters
.dm
.FiltersViewModel(),
143 message
: 'Empty objects are not new state.'
147 curr
: { filter1
: '1' },
148 new: { filter1
: '0' }
151 message
: 'Nulified parameter is a new state'
155 curr
: { filter1
: '1' },
156 new: { filter1
: '1', filter2
: '1' }
159 message
: 'Added parameters are a new state'
163 curr
: { filter1
: '1' },
164 new: { filter1
: '1', filter2
: '0' }
167 message
: 'Added null parameters are not a new state (normalizing equals old state)'
171 curr
: { filter1
: '1' },
172 new: { filter1
: '1', foo
: 'bar' }
175 message
: 'Added unrecognized parameters are a new state'
179 curr
: { filter1
: '1', foo
: 'bar' },
180 new: { filter1
: '1', foo
: 'baz' }
183 message
: 'Changed unrecognized parameters are a new state'
187 filtersModel
.initializeFilters( mockFilterStructure
);
188 uriProcessor
= new mw
.rcfilters
.UriProcessor( filtersModel
);
190 cases
.forEach( function ( testCase
) {
192 uriProcessor
.isNewState( testCase
.states
.curr
, testCase
.states
.new ),
199 QUnit
.test( 'doesQueryContainRecognizedParams', function ( assert
) {
201 filtersModel
= new mw
.rcfilters
.dm
.FiltersViewModel(),
206 message
: 'Empty query is not valid for load.'
209 query
: { highlight
: '1' },
211 message
: 'Highlight state alone is not valid for load'
214 query
: { urlversion
: '2' },
216 message
: 'urlversion=2 state alone is valid for load as an empty state'
219 query
: { filter1
: '1', foo
: 'bar' },
221 message
: 'Existence of recognized parameters makes the query valid for load'
224 query
: { foo
: 'bar', debug
: true },
226 message
: 'Only unrecognized parameters makes the query invalid for load'
230 filtersModel
.initializeFilters( mockFilterStructure
);
231 uriProcessor
= new mw
.rcfilters
.UriProcessor( filtersModel
);
233 cases
.forEach( function ( testCase
) {
235 uriProcessor
.doesQueryContainRecognizedParams( testCase
.query
),
242 QUnit
.test( '_getNormalizedQueryParams', function ( assert
) {
244 filtersModel
= new mw
.rcfilters
.dm
.FiltersViewModel(),
248 result
: $.extend( true, { urlversion
: '2' }, minimalDefaultParams
),
249 message
: 'Empty query returns defaults (urlversion 1).'
252 query
: { urlversion
: '2' },
253 result
: { urlversion
: '2' },
254 message
: 'Empty query returns empty (urlversion 2)'
257 query
: { filter1
: '0' },
258 result
: { urlversion
: '2', filter4
: '1' },
259 message
: 'urlversion 1 returns query that overrides defaults'
262 query
: { filter3
: '1' },
263 result
: { urlversion
: '2', filter1
: '1', filter4
: '1', filter3
: '1' },
264 message
: 'urlversion 1 with an extra param value returns query that is joined with defaults'
268 filtersModel
.initializeFilters( mockFilterStructure
);
269 uriProcessor
= new mw
.rcfilters
.UriProcessor( filtersModel
);
271 cases
.forEach( function ( testCase
) {
273 uriProcessor
._getNormalizedQueryParams( testCase
.query
),
280 QUnit
.test( '_normalizeTargetInUri', function ( assert
) {
281 var uriProcessor
= new mw
.rcfilters
.UriProcessor( null ),
284 input
: 'http://host/wiki/Special:RecentChangesLinked/Moai',
285 output
: 'http://host/wiki/Special:RecentChangesLinked?target=Moai',
286 message
: 'Target as subpage in path'
289 input
: 'http://host/wiki/Special:RecentChangesLinked/Moai/Sub1',
290 output
: 'http://host/wiki/Special:RecentChangesLinked?target=Moai/Sub1',
291 message
: 'Target as subpage also has a subpage'
294 input
: 'http://host/wiki/Special:RecentChangesLinked/Category:Foo',
295 output
: 'http://host/wiki/Special:RecentChangesLinked?target=Category:Foo',
296 message
: 'Target as subpage in path (with namespace)'
299 input
: 'http://host/wiki/Special:RecentChangesLinked/Category:Foo/Bar',
300 output
: 'http://host/wiki/Special:RecentChangesLinked?target=Category:Foo/Bar',
301 message
: 'Target as subpage in path also has a subpage (with namespace)'
304 input
: 'http://host/w/index.php?title=Special:RecentChangesLinked/Moai',
305 output
: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Moai',
306 message
: 'Target as subpage in title param'
309 input
: 'http://host/w/index.php?title=Special:RecentChangesLinked/Moai/Sub1',
310 output
: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Moai/Sub1',
311 message
: 'Target as subpage in title param also has a subpage'
314 input
: 'http://host/w/index.php?title=Special:RecentChangesLinked/Category:Foo/Bar',
315 output
: 'http://host/w/index.php?title=Special:RecentChangesLinked&target=Category:Foo/Bar',
316 message
: 'Target as subpage in title param also has a subpage (with namespace)'
319 input
: 'http://host/wiki/Special:Watchlist',
320 output
: 'http://host/wiki/Special:Watchlist',
321 message
: 'No target specified'
325 cases
.forEach( function ( testCase
) {
327 uriProcessor
._normalizeTargetInUri( new mw
.Uri( testCase
.input
) ).toString(),
328 new mw
.Uri( testCase
.output
).toString(),
334 }( mediaWiki
, jQuery
) );