| Current Path : /proc/thread-self/root/home/deltalab/PMS/partner-manager-backend/test/ |
| Current File : //proc/thread-self/root/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);
});
});