Source: utils/module.test.js

import {calculateAge, isAdult, isValidCodePost, isValidName, isValidEmail} from './module';
/**
*@function calculateAge
*/

describe('calculateAge Unit Test Suites', () => {
    it('should calculate the correct age', () => {
        const valentin = {
            birth: new Date("01/22/1998")
        };
        expect(calculateAge(valentin)).toEqual(28)
    })

    it('should throw a "missing param p" error', () => {
        expect(() => calculateAge()).toThrow("missing param p")
    })

    it('should throw a wrong format error', () =>{
        expect(() => calculateAge(17)).toThrow('wrong format')
    })

    it('p should have a birth field', () =>{
        const p = {
            naissance: new Date("01/22/1998"),
        }
        expect(() => calculateAge(p)).toThrow('no birth field')
    })

    it('p.birth should be a date', () =>{
        const p = {
            birth: 'ma date de naissance',
        }
        expect(() => calculateAge(p)).toThrow('no birth field')
    })

    it('should be NaN is the date is wrong', () => {
        const p = {
            birth: new Date("22/40/1998")
        }
        expect(calculateAge(p)).toBeNaN()
    })
})

/**
 * @function isValidCodePost
 */

describe('isValuidCodePost unit test suites', () => {
    it('should return false if code post do not have 5 numbers exactly', () => {
        const codePost = "0614"
        expect(isValidCodePost(codePost)).toBe(false)
    })
    it('should return false if code post have letters', () => {
        const codePost = "123LE"
        expect(isValidCodePost(codePost)).toBe(false)
    })
    it('should return true if code post have exactly 5 numbers', () => {
        const codePost = "12345"
        expect(isValidCodePost(codePost)).toBe(true)
    })
})

/**
 * @function isValidName
 */
describe('isValidName unit test suites', () => {
    it('should return true for a simple name', () => {
        expect(isValidName("Jean")).toBe(true)
    })
    it('should return true for a name with accents', () => {
        expect(isValidName("Élodie")).toBe(true)
    })
    it('should return true for a name with hyphen', () => {
        expect(isValidName("Jean-Pierre")).toBe(true)
    })
    it('should return true for a name with apostrophe', () => {
        expect(isValidName("L'Étoile")).toBe(true)
    })
    it('should return true for a name with diaeresis', () => {
        expect(isValidName("Loïc")).toBe(true)
    })
    it('should return false for a name with numbers', () => {
        expect(isValidName("Jean123")).toBe(false)
    })
    it('should return false for a name with special characters', () => {
        expect(isValidName("Jean@Pierre")).toBe(false)
    })
    it('should return false for an empty name', () => {
        expect(isValidName("")).toBe(false)
    })
})

/**
 * @function isValidEmail
 */
describe('isValidEmail unit test suites', () => {
    it('should return true for a valid email', () => {
        expect(isValidEmail("test@example.com")).toBe(true)
    })
    it('should return true for an email with subdomain', () => {
        expect(isValidEmail("user@mail.example.com")).toBe(true)
    })
    it('should return false for an email without @', () => {
        expect(isValidEmail("testexample.com")).toBe(false)
    })
    it('should return false for an email without domain', () => {
        expect(isValidEmail("test@")).toBe(false)
    })
    it('should return false for an email without extension', () => {
        expect(isValidEmail("test@example")).toBe(false)
    })
    it('should return false for an email with spaces', () => {
        expect(isValidEmail("test @example.com")).toBe(false)
    })
    it('should return false for an empty email', () => {
        expect(isValidEmail("")).toBe(false)
    })
})

/**
 * @function isAdult
 */
describe('isAdult unit test suites', () => {
    it('should return true for an adult', () => {
        const birth = new Date("01/22/1998")
        expect(isAdult(birth)).toBe(true)
    })
    it('should return false for a minor', () => {
        const birth = new Date()
        birth.setFullYear(birth.getFullYear() - 10)
        expect(isAdult(birth)).toBe(false)
    })
    it('should return true for someone exactly 18', () => {
        const birth = new Date()
        birth.setFullYear(birth.getFullYear() - 18)
        expect(isAdult(birth)).toBe(true)
    })
})