jest-structure

    2.0.1 • Public • Published

    jest-structure

    Custom Jest matchers to test Structure instances.

    Example usage

    expect(user).toBeValidStructure();
     
    expect(user).toBeInvalidStructure();
     
    expect(user).toHaveInvalidAttribute(['name']);
     
    expect(user).toHaveInvalidAttribute(['name'], ['"name" is required']);
     
    expect(user).toHaveInvalidAttribute(['name'], expect.arrayContaining(['"name" is required']));
     
    expect(user).toHaveInvalidAttributes([
      { path: ['name'], messages: expect.arrayContaining(['"name" is required']) },
      {
        path: ['age'],
        messages: ['"age" must be larger than or equal to 2', '"age" must be a positive number'],
      },
    ]);

    Installation

    jest-structure is available in npm, so you can install it with npm or yarn as a development dependency:

    npm install --save-dev jest-structure
     
    # or 
     
    yarn --dev add jest-structure

    Setup

    After installing, you need to tell Jest to use jest-structure, this can be done in two ways:

    1. By importing and manually adding it to Jest (in a setup file or directly in the top of your test file):
    import jestStructure from 'jest-structure';
     
    expect.extend(jestStructure);
    1. By allowing jest-structure to add itself to Jest matchers:
    import 'jest-structure/extend-expect';

    Matchers

    toBeValidStructure()

    This matcher passes if the structure is valid:

    const User = attributes({
      name: { type: String, required: true },
    })(class User {});
     
    const validUser = new User({ name: 'Me' });
     
    expect(validUser).toBeValidStructure(); // passes
     
    const invalidUser = new User();
     
    expect(invalidUser).toBeValidStructure(); // fails

    toBeInvalidStructure()

    This matcher passes if the structure is invalid:

    const User = attributes({
      name: { type: String, required: true },
    })(class User {});
     
    const invalidUser = new User();
     
    expect(invalidUser).toBeInvalidStructure(); // passes
     
    const validUser = new User({ name: 'Me' });
     
    expect(validUser).toBeInvalidStructure(); // fails

    toHaveInvalidAttribute(path, messages)

    This matcher allows you to assert that a single attribute of the structure is invalid, optionally passing the array of error messages for that attribute:

    const User = attributes({
      name: { type: String, required: true },
      age: { type: Number, required: true },
    })(class User {});
     
    const user = new User({ age: 42 });
     
    // passes, because name is invalid
    expect(user).toHaveInvalidAttribute(['name']);
     
    // fails, because age is valid
    expect(user).toHaveInvalidAttribute(['age']);
     
    // passes, because name is invalid with this message
    expect(user).toHaveInvalidAttribute(['name'], ['"name" is required']);
     
    // fails, because name is invalid but not with this message
    expect(user).toHaveInvalidAttribute(['name'], ['"name" is not cool']);
     
    // passes. Notice that you can even use arrayContaining to check for a subset of the errros
    expect(user).toHaveInvalidAttribute(['name'], expect.arrayContaining(['"name" is required']));
     
    // passes. And stringContaining can be used as well
    expect(user).toHaveInvalidAttribute(['name'], [expect.stringContaining('required')]);

    toHaveInvalidAttributes([ { path, messages } ])

    This matcher allows you to assert that multiple attributes of the structure are invalid, optionally passing the array of error messages for each attribute:

    const User = attributes({
      name: { type: String, required: true },
      age: { type: Number, required: true },
    })(class User {});
     
    const user = new User({ age: 42 });
     
    // passes, because name is invalid
    expect(user).toHaveInvalidAttributes([{ path: ['name'] }]);
     
    // fails, because age is valid
    expect(user).toHaveInvalidAttributes([{ path: ['age'] }]);
     
    // fails, because name is invalid but age is valid
    expect(user).toHaveInvalidAttributes([{ path: ['name'] }, { path: ['age'] }]);
     
    // passes, because name is invalid with this message
    expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: ['"name" is required'] }]);
     
    // fails, because name is invalid but not with this message
    expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: ['"name" is not cool'] }]);
     
    // passes. Notice that you can even use arrayContaining to check for a subset of the errros
    expect(user).toHaveInvalidAttributes([
      { path: ['name'], messages: expect.arrayContaining(['"name" is required']) },
    ]);
     
    // passes. And stringContaining can be used as well
    expect(user).toHaveInvalidAttributes([
      { path: ['name'], messages: [expect.stringContaining('required')] },
    ]);

    Keywords

    none

    Install

    npm i jest-structure

    DownloadsWeekly Downloads

    11

    Version

    2.0.1

    License

    MIT

    Unpacked Size

    13.9 kB

    Total Files

    12

    Last publish

    Collaborators

    • talyssonoc