Hone logo
Hone
Problems

Jest Validation Testing for User Registration

This challenge focuses on building robust validation logic for user registration data and testing it thoroughly using Jest. Effective input validation is crucial for any application to prevent errors, ensure data integrity, and maintain security. You'll create a reusable validation function and then write Jest tests to cover various scenarios.

Problem Description

Your task is to create a TypeScript function that validates user registration data against a set of predefined rules. This function will be used to check if submitted user information is valid before it's processed further by an application. You will then write Jest tests to ensure this validation logic works correctly under various conditions, including valid inputs, invalid inputs, and edge cases.

Key Requirements:

  1. validateUserRegistration Function: Create a TypeScript function named validateUserRegistration that accepts a single argument: userData (an object with username, email, and password properties).
  2. Validation Rules:
    • Username: Must be a string, at least 3 characters long, and contain only alphanumeric characters and underscores.
    • Email: Must be a valid email format (e.g., user@example.com). A simple regex can be used for this.
    • Password: Must be a string, at least 8 characters long, and contain at least one uppercase letter, one lowercase letter, one number, and one special character (e.g., !@#$%^&*()_+).
  3. Return Value: The function should return true if all validation rules pass, and false otherwise.
  4. Error Reporting (for testing purposes): While the main function returns a boolean, for testing, it's beneficial to understand why validation failed. You can adapt the function or create a companion to return specific error messages. For this challenge, let's modify the function to return an array of strings, where each string describes a validation error. If the data is valid, it should return an empty array.
  5. Jest Tests: Write comprehensive Jest tests for the validateUserRegistration function.

Expected Behavior:

  • Valid user data should result in an empty error array.
  • Invalid user data should result in an array containing one or more error messages describing the failures.

Edge Cases to Consider:

  • Missing properties in userData.
  • Properties with incorrect data types (e.g., username as a number).
  • Empty strings for any of the properties.
  • Extremely long strings for any property.
  • Usernames/emails/passwords that barely meet or slightly miss the length requirements.
  • Emails with unusual but valid characters or structures.

Examples

Example 1: Valid User Data

const userData = {
    username: "john_doe123",
    email: "john.doe@example.com",
    password: "Password123!"
};
// Expected output of validateUserRegistration(userData) would be []

Explanation: The username, email, and password all meet their respective validation criteria.

Example 2: Invalid Username and Password

const userData = {
    username: "jo", // Too short
    email: "jane.doe@example.com",
    password: "password123" // Missing uppercase and special character
};
// Expected output of validateUserRegistration(userData) would be [
//     "Username must be at least 3 characters long.",
//     "Password must contain at least one uppercase letter.",
//     "Password must contain at least one special character."
// ]

Explanation: The username is too short, and the password fails to meet the uppercase and special character requirements.

Example 3: Missing Email and Invalid Password Format

const userData = {
    username: "test_user",
    email: "", // Invalid format (or missing)
    password: "P1!a" // Too short and missing characters
};
// Expected output of validateUserRegistration(userData) would be [
//     "Email is not a valid format.",
//     "Password must be at least 8 characters long.",
//     "Password must contain at least one lowercase letter.",
//     "Password must contain at least one number."
// ]

Explanation: The email is empty, making it an invalid format. The password is too short and misses several required character types.

Constraints

  • The validateUserRegistration function should be implemented in TypeScript.
  • Jest should be used for all testing.
  • You should strive for good test coverage, aiming for at least 90% if possible.
  • The validation logic should be contained within the validateUserRegistration function.
  • Regular expressions should be used for email format validation and potentially for password complexity checks.

Notes

  • Consider how you will structure your Jest tests to cover all the validation rules and edge cases efficiently. Grouping related tests using describe blocks is recommended.
  • For the password validation, a single regex can check for the presence of all required character types.
  • Think about how to handle different types of invalid inputs gracefully.
  • The goal is to build a reliable and well-tested validation utility.
Loading editor...
typescript