Skip to content
This repository was archived by the owner on Dec 26, 2018. It is now read-only.

Commit e5cb32a

Browse files
committed
new test setup
1 parent 3914e57 commit e5cb32a

File tree

9 files changed

+107
-113
lines changed

9 files changed

+107
-113
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
.DS_Store
2-
node_modules
2+
node_modules
3+
test/temp

circle.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
machine:
2+
node:
3+
version: 6

lib/compiler.js

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var Emitter = require('events').EventEmitter
77
var vueCompiler = require('vue-template-compiler')
88

99
var genId = require('./gen-id')
10+
var normalize = require('./normalize')
1011
var compilers = require('./compilers')
1112
var options = require('./compilers/options')
1213
var rewriteStyle = require('./style-rewriter')
@@ -18,8 +19,9 @@ try {
1819
hasBabel = false
1920
}
2021

21-
// determine hot-reload-api location
22-
var hotReloadAPIPath = normalizeDep('vue-hot-reload-api')
22+
// determine dynamic script paths
23+
var hotReloadAPIPath = normalize.dep('vue-hot-reload-api')
24+
var insertCSSPath = normalize.lib('insert-css')
2325

2426
// expose compiler
2527
var compiler = module.exports = new Emitter()
@@ -83,7 +85,7 @@ compiler.compile = function (content, filePath, cb) {
8385
if (style) {
8486
style = JSON.stringify(style)
8587
output +=
86-
'var __vueify_insert__ = require("vueify/lib/insert-css")\n' +
88+
'var __vueify_insert__ = require("' + insertCSSPath + '")\n' +
8789
'var __vueify_style__ = __vueify_insert__.insert(' + style + ')\n'
8890
}
8991
// script
@@ -144,9 +146,13 @@ function processTemplate (part, filePath, parts) {
144146
return compileAsPromise('template', template, part.lang, filePath)
145147
.then(function (res) {
146148
var compiled = vueCompiler.compile(res)
147-
parts.template = {
148-
render: toFunction(compiled.render),
149-
staticRenderFns: '[' + compiled.staticRenderFns.map(toFunction).join(',') + ']'
149+
if (compiled.errors.length) {
150+
throw new Error(compiled.errors.join('\n\n'))
151+
} else {
152+
parts.template = {
153+
render: toFunction(compiled.render),
154+
staticRenderFns: '[' + compiled.staticRenderFns.map(toFunction).join(',') + ']'
155+
}
150156
}
151157
})
152158
}
@@ -216,15 +222,3 @@ function compileAsPromise (type, source, lang, filePath) {
216222
function toFunction (code) {
217223
return 'function(){' + code + '}'
218224
}
219-
220-
function normalizeDep (dep) {
221-
if (process.env.VUEIFY_TEST) {
222-
return dep
223-
} else if (fs.existsSync(path.resolve(__dirname, '../node_modules', dep))) {
224-
// npm 2 or npm linked
225-
return 'vueify/node_modules/' + dep
226-
} else {
227-
// npm 3
228-
return dep
229-
}
230-
}

lib/ensure-require.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ module.exports = function (name, deps) {
1313
req = req[0]
1414
}
1515
try {
16+
// hack for babel-runtime because it does not expose "main" field
17+
if (req === 'babel-runtime') {
18+
req = 'babel-runtime/core-js'
19+
}
1620
require.resolve(req)
1721
} catch (e) {
1822
missing.push(mis)

lib/normalize.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var IS_TEST = !!process.env.VUEIFY_TEST
2+
var fs = require('fs')
3+
var path = require('path')
4+
5+
exports.lib = function (file) {
6+
if (IS_TEST) {
7+
return path.resolve(__dirname, file)
8+
} else {
9+
return 'vueify/lib/' + file
10+
}
11+
}
12+
13+
exports.dep = function (dep) {
14+
if (IS_TEST) {
15+
return dep
16+
} else if (fs.existsSync(path.resolve(__dirname, '../node_modules', dep))) {
17+
// npm 2 or npm linked
18+
return 'vueify/node_modules/' + dep
19+
} else {
20+
// npm 3
21+
return dep
22+
}
23+
}

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"url": "https://github.com/vuejs/vueify/issues"
1818
},
1919
"scripts": {
20-
"test": "NODE_ENV=production mocha test/test.js --slow=5000 --timeout=10000"
20+
"test": "mocha test/test.js --slow=5000 --timeout=10000"
2121
},
2222
"homepage": "https://github.com/vuejs/vueify",
2323
"dependencies": {
@@ -37,13 +37,16 @@
3737
"babel-plugin-transform-runtime": "^6.0.0",
3838
"babel-preset-es2015": "^6.0.0",
3939
"babel-runtime": "^6.0.0",
40+
"browserify": "^13.0.1",
41+
"chai": "^3.5.0",
4042
"coffee-script": "^1.10.0",
4143
"jade": "^1.11.0",
44+
"jsdom": "^9.2.1",
4245
"less": "^2.5.1",
4346
"mocha": "^2.3.3",
4447
"node-sass": "^3.3.3",
4548
"pug": "^2.0.0-alpha6",
46-
"rewire": "^2.5.1",
49+
"rimraf": "^2.5.2",
4750
"stylus": "^0.52.4"
4851
}
4952
}

test/fixtures/autoprefix.vue

Lines changed: 0 additions & 5 deletions
This file was deleted.

test/fixtures/basic.vue

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
1-
<style>
2-
html {
3-
font-size: 20px;
4-
}
5-
</style>
6-
71
<template>
8-
<h1 :id="id" @click="hi">hello</h1>
9-
<input type="text">
10-
<button :disabled="loading">hihi</button>
2+
<h2 class="red">{{msg}}</h2>
113
</template>
124

135
<script>
14-
class Test {
15-
ok() {}
16-
}
17-
18-
var evens = [2,4,6,8]
19-
var odds = evens.map(v => v + 1)
206
export default {
21-
data() {
22-
return odds
7+
data () {
8+
return {
9+
msg: 'Hello from Component A!'
10+
}
2311
}
2412
}
2513
</script>
14+
15+
<style>
16+
comp-a h2 {
17+
color: #f00;
18+
}
19+
</style>

test/test.js

Lines changed: 47 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,52 @@
1-
var fs = require('fs')
2-
var path = require('path')
3-
var compiler = require('../lib/compiler')
4-
var assert = require('assert')
5-
var hash = require('hash-sum')
6-
7-
// test custom transform
8-
compiler.applyConfig({
9-
customCompilers: {
10-
test: function (content, cb) {
11-
content = content.replace('not ', '')
12-
cb(null, content)
13-
}
14-
}
15-
})
16-
17-
function read (file) {
18-
return fs.readFileSync(path.resolve(__dirname, file), 'utf-8')
19-
}
20-
21-
function test (name) {
22-
it(name, function (done) {
23-
var filePath = 'fixtures/' + name + '.vue'
24-
var fileContent = read(filePath)
25-
var expected = read('expects/' + name + '.js')
26-
.replace(/\{\{id\}\}/g, '_v-' + hash(require.resolve('./' + filePath)))
27-
28-
// test registering dependency
29-
var deps = []
30-
function addDep (file) {
31-
deps.push(file)
32-
}
33-
compiler.on('dependency', addDep)
34-
35-
process.env.VUEIFY_TEST = true
36-
process.env.NODE_ENV = name === 'non-minified'
37-
? 'development'
38-
: 'production'
39-
40-
compiler.compile(
41-
fileContent,
42-
path.resolve(__dirname, filePath),
43-
function (err, result) {
44-
// the cb is handled by a Promise, so the assertion
45-
// errors gets swallowed and the test never fails.
46-
// do it in a separate tick.
47-
setTimeout(function () {
48-
if (err) throw err
49-
assert.equal(result, expected, 'should compile correctly')
50-
51-
// check src
52-
if (name === 'src') {
53-
assert.equal(deps[0], __dirname + '/fixtures/test.html')
54-
assert.equal(deps[1], __dirname + '/fixtures/test.styl')
55-
assert.equal(deps[2], __dirname + '/fixtures/src/test.js')
56-
}
57-
58-
if (name === 'less' || name === 'sass' || name === 'styl') {
59-
assert.equal(deps[0], __dirname + '/fixtures/imports/import.' + name)
1+
process.env.VUEIFY_TEST = true
2+
3+
const fs = require('fs')
4+
const path = require('path')
5+
const expect = require('chai').expect
6+
const hash = require('hash-sum')
7+
const rimraf = require('rimraf')
8+
const mkdirp = require('mkdirp')
9+
const browserify = require('browserify')
10+
const vueify = require('../index')
11+
const jsdom = require('jsdom')
12+
const vueCompiler = require('vue-template-compiler')
13+
14+
const tempDir = path.resolve(__dirname, './temp')
15+
const mockEntry = path.resolve(tempDir, 'entry.js')
16+
rimraf.sync(tempDir)
17+
mkdirp.sync(tempDir)
18+
19+
function test (file, assert) {
20+
it(file, done => {
21+
fs.writeFileSync(mockEntry, 'window.vueModule = require("../fixtures/' + file + '.vue")')
22+
browserify(mockEntry)
23+
.transform(vueify)
24+
.bundle((err, buf) => {
25+
if (err) return done(err)
26+
jsdom.env({
27+
html: '<!DOCTYPE html><html><head></head><body></body></html>',
28+
src: [buf.toString()],
29+
done: (err, window) => {
30+
if (err) return done(err)
31+
assert(window)
32+
done()
6033
}
61-
62-
compiler.removeListener('dependency', addDep)
63-
done()
64-
}, 0)
65-
}
66-
)
34+
})
35+
})
6736
})
6837
}
6938

70-
describe('Vueify compiler', function () {
71-
fs.readdirSync(path.resolve(__dirname, 'expects'))
72-
.forEach(function (file) {
73-
test(path.basename(file, '.js'))
74-
})
39+
function assertRenderFn (options, template) {
40+
const compiled = vueCompiler.compile(template)
41+
expect(options.render.toString()).to.equal('function (){' + compiled.render + '}')
42+
}
43+
44+
describe('vueify', () => {
45+
test('basic', window => {
46+
const module = window.vueModule
47+
assertRenderFn(module, '<h2 class="red">{{msg}}</h2>')
48+
expect(module.data().msg).to.contain('Hello from Component A!')
49+
const style = window.document.querySelector('style').textContent
50+
expect(style).to.contain('comp-a h2 {\n color: #f00;\n}')
51+
})
7552
})

0 commit comments

Comments
 (0)