mirror of
https://github.com/The-Low-Code-Foundation/OpenNoodl.git
synced 2026-01-11 23:02:56 +01:00
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>
359 lines
11 KiB
JavaScript
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();
|
|
});
|
|
});
|
|
});
|