grapher/lib/links/tests/main.js
2016-09-16 19:22:23 +03:00

249 lines
No EOL
7.6 KiB
JavaScript

//import {
// PostCollection,
// CategoryCollection,
// CommentCollection,
// ResolverCollection
//} from './collections.js';
let PostCollection = new Mongo.Collection('test_post');
let CategoryCollection = new Mongo.Collection('test_category');
let CommentCollection = new Mongo.Collection('test_comment');
let ResolverCollection = new Mongo.Collection('test_resolver');
PostCollection.attachSchema(new SimpleSchema({
text: {type: String}
}));
CommentCollection.attachSchema(new SimpleSchema({
text: {type: String}
}));
CategoryCollection.attachSchema(new SimpleSchema({
text: {type: String}
}));
ResolverCollection.attachSchema(new SimpleSchema({
resourceId: {type: String}
}));
PostCollection.addLinks({
'comments': {
type: '*',
collection: CommentCollection,
field: 'commentIds',
index: true
},
'autoRemoveComments': {
type: '*',
collection: CommentCollection,
field: 'autoRemoveIds',
autoremove: true
},
'metaComments': {
type: '*',
collection: CommentCollection,
metadata: {
approved: {type: Boolean, optional: true},
date: {type: Date, optional: true},
updated: {type: Date, optional: true}
}
},
category: {
collection: CategoryCollection,
type: '1'
},
metaCategory: {
metadata: {},
collection: CategoryCollection,
type: '1'
},
pictures: {
resolve(object) {
return ResolverCollection.find({
resourceId: object._id
}).fetch();
}
}
});
CommentCollection.addLinks({
post: {
collection: PostCollection,
inversedBy: 'comments'
},
metaPost: {
collection: PostCollection,
inversedBy: 'metaComments'
}
});
CategoryCollection.addLinks({
'posts': {
collection: PostCollection,
inversedBy: 'category'
}
});
PostCollection.remove({});
CategoryCollection.remove({});
CommentCollection.remove({});
ResolverCollection.remove({});
describe('Collection Links', function () {
it('Test Many', function () {
let postId = PostCollection.insert({'text': 'abc'});
let commentId = CommentCollection.insert({'text': 'abc'});
let post = PostCollection.findOne(postId);
const link = PostCollection.getLink(post, 'comments');
link.add(commentId);
assert.lengthOf(link.find().fetch(), 1);
link.remove(commentId);
assert.lengthOf(link.find().fetch(), 0);
});
it('Tests One', function () {
let postId = PostCollection.insert({'text': 'abc'});
let categoryId = CategoryCollection.insert({'text': 'abc'});
let post = PostCollection.findOne(postId);
const link = PostCollection.getLink(post, 'category');
link.set(categoryId);
assert.lengthOf(link.find().fetch(), 1);
assert.equal(categoryId, link.fetch()._id);
link.unset();
assert.lengthOf(link.find().fetch(), 0);
});
it('Tests One Meta', function () {
let postId = PostCollection.insert({'text': 'abc'});
let categoryId = CategoryCollection.insert({'text': 'abc'});
let post = PostCollection.findOne(postId);
let link = PostCollection.getLink(post, 'metaCategory');
link.set(categoryId, {date: new Date()});
assert.lengthOf(link.find().fetch(), 1);
let metadata = link.metadata();
assert.isObject(metadata);
assert.instanceOf(metadata.date, Date);
link.metadata({
updated: new Date()
});
post = PostCollection.findOne(postId);
link = PostCollection.getLink(post, 'metaCategory');
assert.instanceOf(link.metadata().updated, Date);
link.unset();
assert.lengthOf(link.find().fetch(), 0);
});
it('Tests Many Meta', function () {
let postId = PostCollection.insert({'text': 'abc'});
let commentId = CommentCollection.insert({'text': 'abc'});
let post = PostCollection.findOne(postId);
let metaCommentsLink = PostCollection.getLink(post, 'metaComments');
metaCommentsLink.add(commentId, {date: new Date});
assert.lengthOf(metaCommentsLink.find().fetch(), 1);
// verifying reverse search
let metaComment = CommentCollection.findOne(commentId);
let metaPostLink = CommentCollection.getLink(metaComment, 'metaPost');
assert.lengthOf(metaPostLink.find().fetch(), 1);
let metadata = metaCommentsLink.metadata(commentId);
assert.isObject(metadata);
assert.instanceOf(metadata.date, Date);
metaCommentsLink.metadata(commentId, {updated: new Date});
post = PostCollection.findOne(postId);
metaCommentsLink = PostCollection.getLink(post, 'metaComments');
metadata = metaCommentsLink.metadata(commentId);
assert.instanceOf(metadata.updated, Date);
metaCommentsLink.remove(commentId);
assert.lengthOf(metaCommentsLink.find().fetch(), 0);
});
it('Tests inversedBy findings', function () {
let postId = PostCollection.insert({'text': 'abc'});
let commentId = CommentCollection.insert({'text': 'abc'});
let post = PostCollection.findOne(postId);
let comment = CommentCollection.findOne(commentId);
let commentsLink = PostCollection.getLink(post, 'comments');
let metaCommentsLink = PostCollection.getLink(post, 'metaComments');
let postLink = CommentCollection.getLink(comment, 'post');
let postMetaLink = CommentCollection.getLink(comment, 'metaPost');
commentsLink.add(comment);
metaCommentsLink.add(comment);
assert.lengthOf(postLink.find().fetch(), 1);
assert.lengthOf(postMetaLink.find().fetch(), 1);
CommentCollection.remove(comment._id);
post = PostCollection.findOne(postId);
assert.notInclude(post.commentIds, comment._id);
});
it('Tests proper resolver', function () {
let postId = PostCollection.insert({'text': 'abc'});
let uploadId = ResolverCollection.insert({'resourceId': postId});
let post = PostCollection.findOne(postId);
const link = PostCollection.getLink(post, 'pictures');
assert.lengthOf(link.fetch(), 1);
});
it ('Should auto-save object', function () {
let comment = {text: 'abc'};
let postId = PostCollection.insert({text: 'hello'});
const postLink = PostCollection.getLink(postId, 'comments').add(comment);
assert.isDefined(comment._id);
assert.lengthOf(postLink.fetch(), 1);
});
it ('Should have indexes set up', function () {
const raw = PostCollection.rawCollection();
const indexes = Meteor.wrapAsync(raw.indexes, raw)();
const found = _.find(indexes, index => {
return index.key.commentIds == 1;
});
assert.isObject(found);
});
it ('Should auto-remove some objects', function () {
let comment = {text: 'abc'};
let postId = PostCollection.insert({text: 'hello'});
let postLink = PostCollection.getLink(postId, 'comments').add(comment);
assert.isNotNull(comment._id);
PostCollection.remove(postId);
assert.isNotNull(CommentCollection.findOne(comment._id));
comment = {text: 'abc'};
postId = PostCollection.insert({text: 'hello'});
postLink = PostCollection.getLink(postId, 'autoRemoveComments').add(comment);
assert.isDefined(comment._id);
PostCollection.remove(postId);
assert.isUndefined(CommentCollection.findOne(comment._id));
})
});