test coverage report

This commit is contained in:
jysperm
2014-10-19 02:15:04 +08:00
parent 11cbb6bc4b
commit a7451966e1
10 changed files with 183 additions and 34 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,5 @@
/node_modules
/coverage-reporter.html
/.vagrant
/package.box

9
.travis.yml Normal file
View File

@@ -0,0 +1,9 @@
language: node_js
node_js:
- "0.11"
- "0.10"
services:
- mongodb
- redis-server

View File

@@ -16,8 +16,8 @@ RootPanel 是一个高度插件化的,基于 Linux 的虚拟服务销售平台
## 安装和使用
* 稳定版本:`git clone -b stable https://github.com/jysperm/RootPanel.git`
* 开发版本:`git clone https://github.com/jysperm/RootPanel.git`
* 稳定版本:`git clone -b stable https://github.com/jysperm/RootPanel.git` [![Build Status](https://travis-ci.org/jysperm/RootPanel.svg?branch=stable)](https://travis-ci.org/jysperm/RootPanel)
* 开发版本:`git clone https://github.com/jysperm/RootPanel.git` [![Build Status](https://travis-ci.org/jysperm/RootPanel.svg?branch=master)](https://travis-ci.org/jysperm/RootPanel)
* Vagrant: <https://vagrantcloud.com/jysperm/boxes/rootpanel>
详细安装说明:[INSTALL.md](https://github.com/jysperm/RootPanel/blob/master/INSTALL.md)

View File

@@ -7,17 +7,30 @@ app.libs =
async: require 'async'
bodyParser: require 'body-parser'
cookieParser: require 'cookie-parser'
crypto: require 'crypto'
depd: require 'depd'
express: require 'express'
fs: require 'fs'
harp: require 'harp'
middlewareInjector: require 'middleware-injector'
mongoose: require 'mongoose'
morgan: require 'morgan'
nodemailer: require 'nodemailer'
path: require 'path'
redis: require 'redis'
redisStore: require 'connect-redis'
expressSession: require 'express-session'
{cookieParser, bodyParser, depd, express, fs, nodemailer, path} = exports.libs
{cookieParser, crypto, bodyParser, depd, express, fs, harp, middlewareInjector, mongoose} = exports.libs
{morgan, nodemailer, path, redis, redisStore, expressSession} = exports.libs
RedisStore = redisStore expressSession
app.logger = do ->
unless process.env.NODE_ENV == 'test'
return console.log
return ->
app.package = require './package'
app.deprecate = depd 'rootpanel'
@@ -26,9 +39,14 @@ do ->
config_path = path.join __dirname, 'config.coffee'
unless fs.existsSync config_path
default_config_path = path.join __dirname, './sample/core.config.coffee'
fs.writeFileSync config_file_path, fs.readFileSync default_config_path
app.deprecate 'config.coffee not found, copy sample config to ./config.coffee'
unless process.env.TRAVIS == 'true'
app.deprecate 'config.coffee not found, copy sample config to ./config.coffee'
default_config = 'core'
else
default_config = 'travis-ci'
fs.writeFileSync config_path, fs.readFileSync path.join __dirname, "./sample/#{default_config}.config.coffee"
fs.chmodSync config_path, 0o750
@@ -42,6 +60,7 @@ do ->
unless fs.existsSync session_key_path
fs.writeFileSync session_key_path, crypto.randomBytes(48).toString('hex')
fs.chmodSync session_key_path, 0o750
app.config = config
app.db = require './core/db'
@@ -73,20 +92,20 @@ app.models =
SecurityLog: require './core/model/security_log'
Ticket: require './core/model/ticket'
app.use bodyParser.json()
app.use morgan 'dev'
app.use cookieParser()
app.use middlewareInjector
app.express.use bodyParser.json()
app.express.use morgan 'dev'
app.express.use cookieParser()
app.express.use middlewareInjector
app.use session
app.express.use expressSession
store: new RedisStore
client: app.redis
resave: true
saveUninitialized: true
resave: false
saveUninitialized: false
secret: fs.readFileSync(path.join __dirname, 'session.key').toString()
app.use (req, res, next) ->
app.express.use (req, res, next) ->
unless req.session.csrf_secret
csrf.secret (err, secret) ->
req.session.csrf_secret = secret
@@ -95,7 +114,7 @@ app.use (req, res, next) ->
next()
app.use (req, res, next) ->
app.express.use (req, res, next) ->
unless req.method == 'GET'
unless csrf.verify req.session.csrf_secret, req.body.csrf_token
return res.status(403).send
@@ -103,7 +122,7 @@ app.use (req, res, next) ->
next()
app.use (req, res, next) ->
app.express.use (req, res, next) ->
req.res = res
res.language = req.cookies.language ? config.i18n.default_language
@@ -130,29 +149,29 @@ app.use (req, res, next) ->
next()
app.use app.middleware.accountInfo
app.express.use app.middleware.accountInfo
app.set 'views', path.join(__dirname, 'core/view')
app.set 'view engine', 'jade'
app.express.set 'views', path.join(__dirname, 'core/view')
app.express.set 'view engine', 'jade'
app.get '/locale/:language?', app.i18n.downloadLocales
app.express.get '/locale/:language?', app.i18n.downloadLocales
app.use '/account', require './core/router/account'
app.use '/billing', require './core/router/billing'
app.use '/ticket', require './core/router/ticket'
app.use '/admin', require './core/router/admin'
app.use '/panel', require './core/router/panel'
app.express.use '/account', require './core/router/account'
app.express.use '/billing', require './core/router/billing'
app.express.use '/ticket', require './core/router/ticket'
app.express.use '/admin', require './core/router/admin'
app.express.use '/panel', require './core/router/panel'
app.pluggable.initializePlugins()
app.get '/', (req, res) ->
app.express.get '/', (req, res) ->
unless res.headerSent
res.redirect '/panel/'
app.use harp.mount './core/static'
app.express.use harp.mount './core/static'
app.billing.run()
app.express.listen config.web.listen, ->
if fs.existsSync config.web.listen
fs.chmodSync config.web.listen, 0o770
app.listen config.web.listen, ->
fs.chmodSync config.web.listen, 0o770
console.log "RootPanel start at #{config.web.listen}"
app.logger "RootPanel start at #{config.web.listen}"

4
core/test/app.coffee Normal file
View File

@@ -0,0 +1,4 @@
describe 'app', ->
it 'should can startup', ->
@timeout 20000
require '../../app'

View File

@@ -16,8 +16,10 @@
}
],
"scripts": {
"start": "coffee app.coffee",
"test": "./node_modules/.bin/mocha --compilers coffee:coffee-script/register --require test/support/env core/test plugin/*/test"
"start": "./node_modules/.bin/coffee app.coffee",
"test": "COV_TEST=true ./node_modules/.bin/mocha --compilers coffee:coffee-script/register --require test/support/env --reporter test/support/reporter-cov-summary.js -- core/test plugin/*/test",
"test-only": "./node_modules/.bin/mocha --compilers coffee:coffee-script/register --require test/support/env -- core/test plugin/*/test",
"test-cov-html": "COV_TEST=true ./node_modules/.bin/mocha --compilers coffee:coffee-script/register --require test/support/env --reporter html-cov -- core/test plugin/*/test > coverage-reporter.html"
},
"bin": {
"rp-fix-permissions": "./bin/rp-fix-permissions.coffee",
@@ -56,6 +58,6 @@
"devDependencies": {
"mocha": "^1.21.5",
"chai": "^1.9.2",
"deepmerge": "^0.2.7"
"coffee-coverage": "^0.4.2"
}
}

View File

View File

@@ -0,0 +1,69 @@
module.exports =
web:
t_name: 'plugins.rpvhost.site_name'
url: 'http://rp.rpvhost.net'
listen: 3000
google_analytics_id: ''
account:
cookie_time: 30 * 24 * 3600 * 1000
i18n:
available_language: ['zh_CN', 'en']
default_language: 'zh_CN'
default_timezone: 'Asia/Shanghai'
plugin:
available_extensions: []
available_services: []
billing:
currency: 'CNY'
force_freeze:
when_balance_below: 0
when_arrears_above: 0
billing_cycle: 10 * 60 * 1000
plans:
sample:
t_name: 'plans.sample.name'
t_description: 'plans.sample.name.description'
billing_by_time:
unit: 24 * 3600 * 1000
price: 10 / 30
services: []
resources: {}
test:
t_name: 'plans.test.name'
t_description: 'plans.test.name.description'
billing_by_usage:
auto_leave: 7 * 24 * 3600 * 1000
services: []
resources: {}
mongodb:
host: 'localhost'
name: 'RootPanel'
redis:
host: '127.0.0.1'
port: 6379
prefix: 'RP'
email:
send_from: 'robot@rpvhost.net'
account:
service: 'Postmark'
auth:
user: 'postmark-api-token'
pass: 'postmark-api-token'
plugins: {}

View File

@@ -1,3 +1,10 @@
process.env.NODE_ENV = 'test'
require("chai").should()
if process.env.COV_TEST == 'true'
require('coffee-coverage').register
path: 'relative'
basePath: "#{__dirname}/../.."
exclude: ['test', 'node_modules', '.git', 'sample', 'core/static']
initAll: true

View File

@@ -0,0 +1,38 @@
var fs = require('fs');
var util = require ('util');
var Spec = require('mocha/lib/reporters/spec');
exports = module.exports = CovSummary;
function CovSummary(runner) {
Spec.call(this, runner);
runner.on('end', report);
}
function report() {
var cov = global._$jscoverage || {};
var files = Object.keys(cov);
var covered_lines = 0;
var total_lines = 0;
files.forEach(function(file) {
cov[file].forEach(function(line) {
if(line !== undefined) {
total_lines ++;
if (line !== 0) {
covered_lines ++;
}
}
});
});
var covered = (covered_lines / total_lines * 100).toFixed(1);
console.log(util.format('Coverage Summary: %s lines of %s lines, %s% covered \n', covered_lines, total_lines, covered));
}
CovSummary.prototype.__proto__ = Spec.prototype;