File: test/nested.js

Recommend this page to a friend!
  Classes of Harcharan Singh  >  Node Input Validator  >  test/nested.js  >  Download  
File: test/nested.js
Role: Example script
Content type: text/plain
Description: Example script
Class: Node Input Validator
Validate submitted input values in Node.js
Author: By
Last change: release v4.4
Edit applyOnDeep regex to match double digit index

Unit test added to verify that double digit array indices now match
Date: 1 month ago
Size: 5,729 bytes
 

Contents

Class file image Download
const assert = require('assert');

const { Validator } = require('../lib/index');

const input = {
  product: {
    id: '1',
    name: 'empty',
    price: '12.50',
    features: [
      { name: 'Awesome', value: 'awesome' },
      { name: 'Weak', value: 'weak' },
    ],
  },
  cart: [
    {
      id: 1,
      colors: {
        name: 'black',
      },
      features: [11, 12, 13],
      varients: [
        { id: 11 },
        { id: 12 },
        {

          id: 13,
          colors: [
            {
              name: 'Varient Black',
              props: [
                {
                  name: 'p0',
                  tags: ['p01', 12, 13],
                },
              ],
            },
            {
              name: 'Varitnt Blue',
              props: [
                {
                  name: 'p1',
                  tags: [3, 2],
                },
              ],
            },
          ],
        },
        { id: 14 },
        { id: 15 },
        { id: 16 },
        { id: 17 },
        { id: 18 },
        { id: 19 },
        { id: 20 },
        { id: null }
      ],
    },
    {
      id: 2,
      colors: {
        name: '#fff',
      },
      varients: [
        {
          id: 21,
          colors: [
            {
              name: '#f00', // cart.1.varients.1.colors.name
              props: [
                {
                  name: 'p02',
                  tags: [9, 8, 7],
                },
              ],
            },
            {
              name: '#000000',
            },
            {
              name: 'fail',
              props: [
                {
                  name: 'p12',
                  tags: [7, 8],
                },
              ],
            },
          ],
        },
        { id: 22 },
      ],
    },
  ],
};

describe('Nested', () => {
  describe('Single Level', () => {
    it('should pass with top level required', async () => {
      const v = new Validator(
        {
          features: input.product.features,
        },
        {
          features: 'required|array',
          'features.*.name': 'string',
          'features.*.value': 'string',
        },
      );

      const matched = await v.check();

      assert.equal(matched, true);
    });

    it('should fail with child level', async () => {
      const v = new Validator(
        {
          features: input.product.features,
        },
        {
          features: 'required|array',
          'features.*.name': 'string',
          'features.*.value': 'integer',
        },
      );

      const matched = await v.check();
      assert.equal(matched, false);
      v.errors.should.have.keys('features.0.value', 'features.1.value');
    });
  });

  describe('Deep Level', () => {
    // it('should pass with top level required', async () => {
    //   const v = new Validator(
    //     input,
    //     {
    //       product: 'required|object',
    //       'product.id': 'required|integer',
    //       'product.name': 'required|string',
    //       'product.price': 'required|numeric',
    //       'cart.*.id': 'required|integer',
    //       'cart.*.features': 'required|array',
    //       'cart.*.features.*': 'required|integer',
    //       'cart.*.colors.name': 'required|string',
    //       'cart.*.varients': 'required|array',
    //       'cart.*.varients.*.id': 'required|integer',
    //       'cart.*.varients.*.colors.*.name': 'required|string',

    //     },
    //   );

    //   const matched = await v.check();

    //   assert.equal(matched, true);
    // });

    it('should fail with child level required', async () => {
      const v = new Validator(
        input,
        {
          product: 'required|object',
          'product.id': 'required|integer',
          'product.name': 'required|string|minLength:10',
          'product.price': 'required|numeric',
          'product.features': 'required|array',
          'product.features.*.name': 'required|string',
          'product.features.*.value': 'required|integer',
          'cart.*.id': 'required|integer',
          'cart.*.colors': 'required|object',
          'cart.*.colors.name': 'required|hexColor',
          'cart.*.varients': 'required|array',
          'cart.*.varients.*.id': 'required|integer',
          'cart.*.varients.*.colors': 'required|array',
          'cart.*.varients.*.colors.*.name': 'required|hexColor',
          'cart.*.varients.*.colors.*.props.*.name': 'required|integer',
        },
      );

      const matched = await v.check();

      assert.equal(matched, false);

      v.errors.should.have.keys('product.name',
        'product.features.0.value',
        'product.features.1.value');

      v.errors.should.have.keys('cart.0.colors.name',
        'cart.0.varients.2.colors.0.name',
        'cart.0.varients.2.colors.1.name',
        'cart.1.varients.0.colors.2.name',
        'cart.1.varients.0.colors.2.props.0.name');
    });

    it('should fail with deep child level length', async () => {
      const v = new Validator(
        input,
        {
          'cart.*.varients.*.colors.*.props': 'required|array',
          'cart.*.varients.*.colors.*.props.*.tags': 'required|lengthBetween:3,5',

        },
      );

      const matched = await v.check();

      assert.equal(matched, false);

      v.errors.should.have.keys('cart.1.varients.0.colors.2.props.0.tags');
    });

    it('should fail with child required at array index > 9', async () => {
      const v = new Validator(
        input,
        {
          'cart.*.varients.*.id': 'required',
        },
      );

      const matched = await v.check();

      assert.equal(matched, false);

      v.errors.should.have.keys('cart.0.varients.10.id');
    });
  });
});