metalsmith-collections/test/index.js
Aaron Boushley ee4ddb98b7 Allow front matter and pattern collections.
Adjust the matching code to allow collections to be defined in the front matter and by pattern.

Currently if you define collection in the front matter no patterns will match that file.

This aides in building something like a tagging system on a blog. All posts can be matched
with something like `'*.md'` or `'blog/**/*'` and then tags can be added in the individual
posts `collection` front matter.
2015-02-07 09:21:30 -08:00

264 lines
8 KiB
JavaScript

var assert = require('assert');
var Metalsmith = require('metalsmith');
var collections = require('..');
describe('metalsmith-collections', function(){
it('should add collections to metadata', function(done){
var metalsmith = Metalsmith('test/fixtures/basic');
metalsmith
.use(collections({ articles: {}}))
.build(function(err){
if (err) return done(err);
var m = metalsmith.metadata();
assert.equal(2, m.articles.length);
assert.equal(m.collections.articles, m.articles);
done();
});
});
it('should match collections by pattern', function(done){
var metalsmith = Metalsmith('test/fixtures/pattern');
metalsmith
.use(collections({
articles: {
pattern: '*.md'
}
}))
.build(function(err){
if (err) return done(err);
assert.equal(3, metalsmith.metadata().articles.length);
done();
});
});
it('should take a pattern shorthand string', function(done){
var metalsmith = Metalsmith('test/fixtures/pattern');
metalsmith
.use(collections({
articles: '*.md'
}))
.build(function(err){
if (err) return done(err);
assert.equal(3, metalsmith.metadata().articles.length);
done();
});
});
it('should add the collection property to a file', function(done){
var metalsmith = Metalsmith('test/fixtures/pattern');
metalsmith
.use(collections({
articles: '*.md'
}))
.build(function(err, files){
if (err) return done(err);
assert.equal(files['three.md'].collection, 'articles');
done();
});
});
it('should accept a "sortBy" option', function(done){
var metalsmith = Metalsmith('test/fixtures/sort');
metalsmith
.use(collections({ articles: { sortBy: 'title' }}))
.build(function(err){
if (err) return done(err);
var articles = metalsmith.metadata().articles;
assert.equal('Alpha', articles[0].title);
assert.equal('Beta', articles[1].title);
assert.equal('Gamma', articles[2].title);
done();
});
});
it('should accept a "sortBy" function', function(done){
var metalsmith = Metalsmith('test/fixtures/sort');
metalsmith
.use(collections({ articles: { sortBy: sort }}))
.build(function(err){
if (err) return done(err);
var articles = metalsmith.metadata().articles;
assert.equal('Gamma', articles[0].title);
assert.equal('Beta', articles[1].title);
assert.equal('Alpha', articles[2].title);
done();
});
function sort(a, b){
a = a.title.slice(1);
b = b.title.slice(1);
return a > b ? 1 : -1;
}
});
it('should accept a "reverse" option', function(done){
var metalsmith = Metalsmith('test/fixtures/sort');
metalsmith
.use(collections({
articles: {
sortBy: 'title',
reverse: true
}
}))
.build(function(err){
if (err) return done(err);
var articles = metalsmith.metadata().articles;
assert.equal('Alpha', articles[2].title);
assert.equal('Beta', articles[1].title);
assert.equal('Gamma', articles[0].title);
done();
});
});
it('should add next and previous references', function(done){
var metalsmith = Metalsmith('test/fixtures/references');
metalsmith
.use(collections({ articles: {}}))
.build(function(err){
if (err) return done(err);
var articles = metalsmith.metadata().articles;
assert(!articles[0].previous);
assert.equal(articles[0].next, articles[1]);
assert.equal(articles[1].previous, articles[0]);
assert.equal(articles[1].next, articles[2]);
debugger;
assert.equal(articles[2].previous, articles[1]);
assert(!articles[2].next);
done();
});
});
it('should not add references if opts[key].refer === false', function(done){
var metalsmith = Metalsmith('test/fixtures/references-off');
metalsmith
.use(collections({ articles: { refer: false }}))
.build(function(err){
if (err) return done(err);
var articles = metalsmith.metadata().articles;
assert(!articles[0].previous);
assert(!articles[0].next);
assert(!articles[1].previous);
assert(!articles[1].next);
assert(!articles[2].previous);
assert(!articles[2].next);
done();
});
});
it('should not fail with empty collections', function(done) {
var metalsmith = Metalsmith('test/fixtures/empty');
metalsmith
.use(collections({
articles: {
sortBy: 'date',
reverse: true
}
}))
.build(function(err) {
if (err) return done(err);
var articles = metalsmith.metadata().articles;
assert.equal(articles.length, 0);
done();
});
});
it('should add metadata objects to collections', function (done) {
var metalsmith = Metalsmith('test/fixtures/basic');
metalsmith
.use(collections({
articles: {
metadata: { name: 'Batman' }
}
}))
.build(function(err){
if (err) return done(err);
var m = metalsmith.metadata();
assert.equal('Batman', m.articles.metadata.name);
done();
});
});
it('should load collection metadata from a JSON file', function (done) {
var metalsmith = Metalsmith('test/fixtures/basic');
metalsmith
.use(collections({
articles: {
metadata: 'test/fixtures/metadata/metadata.json'
}
}))
.build(function(err){
if (err) return done(err);
var m = metalsmith.metadata();
assert.equal('Batman', m.articles.metadata.name);
done();
});
});
it('should load collection metadata from a YAML file', function (done) {
var metalsmith = Metalsmith('test/fixtures/basic');
metalsmith
.use(collections({
articles: {
metadata: 'test/fixtures/metadata/metadata.yaml'
}
}))
.build(function(err){
if (err) return done(err);
var m = metalsmith.metadata();
assert.equal('Batman', m.articles.metadata.name);
done();
});
});
it('should allow multiple collections', function (done) {
var metalsmith = Metalsmith('test/fixtures/multi');
metalsmith
.use(collections({ articles: {}, posts: {}, drafts: {} }))
.build(function(err){
if (err) return done(err);
var m = metalsmith.metadata();
assert.equal(2, m.articles.length);
assert.equal(1, m.drafts.length);
assert.equal(1, m.posts.length);
assert.equal(m.collections.articles, m.articles);
assert.equal(m.collections.drafts, m.drafts);
assert.equal(m.collections.posts, m.posts);
done();
});
});
it('should allow collections through metadata alone', function (done) {
var metalsmith = Metalsmith('test/fixtures/noconfig');
metalsmith
.use(collections({ movies: {} }))
.build(function(err){
if (err) return done(err);
var m = metalsmith.metadata();
assert.equal(2, m.books.length);
assert.equal(1, m.movies.length);
assert.equal(m.collections.books, m.books);
assert.equal(m.collections.movies, m.movies);
done();
});
});
it('should allow collections by pattern and front matter', function (done) {
var metalsmith = Metalsmith('test/fixtures/multi');
metalsmith
.use(collections({ articles: {}, posts: {}, drafts: {}, blog: '*.md' }))
.build(function(err){
if (err) return done(err);
var m = metalsmith.metadata();
assert.equal(3, m.blog.length);
assert.equal(2, m.articles.length);
assert.equal(1, m.drafts.length);
assert.equal(1, m.posts.length);
assert.equal(m.collections.blog, m.blog);
assert.equal(m.collections.articles, m.articles);
assert.equal(m.collections.drafts, m.drafts);
assert.equal(m.collections.posts, m.posts);
done();
});
});
});