Your IP : 216.73.216.220


Current Path : /home/deltalab/PMS/partner-manager-backend/test/
Upload File :
Current File : //home/deltalab/PMS/partner-manager-backend/test/category.test.js

/**
 * Category tests, storing, control and monitoring.
 */

// DEPENDENCIES ====================================
const { expect, assert }  = require ('chai');
const { dotenv }          = require ('dotenv').config();
const mongoose            = require ('mongoose');

// RESOURCES =======================================
const { categoryModel }   = require ('../models/mongoose/category');

// TEST OBJECTS ====================================
const jsonTaxonomy        = require('../services/utils/taxonomy.json');

// TEST CASES ======================================
describe('categories', function () {
  this.timeout(15000);

  const iterate = o => (
    { ...o
    , [Symbol.iterator]() {
        const entries = Object.entries(o).filter(([k, v]) => k !== 'id');
        return {
          next() {
            if (entries.length === 0) return { done: true };
            const [name, {id}] = entries.pop();
            return { done: false, value: { id, name } };
          }
        };
      }
    }
  );

  // Initialization --------------------------------
  before((done) => {
    mongoose.connect(process.env.DATABASE_URL);
    const db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error'));
    db.once('open', function() {
      console.log('We are connected to test database!');
      done();
    });
  });

  it('print first level', (done) => {
    const firstLevel = [];
    for (let obj of iterate(jsonTaxonomy)) {
      console.log(obj);
      const secondLevel = [];
      for (let obj2 of iterate(jsonTaxonomy[obj.name])) {
        secondLevel.push(obj2);
        console.log(obj2);
      }
      firstLevel.push(obj);
    }
    console.log(firstLevel.length);
    done();
  });

  it('print second level', (done) => {
    const subcategory = jsonTaxonomy['Abbigliamento e accessori'];
      for (let obj of iterate(subcategory)) {
        console.log(obj);
      }
    done();
  });

  async function saveSubcategories(categories, parentId) {
    for (const [key, subcategory] of Object.entries(categories)) {
      const category = new categoryModel();
      if (key !== 'id') {
        category.googleId = subcategory.id;
        category.name = [{ code: 'it-IT', label: key }];
        category.parentId = parentId ? parentId : null;
        category.isRoot = parentId ? false : true;

        // check if the category already exists in the db
        const existingCategory = await categoryModel.findOne({ googleId: category.googleId });
        if (existingCategory) {
          console.warn('Category already exists!');
          assert.ok(false);
          return;
        }

        // save category
        const savedCategory = await category.save();

        if (parentId) {
          // find parent and update its children
          const updatedCategory = await categoryModel.findOneAndUpdate(
            { _id: savedCategory.parentId },
            { $push: { childrenId: savedCategory._id } }
          );
        }

        await saveSubcategories(subcategory, category._id);
      }
    }
  }

  it('save categories to db', async () => {
    this.timeout(0);
    await saveSubcategories(jsonTaxonomy, null);
    // set leaf categories
    await categoryModel.updateMany(
      { childrenId : { $exists: true, $not: { $size: 0 } } },
      { isLeaf: false }
    );
    await categoryModel.updateMany(
      { childrenId : { $exists: true, $size: 0 } },
      { isLeaf: true }
    );
    assert.ok(true);
  });

  it('set leaf categories', async () => {
    await categoryModel.updateMany(
      { childrenId : { $exists: true, $not: { $size: 0 } } },
      { isLeaf: false }
    );
    await categoryModel.updateMany(
      { childrenId : { $exists: true, $size: 0 } },
      { isLeaf: true }
    );
  });


  it('get category - name', async () => {
    const category = await categoryModel.findOne({ googleId: 503031 });

    let categoryName;
    let categoryRoot;
    let categoryLeaf;
    for (let i = 0; i < category.name.length; i++) {
      if (category.name[i].code === 'it-IT') {
        categoryName = category.name[i].label;
        categoryRoot = category.isRoot;
        categoryLeaf = category.isLeaf;
      }
    }

    assert.strictEqual(categoryName, 'Veicoli fuoristrada');
    assert.strictEqual(categoryRoot, false);
    assert.strictEqual(categoryLeaf, false);
  });

  it('get category - parent', async () => {
    const category = await categoryModel.findOne({ googleId: 503031 }).populate('parentId');

    let categoryName;
    let categoryRoot;
    let categoryLeaf;
    for (let i = 0; i < category.parentId.name.length; i++) {
      if (category.parentId.name[i].code === 'it-IT') {
        categoryName = category.parentId.name[i].label;
        categoryRoot = category.parentId.isRoot;
        categoryLeaf = category.parentId.isLeaf;
      }
    }

    assert.strictEqual(categoryName, 'Veicoli per terraferma');
    assert.strictEqual(categoryRoot, false);
    assert.strictEqual(categoryLeaf, false);
  });

  it('get category - child', async () => {
    const category = await categoryModel.findOne({ googleId: 503031 }).populate('childrenId');

    let categoryName;
    let categoryRoot;
    let categoryLeaf;
    for (let i = 0; i < category.childrenId.length; i++) {
      if (category.childrenId[i].googleId === '3018') {
        for (let j = 0; j < category.childrenId[i].name.length; j++) {
          if (category.childrenId[i].name[j].code === 'it-IT') {
            categoryName = category.childrenId[i].name[j].label;
            categoryRoot = category.childrenId[i].isRoot;
            categoryLeaf = category.childrenId[i].isLeaf;
          }
        }
      }
    }

    assert.strictEqual(categoryName, 'ATV e UTV');
    assert.strictEqual(categoryRoot, false);
    assert.strictEqual(categoryLeaf, true);
  });
  
  it('get category - all', async () => {
    const categories = await categoryModel.find({});

    assert.strictEqual(categories.length, 5456);
  });

  it('get category - roots', async () => {
    const categories = await categoryModel.find({ isRoot: true });

    assert.strictEqual(categories.length, 21);
  });

  it('get category - leafs', async () => {
    const categories = await categoryModel.find({ isLeaf: true });

    assert.strictEqual(categories.length, 4596);
  });

  it('get category - no roots, no leafs', async () => {
    const categories = await categoryModel.find({ isRoot: false, isLeaf: false });

    assert.strictEqual(categories.length, 839);
  });

});