You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
6.2 KiB
221 lines
6.2 KiB
4 weeks ago
|
import test from 'ava'
|
||
|
import Chance from '../chance.js'
|
||
|
import _ from 'lodash'
|
||
|
|
||
|
const chance = new Chance()
|
||
|
|
||
|
// chance.cc()
|
||
|
test('cc() passes the luhn algorithm', t => {
|
||
|
_.times(1000, () => {
|
||
|
let number = chance.cc()
|
||
|
t.true(chance.luhn_check(number))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('cc() can take a type arg and obey it', t => {
|
||
|
_.times(1000, () => {
|
||
|
let type = chance.cc_type({ raw: true })
|
||
|
let number = chance.cc({ type: type.name })
|
||
|
t.is(number.length, type.length)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('cc() can take a short_name type arg and obey it', t => {
|
||
|
_.times(1000, () => {
|
||
|
let type = chance.cc_type({ raw: true })
|
||
|
let number = chance.cc({ type: type.short_name })
|
||
|
t.is(number.length, type.length)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.cc_type()
|
||
|
test('cc_type() returns a random credit card type', t => {
|
||
|
_.times(1000, () => {
|
||
|
t.true(_.isString(chance.cc_type()))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('cc_type() can take a raw arg and obey it', t => {
|
||
|
_.times(1000, () => {
|
||
|
let type = chance.cc_type({ raw: true })
|
||
|
t.truthy(type.name)
|
||
|
t.truthy(type.short_name)
|
||
|
t.truthy(type.prefix)
|
||
|
t.truthy(type.length)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('cc_type() can take a name arg and obey it', t => {
|
||
|
_.times(1000, () => {
|
||
|
let type = chance.cc_type({ name: 'Visa', raw: true })
|
||
|
t.is(type.name, 'Visa')
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('cc_type() with bogus type throws', t => {
|
||
|
const fn = () => chance.cc_type({ name: 'potato' })
|
||
|
t.throws(fn, 'Chance: Credit card type \'potato\' is not supported')
|
||
|
})
|
||
|
|
||
|
// chance.cc_types()
|
||
|
test('cc_types() returns an array of credit card types', t => {
|
||
|
t.true(_.isArray(chance.cc_types()))
|
||
|
})
|
||
|
|
||
|
// chance.currency()
|
||
|
test('currency() returns a currency', t => {
|
||
|
_.times(1000, () => {
|
||
|
let currency = chance.currency()
|
||
|
t.true(_.isObject(currency))
|
||
|
t.truthy(currency.code)
|
||
|
t.is(currency.code.length, 3)
|
||
|
t.truthy(currency.name)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.currency_pair()
|
||
|
test('currency_pair() returns a currency pair', t => {
|
||
|
_.times(1000, () => {
|
||
|
let currency_pair = chance.currency_pair()
|
||
|
t.true(_.isArray(currency_pair))
|
||
|
t.is(currency_pair.length, 2)
|
||
|
t.not(currency_pair[0].code, currency_pair[1].code)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('currency_pair() can return string version', t => {
|
||
|
_.times(1000, () => {
|
||
|
let currency_pair = chance.currency_pair(true)
|
||
|
t.true(_.isString(currency_pair))
|
||
|
t.is(currency_pair.length, 7)
|
||
|
t.true(/^[A-Z][A-Z][A-Z]+\/[A-Z][A-Z][A-Z]$/.test(currency_pair))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.dollar()
|
||
|
test('dollar() returns a proper dollar amount', t => {
|
||
|
let dollar = chance.dollar()
|
||
|
t.true(/\$[0-9]+\.[0-9]+/.test(dollar))
|
||
|
let dollarFloat = parseFloat(dollar.substring(1, dollar.length))
|
||
|
t.true(dollarFloat < 10001)
|
||
|
})
|
||
|
|
||
|
test('dollar() obeys min and max, if provided', t => {
|
||
|
_.times(1000, () => {
|
||
|
let dollar = chance.dollar({ max: 20 })
|
||
|
let dollarFloat = parseFloat(dollar.substring(1, dollar.length))
|
||
|
t.true(dollarFloat <= 20)
|
||
|
})
|
||
|
|
||
|
_.times(1000, () => {
|
||
|
let dollar = chance.dollar({ min: 20 })
|
||
|
let dollarFloat = parseFloat(dollar.substring(1, dollar.length))
|
||
|
t.true(dollarFloat >= 20)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('dollar() can take negative min and max', t => {
|
||
|
_.times(1000, () => {
|
||
|
let dollar = chance.dollar({ min: -200, max: -1 })
|
||
|
t.is(dollar.charAt(0), '-')
|
||
|
let dollarFloat = parseFloat(dollar.substring(2, dollar.length))
|
||
|
// This is necessary because we strip the - when parsing
|
||
|
dollarFloat *= -1
|
||
|
t.true(dollarFloat <= -1)
|
||
|
t.true(dollarFloat >= -200)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.euro()
|
||
|
test('euro() returns a proper euro amount', t => {
|
||
|
let euro = chance.euro()
|
||
|
t.true(/[0-9]+,?\.?[0-9]+?€/.test(euro))
|
||
|
let euroFloat = parseFloat(euro.substring(euro.length, -1))
|
||
|
t.true(euroFloat < 10001)
|
||
|
})
|
||
|
|
||
|
// chance.exp()
|
||
|
test('exp() looks correct', t => {
|
||
|
_.times(1000, () => {
|
||
|
let exp = chance.exp()
|
||
|
t.true(_.isString(exp))
|
||
|
t.is(exp.length, 7)
|
||
|
t.true(/([0-9]{2})\/([0-9]{4})/.test(exp))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('exp() will respect object argument', t => {
|
||
|
_.times(1000, () => {
|
||
|
let exp = chance.exp({ raw: true })
|
||
|
t.true(_.isObject(exp))
|
||
|
t.truthy(exp.month)
|
||
|
t.true(_.isString(exp.month))
|
||
|
t.truthy(exp.year)
|
||
|
t.true(_.isString(exp.year))
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('exp() returs a valid credit card expiration (in a future date)', t => {
|
||
|
_.times(1000, () => {
|
||
|
let exp = chance.exp({ raw: true })
|
||
|
let now = new Date()
|
||
|
let nowMonth = now.getMonth() + 1
|
||
|
let nowYear = now.getFullYear()
|
||
|
let expMonth = parseInt(exp.month, 10)
|
||
|
let expYear = parseInt(exp.year, 10)
|
||
|
|
||
|
t.true(expYear >= nowYear)
|
||
|
if (expYear === nowYear) {
|
||
|
t.true(expMonth >= nowMonth)
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.exp_month()
|
||
|
test('exp_month() returns a numeric month with leading 0', t => {
|
||
|
_.times(1000, () => {
|
||
|
let month = chance.exp_month()
|
||
|
t.true(_.isString(month))
|
||
|
t.is(month.length, 2)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.exp_year()
|
||
|
test('exp_year() returns an expiration year', t => {
|
||
|
_.times(1000, () => {
|
||
|
let year = chance.exp_year()
|
||
|
t.true(_.isString(year))
|
||
|
let parsedYear = parseInt(year, 10)
|
||
|
let curYear = new Date().getFullYear()
|
||
|
t.true(parsedYear >= curYear)
|
||
|
t.true(parsedYear <= curYear + 10)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('exp_month() will return a future month if requested', t => {
|
||
|
_.times(1000, () => {
|
||
|
let nowMonth = new Date().getMonth() + 1
|
||
|
let expMonth = parseInt(chance.exp_month({ future: true }), 10)
|
||
|
if (nowMonth !== 12) {
|
||
|
t.true(expMonth > nowMonth)
|
||
|
} else {
|
||
|
t.true(expMonth >= 1)
|
||
|
t.true(expMonth <= 12)
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// chance.luhn_check()
|
||
|
test('luhn_check() properly checks if number passes the Luhn algorithm', t => {
|
||
|
t.true(chance.luhn_check(49927398716))
|
||
|
t.true(chance.luhn_check(1234567812345670))
|
||
|
t.false(chance.luhn_check(49927398717))
|
||
|
t.false(chance.luhn_check(1234567812345678))
|
||
|
})
|
||
|
|
||
|
test('iban() returns an iban', t => {
|
||
|
let iban = chance.iban()
|
||
|
t.true(_.isString(iban))
|
||
|
t.true(/^[A-Z]{2}[0-9]{2}[A-Z0-9]{4}[0-9]{1,26}$/.test(iban))
|
||
|
})
|