jhipster-rasha-core
Version:
JHipster's own domain language and core objects
215 lines (211 loc) • 8.3 kB
JavaScript
'use strict';
const expect = require('chai').expect,
fail = expect.fail,
JDLParser = require('../../../lib/parser/jdl_parser'),
EntityParser = require('../../../lib/parser/entity_parser'),
parseFromFiles = require('../../../lib/reader/jdl_reader').parseFromFiles;
describe('::convert', () => {
describe('when passing invalid parameters', () => {
describe('such as undefined', () => {
it('throws an error', () => {
try {
EntityParser.parse();
fail();
} catch (error) {
expect(error.name).to.eq('NullPointerException');
}
});
});
describe('such as an no databaseType', () => {
const input = parseFromFiles(['./test/test_files/valid_jdl.jdl']);
it('throws an error', () => {
try {
EntityParser.parse({jdlObject: JDLParser.parse(input, 'sql')});
fail();
} catch (error) {
expect(error.name).to.eq('NullPointerException');
}
});
});
describe('such as invalid databaseType', () => {
const input = parseFromFiles(['./test/test_files/valid_jdl.jdl']);
it('throws an error', () => {
try {
EntityParser.parse({
jdlObject: JDLParser.parse(input, 'sql'),
databaseType: 'mongodb'
});
fail();
} catch (error) {
expect(error.name).to.eq('NoSQLModelingException');
}
});
});
});
describe('when passing valid arguments', () => {
describe('when converting JDL to entity json for SQL type', () => {
const input = parseFromFiles(['./test/test_files/complex_jdl.jdl']);
const content = EntityParser.parse({
jdlObject: JDLParser.parse(input, 'mysql'),
databaseType: 'mysql'
});
it('converts it', () => {
expect(content).not.to.be.null;
expect(Object.keys(content).length).to.eq(8);
for (let i = 0, entities = Object.keys(content); i < entities.length; i++) {
expect(content[entities[i]].fluentMethods).to.eq(true);
}
expect(content.Department.relationships.length).to.eq(2);
expect(content.Department.relationships[1].javadoc).to.eq('A relationship');
expect(content.Department.fields.length).to.eq(2);
expect(content.Department.entityTableName).to.eq('department');
expect(content.Employee.javadoc).to.eq('The Employee entity.\nSecond line in javadoc.');
expect(content.Employee.pagination).to.eq('infinite-scroll');
expect(content.Employee.relationships[3].javadoc).to.eq('Another side of the same relationship');
expect(content.Job.relationships[0].otherEntityRelationshipName).to.eq('job');
expect(content.Task.relationships[0].otherEntityRelationshipName).to.eq('chore');
});
});
describe('when converting JDL to entity json for MongoDB type', () => {
const input = parseFromFiles(['./test/test_files/mongo_jdl.jdl']);
const content = EntityParser.parse({
jdlObject: JDLParser.parse(input, 'mongodb'),
databaseType: 'mongodb'
});
it('converts it', () => {
expect(content).not.to.be.null;
expect(Object.keys(content).length).to.eq(8);
expect(content.Department.relationships.length).to.eq(0);
expect(content.Department.fields.length).to.eq(2);
expect(content.Department.entityTableName).to.eq('department');
expect(content.Employee.javadoc).to.eq('The Employee entity.');
expect(content.Employee.pagination).to.eq('infinite-scroll');
});
});
describe('when converting JDL to entity json for Cassandra type', () => {
const input = parseFromFiles(['./test/test_files/cassandra_jdl.jdl']);
const content = EntityParser.parse({
jdlObject: JDLParser.parse(input, 'cassandra'),
databaseType: 'cassandra'
});
it('converts it', () => {
expect(content).not.to.be.null;
expect(Object.keys(content).length).to.eq(8);
expect(content.Department.relationships.length).to.eq(0);
expect(content.Department.fields.length).to.eq(2);
expect(content.Department.entityTableName).to.eq('department');
expect(content.Employee.javadoc).to.eq('The Employee entity.');
expect(content.Employee.pagination).to.eq('no');
});
});
describe('when converting a JDL to JSON with a required relationship', () => {
const input = parseFromFiles(['./test/test_files/required_relationships.jdl']);
const content = EntityParser.parse({
jdlObject: JDLParser.parse(input, 'sql'),
databaseType: 'sql'
});
it('converts it', () => {
expect(content.A.relationships).to.deep.eq([{
otherEntityField: 'id',
otherEntityName: 'b',
otherEntityRelationshipName: 'a',
ownerSide: true,
relationshipName: 'b',
relationshipType: 'one-to-one',
relationshipValidateRules: 'required'
}]);
});
});
describe('when converting a JDL to JSON with fluent methods', () => {
let input = parseFromFiles(['./test/test_files/fluent_methods.jdl']);
let content = EntityParser.parse({
jdlObject: JDLParser.parse(input, 'sql'),
databaseType: 'sql'
});
it('converts it', () => {
expect(content.A.fluentMethods).to.be.false;
expect(content.B.fluentMethods).to.be.true;
expect(content.C.fluentMethods).to.be.true;
input = parseFromFiles(['./test/test_files/fluent_methods2.jdl']);
content = EntityParser.parse({
jdlObject: JDLParser.parse(input, 'sql'),
databaseType: 'sql'
});
expect(content.A.fluentMethods).to.be.true;
expect(content.B.fluentMethods).to.be.false;
expect(content.C.fluentMethods).to.be.false;
});
});
describe('when converting a JDL to JSON with all different types of bi-directional relationships', () => {
const input = parseFromFiles(['./test/test_files/different_relationship_types.jdl']);
const content = EntityParser.parse({
jdlObject: JDLParser.parse(input, 'sql'),
databaseType: 'sql'
});
it('converts it', () => {
expect(content.A.relationships).to.deep.eq(
[
{
'relationshipName': 'bbbb',
'otherEntityName': 'b',
'relationshipType': 'one-to-one',
'otherEntityField': 'id',
'ownerSide': true,
'otherEntityRelationshipName': 'aaaa'
},
{
'relationshipName': 'b',
'otherEntityName': 'b',
'relationshipType': 'one-to-many',
'otherEntityRelationshipName': 'a'
},
{
'relationshipName': 'bb',
'otherEntityName': 'b',
'relationshipType': 'many-to-one',
'otherEntityField': 'id'
},
{
'relationshipName': 'bbb',
'otherEntityName': 'b',
'relationshipType': 'many-to-many',
'otherEntityField': 'id',
'ownerSide': true,
'otherEntityRelationshipName': 'aaa'
}
]
);
expect(content.B.relationships).to.deep.eq(
[
{
'relationshipName': 'aaaa',
'otherEntityName': 'a',
'relationshipType': 'one-to-one',
'ownerSide': false,
'otherEntityRelationshipName': 'bbbb'
},
{
'relationshipName': 'a',
'otherEntityName': 'a',
'relationshipType': 'many-to-one',
'otherEntityField': 'id'
},
{
'relationshipName': 'aa',
'otherEntityName': 'a',
'relationshipType': 'one-to-many',
'otherEntityRelationshipName': 'bb'
},
{
'relationshipName': 'aaa',
'otherEntityName': 'a',
'relationshipType': 'many-to-many',
'ownerSide': false,
'otherEntityRelationshipName': 'bbb'
}
]
);
});
});
});
});