Jest has a test-generation feature built-in called test.each which is great, but I don’t particularly like it’s API. Instead, we’re going to use an open source project called jest-in-case which gives us a really nice API for generated tests and improved error messages. Let’s try that library out for our isPasswordAllowed tests here.
// From import {isPasswordAllowed} from '../auth' describe('isPasswordAllowed', () => { const allowedPwds = ['!aBc123'] const disallowedPwds = { 'too short': 'a2c!', 'no alphabet characters': '123456', 'no numbers': 'ABCdef!', 'no uppercase letters': 'abc123!', 'no lowercase letters': 'ABC123!', 'no non-alphanumeric characters': 'ABCdef123', } allowedPwds.forEach((pwd) => { test(`allow ${pwd}`, () => { expect(isPasswordAllowed(pwd)).toBeTruthy() }) }) Object.entries(disallowedPwds).forEach(([key, value]) => { test(`disallow - ${key}: ${value}`, () => { expect(isPasswordAllowed(value)).toBeFalsy() }) }) })
to:
import cases from 'jest-in-case' import {isPasswordAllowed} from '../auth' cases( 'isPasswordAllowed: valid passwords', ({password}) => { expect(isPasswordAllowed(password)).toBe(true) }, { 'valid password': { password: '!aBc123', }, }, ) cases( 'isPasswordAllowed: invalid passwords', ({password}) => { expect(isPasswordAllowed(password)).toBe(false) }, { 'too short': { password: 'a2c!', }, 'no letters': { password: '123456!', }, 'no numbers': { password: 'ABCdef!', }, 'no uppercase letters': { password: 'abc123!', }, 'no lowercase letters': { password: 'ABC123!', }, 'no non-alphanumeric characters': { password: 'ABCdef123', }, }, )
(Not necessary)