src/validators/name.js

Summary

Maintainability
A
1 hr
Test Coverage
const suffixOptions = [
  '',
  'Jr',
  'Sr',
  'II',
  'III',
  'IV',
  'V',
  'VI',
  'VII',
  'VIII',
  'IX',
  'X',
  'Other'
]

export default class NameValidator {
  constructor(data = {}) {
    this.first = data.first
    this.firstInitialOnly = data.firstInitialOnly
    this.last = data.last
    this.middleInitialOnly = data.middleInitialOnly
    this.noMiddleName = data.noMiddleName
    this.hideMiddleName = data.hideMiddleName
    this.middle = data.middle
    this.suffix = data.suffix
    this.suffixOther = data.suffixOther
  }

  /**
   * Validates a persons first name
   */
  validFirst() {
    if (!this.first) {
      return false
    }

    if (this.firstInitialOnly && this.first.length > 1) {
      return false
    }

    return true
  }

  /**
   * Validates a persons last name
   */
  validLast() {
    if (!this.last) {
      return false
    }

    return true
  }

  /**
   * Validates a persons middle name
   */
  validMiddle() {

    if (this.hideMiddleName) {
      return true
    }

    switch (this.noMiddleName) {
      case true:
        // If user does not have a middle name, make sure middle name is not entered
        if (this.middle) {
          return false
        }
        break
      case false:
        // User should have a middle name or initial
        if (!this.middle) {
          return false
        }
        if (this.middleInitialOnly && this.middle.length > 1) {
          return false
        }
        break
      default:
        return false
    }
    return true
  }

  /**
   * Validates a users suffix
   */
  validSuffix() {
    // Suffix is optional
    if (!this.suffix) {
      return true
    }

    let found = false
    for (let validSuffix of suffixOptions) {
      if (validSuffix === this.suffix) {
        found = true
      }
    }

    if (!found) {
      return false
    }

    if (this.suffix === 'Other' && !this.suffixOther) {
      return false
    }

    return true
  }

  /**
   * Validates all portions of a persons name
   */
  isValid() {
    return this.validFirst() && this.validLast() && this.validMiddle()
  }
}