@@ -18,6 +18,8 @@ describe('<md-chips>', function() {
1818 '<md-chips ng-model="items" readonly="true">' +
1919 ' <md-autocomplete md-items="item in [\'hi\', \'ho\', \'he\']"></md-autocomplete>' +
2020 '</md-chips>' ;
21+ var CHIP_NOT_REMOVABLE_TEMPLATE =
22+ '<md-chips ng-model="items" readonly="true" md-removable="false"></md-chips>' ;
2123
2224 afterEach ( function ( ) {
2325 attachedElements . forEach ( function ( element ) {
@@ -200,6 +202,106 @@ describe('<md-chips>', function() {
200202 expect ( scope . selectChip ) . toHaveBeenCalled ( ) ;
201203 expect ( scope . selectChip . calls . mostRecent ( ) . args [ 0 ] ) . toBe ( 'Grape' ) ;
202204 } ) ;
205+
206+ describe ( 'when removable' , function ( ) {
207+
208+ it ( 'should not append the input div when not removable and readonly is enabled' , function ( ) {
209+ var element = buildChips ( CHIP_NOT_REMOVABLE_TEMPLATE ) ;
210+ var wrap = element . children ( ) ;
211+ var controller = element . controller ( "mdChips" ) ;
212+
213+ expect ( wrap . hasClass ( "md-removable" ) ) . toBe ( false ) ;
214+ expect ( controller . removable ) . toBe ( false ) ;
215+
216+ var containers = wrap [ 0 ] . querySelectorAll ( ".md-chip-input-container" ) ;
217+
218+ expect ( containers . length ) . toBe ( 0 ) ;
219+
220+ var removeContainer = wrap [ 0 ] . querySelector ( '._md-chip-remove-container' ) ;
221+ expect ( removeContainer ) . not . toBeTruthy ( ) ;
222+ } ) ;
223+
224+ it ( 'should not remove chip through the backspace/delete key when removable is set to false' , inject ( function ( $mdConstant ) {
225+ var element = buildChips ( CHIP_NOT_REMOVABLE_TEMPLATE ) ;
226+ var wrap = element . find ( 'md-chips-wrap' ) ;
227+ var controller = element . controller ( "mdChips" ) ;
228+ var chips = getChipElements ( element ) ;
229+
230+ expect ( wrap . hasClass ( "md-removable" ) ) . toBe ( false ) ;
231+ expect ( controller . removable ) . toBe ( false ) ;
232+
233+ controller . selectChip ( 0 ) ;
234+
235+ wrap . triggerHandler ( {
236+ type : 'keydown' ,
237+ keyCode : $mdConstant . KEY_CODE . BACKSPACE
238+ } ) ;
239+
240+ var updatedChips = getChipElements ( element ) ;
241+
242+ expect ( chips . length ) . toBe ( updatedChips . length ) ;
243+ } ) ) ;
244+
245+ it ( 'should remove a chip by default through the backspace/delete key' , inject ( function ( $mdConstant ) {
246+ var element = buildChips ( BASIC_CHIP_TEMPLATE ) ;
247+ var wrap = element . find ( 'md-chips-wrap' ) ;
248+ var controller = element . controller ( "mdChips" ) ;
249+ var chips = getChipElements ( element ) ;
250+
251+ controller . selectChip ( 0 ) ;
252+
253+ wrap . triggerHandler ( {
254+ type : 'keydown' ,
255+ keyCode : $mdConstant . KEY_CODE . BACKSPACE
256+ } ) ;
257+
258+ var updatedChips = getChipElements ( element ) ;
259+
260+ expect ( chips . length ) . not . toBe ( updatedChips . length ) ;
261+ } ) ) ;
262+
263+ it ( 'should set removable to true by default' , function ( ) {
264+ var element = buildChips ( BASIC_CHIP_TEMPLATE ) ;
265+ var wrap = element . children ( ) ;
266+ var controller = element . controller ( 'mdChips' ) ;
267+
268+ expect ( wrap . hasClass ( 'md-removable' ) ) . toBe ( true ) ;
269+ // The controller variable is kept undefined by default, to allow us to difference between the default value
270+ // and a user-provided value.
271+ expect ( controller . removable ) . toBe ( undefined ) ;
272+
273+ var containers = wrap [ 0 ] . querySelectorAll ( "._md-chip-input-container" ) ;
274+ expect ( containers . length ) . not . toBe ( 0 ) ;
275+
276+ var removeContainer = wrap [ 0 ] . querySelector ( '._md-chip-remove-container' ) ;
277+ expect ( removeContainer ) . toBeTruthy ( ) ;
278+ } ) ;
279+
280+ it ( 'should append dynamically the remove button' , function ( ) {
281+ var template = '<md-chips ng-model="items" readonly="true" md-removable="removable"></md-chips>' ;
282+
283+ scope . removable = false ;
284+
285+ var element = buildChips ( template ) ;
286+ var wrap = element . children ( ) ;
287+ var controller = element . controller ( "mdChips" ) ;
288+
289+ expect ( wrap . hasClass ( "md-removable" ) ) . toBe ( false ) ;
290+ expect ( controller . removable ) . toBe ( false ) ;
291+
292+ var containers = wrap [ 0 ] . querySelectorAll ( "._md-chip-remove-container" ) ;
293+ expect ( containers . length ) . toBe ( 0 ) ;
294+
295+ scope . $apply ( 'removable = true' ) ;
296+
297+ expect ( wrap . hasClass ( "md-removable" ) ) . toBe ( true ) ;
298+ expect ( controller . removable ) . toBe ( true ) ;
299+
300+ containers = wrap [ 0 ] . querySelector ( "._md-chip-remove-container" ) ;
301+ expect ( containers ) . toBeTruthy ( ) ;
302+ } ) ;
303+
304+ } ) ;
203305
204306 describe ( 'when readonly' , function ( ) {
205307 var element , ctrl ;
@@ -248,6 +350,32 @@ describe('<md-chips>', function() {
248350
249351 expect ( $exceptionHandler . errors ) . toEqual ( [ ] ) ;
250352 } ) ;
353+
354+ it ( 'should disable removing when `md-removable` is not defined' , function ( ) {
355+ element = buildChips (
356+ '<md-chips ng-model="items" readonly="isReadonly" md-removable="isRemovable"></md-chips>'
357+ ) ;
358+
359+ var wrap = element . find ( 'md-chips-wrap' ) ;
360+ ctrl = element . controller ( 'mdChips' ) ;
361+
362+ expect ( element . find ( 'md-chips-wrap' ) ) . not . toHaveClass ( 'md-readonly' ) ;
363+
364+ scope . $apply ( 'isReadonly = true' ) ;
365+
366+ expect ( element . find ( 'md-chips-wrap' ) ) . toHaveClass ( 'md-readonly' ) ;
367+
368+ expect ( ctrl . removable ) . toBeUndefined ( ) ;
369+
370+ var removeContainer = wrap [ 0 ] . querySelector ( '._md-chip-remove-container' ) ;
371+ expect ( removeContainer ) . toBeFalsy ( ) ;
372+
373+ scope . $apply ( 'isRemovable = true' ) ;
374+
375+ removeContainer = wrap [ 0 ] . querySelector ( '._md-chip-remove-container' ) ;
376+ expect ( removeContainer ) . toBeTruthy ( ) ;
377+ } ) ;
378+
251379 } ) ;
252380
253381 it ( 'should disallow duplicate object chips' , function ( ) {
0 commit comments