mirror of https://github.com/thumbsup/thumbsup
test: add more end-to-end integration tests
parent
df1c6a7073
commit
0dd4fc7e4c
@ -0,0 +1,21 @@
|
|||||||
|
{{!--
|
||||||
|
This theme renders useful information as a YAML file
|
||||||
|
For reliable integration tests
|
||||||
|
--}}
|
||||||
|
|
||||||
|
title: {{ album.title }}
|
||||||
|
|
||||||
|
albums:
|
||||||
|
{{#each album.albums}}
|
||||||
|
- title: {{title}}
|
||||||
|
url: {{relative url}}
|
||||||
|
{{/each}}
|
||||||
|
|
||||||
|
files:
|
||||||
|
{{#each album.files}}
|
||||||
|
- name: {{filename}}
|
||||||
|
caption: {{meta.caption}}
|
||||||
|
thumbnail: {{relative urls.thumbnail}}
|
||||||
|
preview: {{relative urls.large}}
|
||||||
|
download: {{relative urls.download}}
|
||||||
|
{{/each}}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "@thumbsup/test-theme",
|
||||||
|
"thumbsup": {
|
||||||
|
"themeRoot": "."
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
@color: #333;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
border: @color;
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
const IntegrationTest = require('./integration-test')
|
||||||
|
const fixtures = require('../fixtures')
|
||||||
|
|
||||||
|
describe('Integration: media files', function () {
|
||||||
|
this.slow(5000)
|
||||||
|
this.timeout(5000)
|
||||||
|
|
||||||
|
beforeEach(IntegrationTest.before)
|
||||||
|
afterEach(IntegrationTest.after)
|
||||||
|
|
||||||
|
const image = fixtures.fromDisk('photo.jpg')
|
||||||
|
const integration = new IntegrationTest({
|
||||||
|
'input/london/IMG_0001.jpg': image,
|
||||||
|
'input/london/IMG_0002.jpg': image,
|
||||||
|
'input/newyork/day 1/IMG_0003.jpg': image,
|
||||||
|
'input/newyork/day 2/IMG_0004.jpg': image
|
||||||
|
})
|
||||||
|
|
||||||
|
it('builds the gallery from scratch', function (done) {
|
||||||
|
const customOpts = []
|
||||||
|
integration.run(customOpts, () => {
|
||||||
|
// Database
|
||||||
|
integration.assertExist([
|
||||||
|
'thumbsup.db'
|
||||||
|
])
|
||||||
|
// Albums
|
||||||
|
integration.assertExist([
|
||||||
|
'index.html',
|
||||||
|
'london.html',
|
||||||
|
'newyork-day-1.html',
|
||||||
|
'newyork-day-2.html'
|
||||||
|
])
|
||||||
|
// Thumbnails
|
||||||
|
integration.assertExist([
|
||||||
|
'media/thumbs/london/IMG_0001.jpg',
|
||||||
|
'media/thumbs/london/IMG_0002.jpg',
|
||||||
|
'media/thumbs/newyork/day 1/IMG_0003.jpg',
|
||||||
|
'media/thumbs/newyork/day 2/IMG_0004.jpg'
|
||||||
|
])
|
||||||
|
// Large versions
|
||||||
|
integration.assertExist([
|
||||||
|
'media/large/london/IMG_0001.jpg',
|
||||||
|
'media/large/london/IMG_0002.jpg',
|
||||||
|
'media/large/newyork/day 1/IMG_0003.jpg',
|
||||||
|
'media/large/newyork/day 2/IMG_0004.jpg'
|
||||||
|
])
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('builds the gallery a second time', function (done) {
|
||||||
|
const customOpts = []
|
||||||
|
integration.run(customOpts, () => {
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
@ -0,0 +1,75 @@
|
|||||||
|
const fs = require('fs')
|
||||||
|
const debug = require('debug')
|
||||||
|
const glob = require('glob')
|
||||||
|
const path = require('path')
|
||||||
|
const YAML = require('yaml')
|
||||||
|
const should = require('should/as-function')
|
||||||
|
const fixtures = require('../fixtures')
|
||||||
|
const options = require('../../src/cli/options')
|
||||||
|
const index = require('../../src/index')
|
||||||
|
|
||||||
|
class IntegrationTest {
|
||||||
|
constructor (structure) {
|
||||||
|
this.tmpdir = fixtures.createTempStructure(structure)
|
||||||
|
this.input = path.join(this.tmpdir, 'input')
|
||||||
|
this.output = path.join(this.tmpdir, 'output')
|
||||||
|
this.actualFiles = []
|
||||||
|
}
|
||||||
|
|
||||||
|
run (customOptions, done) {
|
||||||
|
const defaultOptions = [
|
||||||
|
'--input', this.input,
|
||||||
|
'--output', this.output,
|
||||||
|
'--theme-path', 'test-fixtures/theme',
|
||||||
|
'--log', 'info'
|
||||||
|
]
|
||||||
|
const allOptions = defaultOptions.concat(customOptions)
|
||||||
|
const opts = options.get(allOptions)
|
||||||
|
index.build(opts, err => {
|
||||||
|
// Reset the logger ASAP to print the test status
|
||||||
|
console.log = console.logOld
|
||||||
|
should(err).eql(null)
|
||||||
|
debug.assertNotContains('thumbsup:error')
|
||||||
|
this.actualFiles = glob.sync('**/*', {
|
||||||
|
cwd: this.output,
|
||||||
|
nodir: true,
|
||||||
|
nonull: false
|
||||||
|
})
|
||||||
|
setImmediate(done)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
assertExist (expected) {
|
||||||
|
const missing = expected.filter(f => this.actualFiles.indexOf(f) === -1)
|
||||||
|
should(missing).eql([])
|
||||||
|
}
|
||||||
|
|
||||||
|
parse (filepath) {
|
||||||
|
const fullpath = path.join(this.output, filepath)
|
||||||
|
return fs.readFileSync(fullpath, { encoding: 'utf8' })
|
||||||
|
}
|
||||||
|
|
||||||
|
parseYaml (filepath) {
|
||||||
|
const contents = this.parse(filepath)
|
||||||
|
return YAML.parse(contents)
|
||||||
|
}
|
||||||
|
|
||||||
|
getPath (structurePath) {
|
||||||
|
return path.join(this.tmpdir, structurePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IntegrationTest.before = function () {
|
||||||
|
// Listr uses control.log() to print progress
|
||||||
|
// But so does Mocha to print test results
|
||||||
|
// So we override it for the duration of the integration test
|
||||||
|
console.logOld = console.log
|
||||||
|
console.log = debug('thumbsup:info')
|
||||||
|
debug.reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
IntegrationTest.after = function () {
|
||||||
|
console.log = console.logOld
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = IntegrationTest
|
@ -0,0 +1,38 @@
|
|||||||
|
const should = require('should/as-function')
|
||||||
|
const IntegrationTest = require('./integration-test')
|
||||||
|
const fixtures = require('../fixtures')
|
||||||
|
|
||||||
|
describe('Integration: themes', function () {
|
||||||
|
this.slow(5000)
|
||||||
|
this.timeout(5000)
|
||||||
|
|
||||||
|
beforeEach(IntegrationTest.before)
|
||||||
|
afterEach(IntegrationTest.after)
|
||||||
|
|
||||||
|
const integration = new IntegrationTest({
|
||||||
|
'input/IMG_0001.jpg': fixtures.fromDisk('photo.jpg'),
|
||||||
|
'custom.less': '@color: #444;'
|
||||||
|
})
|
||||||
|
|
||||||
|
it('processes LESS variables', function (done) {
|
||||||
|
const customOpts = []
|
||||||
|
integration.run(customOpts, () => {
|
||||||
|
integration.assertExist(['public/theme.css'])
|
||||||
|
const res = integration.parse('public/theme.css')
|
||||||
|
should(res.includes('border: #333')).eql(true)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('can customise LESS variables', function (done) {
|
||||||
|
const customOpts = [
|
||||||
|
'--theme-style', integration.getPath('custom.less')
|
||||||
|
]
|
||||||
|
integration.run(customOpts, () => {
|
||||||
|
integration.assertExist(['public/theme.css'])
|
||||||
|
const res = integration.parse('public/theme.css')
|
||||||
|
should(res.includes('border: #444')).eql(true)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
@ -0,0 +1,38 @@
|
|||||||
|
const should = require('should/as-function')
|
||||||
|
const IntegrationTest = require('./integration-test')
|
||||||
|
const fixtures = require('../fixtures')
|
||||||
|
|
||||||
|
describe('Integration: urls', function () {
|
||||||
|
this.slow(5000)
|
||||||
|
this.timeout(5000)
|
||||||
|
|
||||||
|
beforeEach(IntegrationTest.before)
|
||||||
|
afterEach(IntegrationTest.after)
|
||||||
|
|
||||||
|
const integration = new IntegrationTest({
|
||||||
|
'input/IMG_0001.jpg': fixtures.fromDisk('photo.jpg')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('uses relative URLs by default', function (done) {
|
||||||
|
const customOpts = []
|
||||||
|
integration.run(customOpts, () => {
|
||||||
|
integration.assertExist(['index.html'])
|
||||||
|
const res = integration.parseYaml('index.html')
|
||||||
|
should(res.files[0].thumbnail).eql('media/thumbs/IMG_0001.jpg')
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('can use an external link prefix', function (done) {
|
||||||
|
const customOpts = [
|
||||||
|
'--photo-preview', 'link',
|
||||||
|
'--link-prefix', 'http://example.com'
|
||||||
|
]
|
||||||
|
integration.run(customOpts, () => {
|
||||||
|
integration.assertExist(['index.html'])
|
||||||
|
const res = integration.parseYaml('index.html')
|
||||||
|
should(res.files[0].preview).eql('http://example.com/IMG_0001.jpg')
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
@ -1,107 +0,0 @@
|
|||||||
const debug = require('debug')
|
|
||||||
const glob = require('glob')
|
|
||||||
const path = require('path')
|
|
||||||
const should = require('should/as-function')
|
|
||||||
const fixtures = require('../fixtures')
|
|
||||||
const options = require('../../src/cli/options')
|
|
||||||
const index = require('../../src/index')
|
|
||||||
|
|
||||||
describe('Full integration', function () {
|
|
||||||
this.slow(5000)
|
|
||||||
this.timeout(5000)
|
|
||||||
|
|
||||||
var tmpdir = null
|
|
||||||
var opts = null
|
|
||||||
|
|
||||||
before(() => {
|
|
||||||
const image = fixtures.fromDisk('photo.jpg')
|
|
||||||
tmpdir = fixtures.createTempStructure({
|
|
||||||
'input/london/IMG_0001.jpg': image,
|
|
||||||
'input/london/IMG_0002.jpg': image,
|
|
||||||
'input/newyork/day 1/IMG_0003.jpg': image,
|
|
||||||
'input/newyork/day 2/IMG_0004.jpg': image
|
|
||||||
})
|
|
||||||
opts = options.get([
|
|
||||||
'--input', path.join(tmpdir, 'input'),
|
|
||||||
'--output', path.join(tmpdir, 'output'),
|
|
||||||
'--title', 'Photo album',
|
|
||||||
'--homeAlbumName', 'Home',
|
|
||||||
'--theme', 'classic',
|
|
||||||
'--log', 'info'
|
|
||||||
])
|
|
||||||
})
|
|
||||||
|
|
||||||
// Listr uses control.log() to print progress
|
|
||||||
// But so does Mocha to print test results
|
|
||||||
// So we override it for the duration of the integration test
|
|
||||||
beforeEach(() => {
|
|
||||||
console.logOld = console.log
|
|
||||||
console.log = debug('thumbsup:info')
|
|
||||||
debug.reset()
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
console.log = console.logOld
|
|
||||||
})
|
|
||||||
|
|
||||||
it('builds the gallery from scratch', function (testDone) {
|
|
||||||
index.build(opts, err => {
|
|
||||||
// Reset the logger ASAP to print the test status
|
|
||||||
console.log = console.logOld
|
|
||||||
// Check for any errors
|
|
||||||
should(err).eql(null)
|
|
||||||
debug.assertNotContains('thumbsup:error')
|
|
||||||
// Check the contents of the output folder
|
|
||||||
const actualFiles = actualStructure(opts.output)
|
|
||||||
// Database
|
|
||||||
assertExist(actualFiles, [
|
|
||||||
'thumbsup.db'
|
|
||||||
])
|
|
||||||
// Albums
|
|
||||||
assertExist(actualFiles, [
|
|
||||||
'index.html',
|
|
||||||
'london.html',
|
|
||||||
'newyork-day-1.html',
|
|
||||||
'newyork-day-2.html'
|
|
||||||
])
|
|
||||||
// Thumbnails
|
|
||||||
assertExist(actualFiles, [
|
|
||||||
'media/thumbs/london/IMG_0001.jpg',
|
|
||||||
'media/thumbs/london/IMG_0002.jpg',
|
|
||||||
'media/thumbs/newyork/day 1/IMG_0003.jpg',
|
|
||||||
'media/thumbs/newyork/day 2/IMG_0004.jpg'
|
|
||||||
])
|
|
||||||
// Large versions
|
|
||||||
assertExist(actualFiles, [
|
|
||||||
'media/large/london/IMG_0001.jpg',
|
|
||||||
'media/large/london/IMG_0002.jpg',
|
|
||||||
'media/large/newyork/day 1/IMG_0003.jpg',
|
|
||||||
'media/large/newyork/day 2/IMG_0004.jpg'
|
|
||||||
])
|
|
||||||
testDone()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('builds the gallery a second time (nothing to do)', function (testDone) {
|
|
||||||
index.build(opts, err => {
|
|
||||||
// Reset the logger ASAP to print the test status
|
|
||||||
console.log = console.logOld
|
|
||||||
should(err).eql(null)
|
|
||||||
testDone()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
function actualStructure (dir) {
|
|
||||||
return glob.sync('**/*', {
|
|
||||||
cwd: dir,
|
|
||||||
ignore: 'public',
|
|
||||||
nodir: true,
|
|
||||||
nonull: false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function assertExist (actual, expected) {
|
|
||||||
const missing = expected.filter(f => actual.indexOf(f) === -1)
|
|
||||||
should([]).eql(missing)
|
|
||||||
}
|
|
Loading…
Reference in New Issue