| var expect = require('chai').expect; | 
| var urlSlug = require('../index'); | 
|   | 
| describe('module', function () { | 
|   | 
|     it('should include constructor as a property', function () { | 
|         expect(urlSlug.UrlSlug.constructor).to.be.equal(urlSlug.constructor); | 
|     }); | 
|   | 
|     it('should contain convert and revert methods', function () { | 
|         expect(urlSlug.convert).to.be.a('function'); | 
|         expect(urlSlug.revert).to.be.a('function'); | 
|     }); | 
|   | 
|     it('should call convert if called as a function', function () { | 
|         expect(urlSlug).to.be.equal(urlSlug.convert); | 
|     }); | 
|   | 
|     describe('instance', function () { | 
|   | 
|         var instance = new urlSlug.UrlSlug; | 
|   | 
|         it('should contain lowercase, uppercase and titlecase builtin transformers', function () { | 
|             expect(instance.transformers).to.contain.all.keys('lowercase', 'uppercase', 'titlecase'); | 
|         }); | 
|   | 
|         it('should set "-" as default separator', function () { | 
|             expect(instance.separator).to.be.equal('-'); | 
|         }); | 
|   | 
|         it('should set "lowercase" as default transformer', function () { | 
|             expect(instance.transform).to.be.equal(instance.transformers.lowercase); | 
|         }); | 
|   | 
|         describe('transformers', function () { | 
|   | 
|             it('should contain a working lowercase', function () { | 
|                 expect(instance.transformers.lowercase('TEST STRING')).to.be.equal('test string'); | 
|             }); | 
|   | 
|             it('should contain a working uppercase', function () { | 
|                 expect(instance.transformers.uppercase('test string')).to.be.equal('TEST STRING'); | 
|             }); | 
|   | 
|             it('should contain a working titlecase', function () { | 
|                 expect(instance.transformers.titlecase('tesT strinG')).to.be.equal('Test String'); | 
|             }); | 
|   | 
|         }); | 
|   | 
|         describe('prepare', function () { | 
|   | 
|             it('should not accept nothing but a string as a separator', function () { | 
|                 expect(instance.prepare.bind(instance, 123)).to.throw(/^Invalid separator, must be a string/); | 
|             }); | 
|   | 
|             it('should accept all characters defined as unreserved in RFC 3986 as a separator', function () { | 
|                 expect(instance.prepare.bind(instance, '-._~')).to.not.throw(/^Invalid separator, has invalid characters/); | 
|             }); | 
|   | 
|             it('should not accept a separator character not defined as unreserved in RFC 3986', function () { | 
|                 expect(instance.prepare.bind(instance, '+')).to.throw(/^Invalid separator, has invalid characters/); | 
|             }); | 
|   | 
|             it('should accept false as transform', function () { | 
|                 expect(instance.prepare.bind(instance, '', false)).not.to.throw(/^Invalid transform, must be a function/); | 
|             }); | 
|   | 
|             it('should accept all builtin presets as transform', function () { | 
|                 expect(instance.prepare.bind(instance, '', 'lowercase')).to.not.throw(/^Invalid transform, must be a function/); | 
|                 expect(instance.prepare.bind(instance, '', 'uppercase')).to.not.throw(/^Invalid transform, must be a function/); | 
|                 expect(instance.prepare.bind(instance, '', 'titlecase')).to.not.throw(/^Invalid transform, must be a function/); | 
|             }); | 
|   | 
|             it('should accept a function as transform', function () { | 
|                 expect(instance.prepare.bind(instance, '', function () {})).to.not.throw(/^Invalid transform, must be a function/); | 
|             }); | 
|   | 
|             it('should only accept false, a function or a builtin preset as transform', function () { | 
|                 expect(instance.prepare.bind(instance, '', true)).to.throw(/^Invalid transform, must be a builtin transform or a function/); | 
|                 expect(instance.prepare.bind(instance, '', 'nonexistent')).to.throw(/^Invalid transform, must be a builtin transform or a function/); | 
|                 expect(instance.prepare.bind(instance, '', {})).to.throw(/^Invalid transform, must be a builtin transform or a function/); | 
|             }); | 
|   | 
|             it('should return an object with all available options', function () { | 
|                 expect(instance.prepare()).to.contain.all.keys('separator', 'transform'); | 
|             }); | 
|   | 
|         }); | 
|   | 
|         describe('convert', function () { | 
|   | 
|             it('should not accept nothing but a string as input', function () { | 
|                 expect(instance.convert.bind(instance, 123)).to.throw(/^Invalid value, must be a string/); | 
|             }); | 
|   | 
|             it('should return a default slug if no options are set', function () { | 
|                 expect(instance.convert('Url Slug')).to.be.equal('url-slug'); | 
|             }); | 
|   | 
|             it('should remove accents', function () { | 
|                 expect(instance.convert('á é í ó ú')).to.be.equal('a-e-i-o-u'); | 
|             }); | 
|   | 
|             it('should convert to upper case and use default separator', function () { | 
|                 expect(instance.convert('a bronx tale', null, 'uppercase')).to.be.equal('A-BRONX-TALE'); | 
|             }); | 
|   | 
|             it('should use underscore separators and title case', function () { | 
|                 expect(instance.convert('tom jobim', '_', 'titlecase')).to.be.equal('Tom_Jobim'); | 
|             }); | 
|   | 
|             it('should allow multiple characters in separator and not change the case', function () { | 
|                 expect(instance.convert('Charly García', '-._~-._~', false)).to.be.equal('Charly-._~-._~Garcia'); | 
|             }); | 
|   | 
|             it('should return a camel case string', function () { | 
|                 expect(instance.convert('java script', '', 'titlecase')).to.be.equal('JavaScript'); | 
|             }); | 
|   | 
|             it('should break a camel case string', function () { | 
|                 expect(instance.convert('javaScript')).to.be.equal('java-script'); | 
|             }); | 
|   | 
|             it('should return only consonants', function () { | 
|                 var transform = function (string) { | 
|                     return string.replace(/[aeiou]/gi, ''); | 
|                 } | 
|                 expect(instance.convert('React', '', transform)).to.be.equal('Rct'); | 
|             }); | 
|   | 
|         }); | 
|   | 
|         describe('revert', function () { | 
|   | 
|             it('should not accept nothing but a string as input', function () { | 
|                 expect(instance.revert.bind(instance, 123)).to.throw(/^Invalid value, must be a string/); | 
|             }); | 
|   | 
|             it('should use automatic reversion and maintain input case', function () { | 
|                 expect(instance.revert('UrlSlug-url_slug')).to.be.equal('Url Slug url slug'); | 
|             }); | 
|   | 
|             it('should break only on camel case and convert input to upper case', function () { | 
|                 expect(instance.revert('ClaudioBaglioni_is-Italian', '', 'uppercase')).to.be.equal('CLAUDIO BAGLIONI_IS-ITALIAN'); | 
|             }); | 
|   | 
|             it('should return the title of a Pink Floyd track', function () { | 
|                 expect(instance.revert('comfortably-._~numb', '-._~', 'titlecase')).to.be.equal('Comfortably Numb'); | 
|             }); | 
|   | 
|         }); | 
|   | 
|     }); | 
|   | 
| }); |