mirror of
https://github.com/noodlapp/noodl.git
synced 2026-01-12 23:32:53 +01:00
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>
This commit is contained in:
358
packages/noodl-editor/tests/project/projectimport.js
Normal file
358
packages/noodl-editor/tests/project/projectimport.js
Normal file
@@ -0,0 +1,358 @@
|
||||
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();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user