UNPKG

random-token

Version:

Random token generation of given size

80 lines (67 loc) 2.48 kB
void function(){ var test = require('tape') var rt = require('../index.js') function expected_number_of_duplicates(n,d){ // http://en.wikipedia.org/wiki/Birthday_problem#Collision_counting return n - d + d * Math.pow((d-1)/d,n) } test('type', function(t){ t.plan(1) t.equal(typeof rt(1), 'string') }) test('length', function(t){ var i = 4 t.plan(i+2) while ( i -- ) { var l = Math.pow(i,i) t.equal(rt(l).length, l) } t.equal(rt(-1), undefined) t.equal(rt([]), undefined) }) // This test can sometimes fail if you are very unlucky. Especially for expected dups sizes. // However I wanted to see how the number of duplicates change for different salt, and selection sizes. function testDups(klen, count, salt){ var tokgen = rt.create(salt||rt.salt()) var exp_dups = expected_number_of_duplicates(count,Math.pow(tokgen.salt().length, klen)) // I expect a deviation less than 10% , but // actual deviation in real life is much smaller because the generated sizes of the keys are much larger // which of course results in much less duplicates compared to key generated size var ndups = Math.ceil(exp_dups*1.1) test('number of duplicates less than '+ndups+ ' (expected: '+exp_dups+') from '+count+ ' keys of length '+klen, function(t){ t.plan(1) var i = count var keys = [] var duplicates = [] var k = '' function same(k,c){ return k == c } while ( i -- ) { k = tokgen(klen, salt) if ( keys.some(same.bind(null,k)) ) duplicates.push(k) keys.push(k) } var msg = '# actual number of duplicates ' + duplicates.length if ( duplicates.length < ndups ) { t.pass(msg) } else { t.fail(msg) } }) } var abc = 'abcdefghijklmnopqrstuvwxyz' var ABC = abc.toUpperCase() testDups(3,3000) testDups(3,3000, abc) testDups(3,5000, rt.salt()+ABC) test('generator', function(t){ t.plan(1) var hash = 'qropadb' var gen = rt.gen(hash) var token = gen(20) t.ok(token.split('').every(function(letter){ return hash.indexOf(letter) > -1 })) }) }()