Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,12 @@ export default class ProjectionFactory {

return new Projection(...projectionFields);
}

static columns(collection: Collection): Projection {
return new Projection(
...Object.keys(collection.schema.fields).filter(
f => collection.schema.fields[f].type === 'Column',
),
);
}
}
180 changes: 96 additions & 84 deletions packages/datasource-toolkit/test/interfaces/projection-factory.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,103 +2,115 @@ import * as factories from '../__factories__';
import { Projection, ProjectionFactory } from '../../src';

describe('ProjectionFactory', () => {
describe('all', () => {
describe('with one to one and many to one relations', () => {
const setupWithManyToOneAndOneToOneRelation = () => {
const dataSource = factories.dataSource.buildWithCollections([
factories.collection.build({
name: 'books',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
myAuthor: factories.oneToOneSchema.build({
foreignCollection: 'authors',
originKey: 'bookId',
}),
formatId: factories.columnSchema.build(),
myFormat: factories.manyToOneSchema.build({
foreignCollection: 'formats',
foreignKey: 'formatId',
}),
title: factories.columnSchema.build(),
},
}),
describe('with one to one and many to one relations', () => {
const setupWithManyToOneAndOneToOneRelation = () => {
const dataSource = factories.dataSource.buildWithCollections([
factories.collection.build({
name: 'books',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
myAuthor: factories.oneToOneSchema.build({
foreignCollection: 'authors',
originKey: 'bookId',
}),
formatId: factories.columnSchema.build(),
myFormat: factories.manyToOneSchema.build({
foreignCollection: 'formats',
foreignKey: 'formatId',
}),
title: factories.columnSchema.build(),
},
}),
factories.collection.build({
name: 'authors',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
bookId: factories.columnSchema.build(),
name: factories.columnSchema.build(),
},
}),
}),
factories.collection.build({
name: 'authors',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
bookId: factories.columnSchema.build(),
name: factories.columnSchema.build(),
},
}),
factories.collection.build({
name: 'formats',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
name: factories.columnSchema.build(),
},
}),
}),
factories.collection.build({
name: 'formats',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
name: factories.columnSchema.build(),
},
}),
]);
}),
]);

return { collection: dataSource.getCollection('books') };
};
return { collection: dataSource.getCollection('books') };
};

it('should return all the collection fields and the relation fields', () => {
const { collection } = setupWithManyToOneAndOneToOneRelation();
it('columns() should return the columns', () => {
const { collection } = setupWithManyToOneAndOneToOneRelation();

expect(ProjectionFactory.all(collection)).toEqual(
new Projection(
'id',
'myAuthor:id',
'myAuthor:bookId',
'myAuthor:name',
'formatId',
'myFormat:id',
'myFormat:name',
'title',
),
);
});
expect(ProjectionFactory.columns(collection)).toEqual(
new Projection('id', 'formatId', 'title'),
);
});

describe('with other relation', () => {
const setupWithOneToManyRelation = () => {
const dataSource = factories.dataSource.buildWithCollections([
factories.collection.build({
name: 'bookPersons',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
},
}),
it('all() should return all the collection fields and the relation fields', () => {
const { collection } = setupWithManyToOneAndOneToOneRelation();

expect(ProjectionFactory.all(collection)).toEqual(
new Projection(
'id',
'myAuthor:id',
'myAuthor:bookId',
'myAuthor:name',
'formatId',
'myFormat:id',
'myFormat:name',
'title',
),
);
});
});

describe('with other relation', () => {
const setupWithOneToManyRelation = () => {
const dataSource = factories.dataSource.buildWithCollections([
factories.collection.build({
name: 'bookPersons',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
},
}),
factories.collection.build({
name: 'books',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
name: factories.columnSchema.build(),
myBookPersons: factories.oneToManySchema.build({
foreignCollection: 'bookPersons',
}),
},
}),
}),
factories.collection.build({
name: 'books',
schema: factories.collectionSchema.build({
fields: {
id: factories.columnSchema.isPrimaryKey().build(),
name: factories.columnSchema.build(),
myBookPersons: factories.oneToManySchema.build({
foreignCollection: 'bookPersons',
}),
},
}),
]);
}),
]);

return { collection: dataSource.getCollection('books') };
};
return { collection: dataSource.getCollection('books') };
};

it('columns() should return the columns', () => {
const { collection } = setupWithOneToManyRelation();

expect(ProjectionFactory.columns(collection)).toEqual(new Projection('id', 'name'));
});

it('should return all the collection fields without the relations', () => {
const { collection } = setupWithOneToManyRelation();
it('all() should return all the collection fields without the relations', () => {
const { collection } = setupWithOneToManyRelation();

expect(ProjectionFactory.all(collection)).toEqual(new Projection('id', 'name'));
});
expect(ProjectionFactory.all(collection)).toEqual(new Projection('id', 'name'));
});
});
});