Files
OpenNoodl/packages/noodl-editor/tests/project/projectimport.js
Michael Cartner b9c60b07dc Initial commit
Co-Authored-By: Eric Tuvesson <eric.tuvesson@gmail.com>
Co-Authored-By: mikaeltellhed <2311083+mikaeltellhed@users.noreply.github.com>
Co-Authored-By: kotte <14197736+mrtamagotchi@users.noreply.github.com>
Co-Authored-By: Anders Larsson <64838990+anders-topp@users.noreply.github.com>
Co-Authored-By: Johan  <4934465+joolsus@users.noreply.github.com>
Co-Authored-By: Tore Knudsen <18231882+torekndsn@users.noreply.github.com>
Co-Authored-By: victoratndl <99176179+victoratndl@users.noreply.github.com>
2024-01-26 11:52:55 +01:00

359 lines
11 KiB
JavaScript

const ProjectImporter = require('@noodl-utils/projectimporter');
const FileSystem = require('@noodl-utils/filesystem');
const { ProjectModel } = require('@noodl-models/projectmodel');
const Utils = require('@noodl-utils/utils');
const Process = require('process');
const ncp = require('ncp').ncp;
const fs = require('fs');
const { projectFromDirectory } = require('@noodl-models/projectmodel.editor');
const remote = require('@electron/remote');
const App = remote.app;
describe('Project import and export unit tests', function () {
function expectFilesToExist(direntry, paths, callback) {
var filesToCheck = paths.length;
var success = true;
function done() {
filesToCheck--;
if (filesToCheck === 0) callback(success);
}
for (var i in paths) {
FileSystem.instance.fileExists(direntry + '/' + paths[i], function (exists) {
if (!exists) success = false;
done();
});
}
}
it('can import project with styles and variants', function (done) {
ProjectImporter.instance.listComponentsAndDependencies(
Process.cwd() + '/tests/testfs/import_proj5',
function (imports) {
expect(imports.styles.colors).toEqual([
{
name: 'Primary'
},
{
name: 'Light Gray'
},
{
name: 'Dark Gray'
},
{
name: 'Primary Dark'
},
{
name: 'Dark'
},
{
name: 'Primary Light'
}
]);
expect(imports.styles.text).toEqual([
{
name: 'Body Text',
fileDependencies: ['fonts/Roboto/Roboto-Regular.ttf']
},
{
name: 'Button Label',
fileDependencies: ['fonts/Roboto/Roboto-Regular.ttf']
},
{
name: 'Label Text',
fileDependencies: ['fonts/Roboto/Roboto-Regular.ttf']
}
]);
expect(imports.variants).toEqual([
{
name: 'Basic',
typename: 'net.noodl.controls.button',
fileDependencies: ['fonts/Roboto/Roboto-Medium.ttf'],
styleDependencies: {
colors: ['Primary', 'Primary Light', 'Primary Dark', 'Light Gray'],
text: ['Button Label']
}
},
{
name: 'Search Field',
typename: 'net.noodl.controls.textinput',
fileDependencies: ['fonts/Roboto/Roboto-Medium.ttf'],
styleDependencies: {
colors: ['Light Gray', 'Dark', 'Primary'],
text: ['Body Text', 'Label Text']
}
}
]);
done();
}
);
});
it('can check for collissions (with styles and variants)', function (done) {
projectFromDirectory(Process.cwd() + '/tests/testfs/import_proj5', function (project) {
ProjectModel.instance = project;
// Now check for collistions with project to import
ProjectImporter.instance.listComponentsAndDependencies(
Process.cwd() + '/tests/testfs/import_proj5',
function (imports) {
ProjectImporter.instance.checkForCollisions(imports, function (collisions) {
expect(collisions.components.length).toBe(2);
expect(collisions.modules.length).toBe(1);
expect(collisions.resources.length).toBe(13);
expect(collisions.variants.length).toBe(2);
expect(collisions.styles.colors.length).toBe(6);
expect(collisions.styles.text.length).toBe(3);
done();
});
}
);
});
});
it('can list components and dependencies', function (done) {
ProjectImporter.instance.listComponentsAndDependencies(
Process.cwd() + '/tests/testfs/import_proj1',
function (imports) {
console.log(imports);
expect(imports.components).toEqual([
{
name: '/comp1',
dependencies: [],
fileDependencies: ['assets/bear.jpg'],
styleDependencies: {
text: [],
colors: []
},
variantDependencies: []
},
{
name: '/comp2',
dependencies: [],
fileDependencies: [],
styleDependencies: {
text: [],
colors: []
},
variantDependencies: []
},
{
name: '/Main',
dependencies: ['/comp1'],
fileDependencies: ['Fontfabric - Nexa-Bold.otf'],
styleDependencies: {
text: [],
colors: []
},
variantDependencies: []
}
]);
expect(imports.styles).toEqual({
text: [],
colors: []
});
//the order of these are different on mac and windows, so sort them
imports.resources.sort((a, b) => {
return a.name.localeCompare(b.name);
});
expect(imports.resources).toEqual([
{
name: 'assets/bear.jpg'
},
{
name: 'assets/bikeyellowbuilding.jpg'
},
{
name: 'bear.jpg'
},
{
name: 'Fontfabric - Nexa-Bold.otf'
}
]);
expect(imports.variants).toEqual([]);
expect(imports.modules).toEqual([]);
done();
}
);
});
it('can check for collissions (1)', function (done) {
projectFromDirectory(Process.cwd() + '/tests/testfs/import_proj1', function (project) {
ProjectModel.instance = project;
// Now check for collistions with project to import
ProjectImporter.instance.listComponentsAndDependencies(
Process.cwd() + '/tests/testfs/import_proj2',
function (imports) {
ProjectImporter.instance.checkForCollisions(imports, function (collisions) {
expect(collisions.components.length).toBe(1);
expect(collisions.components[0].name).toBe('/Main');
expect(collisions.resources).toEqual([]);
expect(collisions.modules).toEqual([]);
expect(collisions.variants).toEqual([]);
expect(collisions.styles).toEqual({
colors: [],
text: []
});
done();
});
}
);
});
});
it('can check for collissions (2)', function (done) {
projectFromDirectory(Process.cwd() + '/tests/testfs/import_proj1', function (project) {
ProjectModel.instance = project;
// Now check for collistions with project to import
ProjectImporter.instance.listComponentsAndDependencies(
Process.cwd() + '/tests/testfs/import_proj3',
function (imports) {
ProjectImporter.instance.checkForCollisions(imports, function (collisions) {
expect(collisions.resources).toEqual([
{
name: 'Fontfabric - Nexa-Bold.otf'
},
{
name: 'assets/bear.jpg'
}
]);
expect(collisions.components).toEqual([]);
expect(collisions.modules).toEqual([]);
expect(collisions.variants).toEqual([]);
expect(collisions.styles).toEqual({
colors: [],
text: []
});
done();
});
}
);
});
});
it('can import project with files', function (done) {
var tempDir = App.getPath('temp') + '/noodlunittests-' + Utils.guid() + '/';
FileSystem.instance.makeDirectory(tempDir, function (r) {
if (r.result !== 'success') {
throw 'gaah';
}
ncp(Process.cwd() + '/tests/testfs/import_proj1', tempDir + '/import_proj1', function (err) {
if (err) {
throw err;
}
projectFromDirectory(tempDir + '/import_proj1', function (project) {
ProjectModel.instance = project;
ProjectImporter.instance.listComponentsAndDependencies(
Process.cwd() + '/tests/testfs/import_proj3',
function (imports) {
ProjectImporter.instance.import(Process.cwd() + '/tests/testfs/import_proj3', imports, function () {
expect(ProjectModel.instance.getComponentWithName('/Main2')).not.toBe(undefined);
// Check that files have been copied properly
expectFilesToExist(
tempDir + '/import_proj1',
['assets/bear.jpg', 'Fontfabric - Nexa-Bold.otf', 'newfile.jpg'],
function (success) {
expect(success).toBe(true);
done();
}
);
});
}
);
});
});
});
});
it('can import project with styles, variants and modules', function (done) {
var tempDir = App.getPath('temp') + '/noodlunittests-' + Utils.guid() + '/';
FileSystem.instance.makeDirectory(tempDir, function (r) {
if (r.result !== 'success') {
throw 'gaah';
}
ncp(Process.cwd() + '/tests/testfs/import_proj1', tempDir + '/import_proj1', function (err) {
if (err) {
throw err;
}
projectFromDirectory(tempDir + '/import_proj1', function (project) {
ProjectModel.instance = project;
ProjectImporter.instance.listComponentsAndDependencies(
Process.cwd() + '/tests/testfs/import_proj5',
function (imports) {
ProjectImporter.instance.import(Process.cwd() + '/tests/testfs/import_proj5', imports, function () {
const styles = ProjectModel.instance.getMetaData('styles');
expect(Object.keys(styles.colors).sort()).toEqual([
'Dark',
'Dark Gray',
'Light Gray',
'Primary',
'Primary Dark',
'Primary Light'
]);
expect(Object.keys(styles.text).sort()).toEqual(['Body Text', 'Button Label', 'Label Text']);
expect(
ProjectModel.instance.findVariant('Basic', {
localName: 'net.noodl.controls.button'
})
).not.toBe(undefined);
expect(
ProjectModel.instance.findVariant('Search Field', {
localName: 'net.noodl.controls.textinput'
})
).not.toBe(undefined);
expect(fs.existsSync(tempDir + '/import_proj1/noodl_modules/material-icons')).toBe(true);
done();
});
}
);
});
});
});
});
it('ignores .git', function (done) {
const path = Process.cwd() + '/tests/testfs/import_proj4/';
//add a .git folder with a file inside
FileSystem.instance.makeDirectorySync(path + '.git');
FileSystem.instance.writeFileSync(path + '.git/test', 'test');
ProjectImporter.instance.listComponentsAndDependencies(path, (imports) => {
expect(imports.components.length).toBe(1);
expect(imports.resources.length).toBe(0);
//remove the .git folder
FileSystem.instance.removeFileSync(path + '.git/test');
FileSystem.instance.removeDirectoryRecursiveSync(path + '.git');
done();
});
});
});