Skip to content

Commit

Permalink
test: add complete end-to-end tests
Browse files Browse the repository at this point in the history
  • Loading branch information
pemrouz committed Aug 5, 2016
1 parent 13170ab commit 2cd0007
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 6 deletions.
27 changes: 22 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,34 +12,51 @@
"babel": "babel src -d dist",
"clean": "rm -rf dist && mkdir dist",
"build": "npm run clean && npm run babel && npm run ignore",
"test": "istanbul test ./node_modules/mocha/bin/_mocha --report html -- -R spec --colors",
"coverage": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && rm -rf ./coverage --colors",
"cov": "istanbul cover ./node_modules/mocha/bin/_mocha -- -R spec --colors",
"test-popper": "popper",
"test": "node test/server.js",
"version": "npm run build && git add -A",
"postversion": "git push && git push --tags"
},
"license": "pemrouz.mit-license.org",
"devDependencies": {
"babel-cli": "*",
"babel-preset-es2015": "*",
"browserify": "*",
"babelify": "^7.3.0",
"browserenv": "*",
"browserify": "*",
"chai": "*",
"coveralls": "*",
"dev-null": "^0.1.1",
"istanbul": "*",
"mocha": "*",
"mocha-lcov-reporter": "*",
"mockery": "^1.4.0",
"popper": "*",
"rijs.backpressure": "*",
"rijs.components": "*",
"rijs.core": "*",
"rijs.css": "*",
"rijs.data": "*",
"rijs.db": "*",
"rijs.delay": "*",
"rijs.features": "*",
"rijs.fn": "*",
"rijs.helpers": "*",
"rijs.html": "*",
"rijs.hypermedia": "*",
"rijs.mysql": "*",
"rijs.needs": "*",
"rijs.offline": "*",
"rijs.precss": "*",
"rijs.prehtml": "*",
"rijs.reactive": "*",
"rijs.resdir": "*",
"rijs.serve": "*",
"rijs.sessions": "*",
"rijs.shadow": "*",
"rijs.singleton": "*",
"rijs.sync": "*",
"rijs.versioned": "*",
"tapify": "0.0.1",
"uglify-js": "*"
},
"dependencies": {
Expand Down
1 change: 0 additions & 1 deletion test.js

This file was deleted.

40 changes: 40 additions & 0 deletions test/client.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import 'utilise'
import rijs from './rijs'
const ripple = rijs()
, test = require('tap').test

test('api', t => {
t.plan(2)
t.same(typeof ripple.upload, 'function')
t.same(typeof ripple.upload.log, 'object')
})

test('upload', t => {
// t.plan(2)
const form = once(document.body)('form', 1)
, canvas = form('canvas', 1).node().toBlob(createBlob)

function createBlob(file) {
t.plan(3)

// you would normally create this object from a HTML form
// (see https://github.com/utilise/utilise#--form)
// since we can't programmatically manipulate input[type="file"]
// we mimic the same
const photos = [file]
, forms = { name: 'foo', photos }
photos.__proto__ = FileList.prototype
file.name = 'photo.jpg'

// upload the form and listen for updates
ripple.upload('events', form)
.on('progress.event', progress =>
t.ok(progress > 0 && progress < 100, 'progress is number')
)
.on('response.event', ([status, message]) => {
t.same(status, 200, 'status 200')
t.same(message, 'ok', 'message ok')
form.remove()
})
}
})
47 changes: 47 additions & 0 deletions test/rijs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import backpressure from 'rijs.backpressure'
import components from 'rijs.components'
import versioned from 'rijs.versioned'
import sessions from 'rijs.sessions'
import features from 'rijs.features'
import offline from 'rijs.offline'
import helpers from 'rijs.helpers'
import precss from 'rijs.precss'
import shadow from 'rijs.shadow'
import resdir from 'rijs.resdir'
import mysql from 'rijs.mysql'
import serve from 'rijs.serve'
import needs from 'rijs.needs'
import sync from 'rijs.sync'
import core from 'rijs.core'
import data from 'rijs.data'
import css from 'rijs.css'
import fn from 'rijs.fn'
import db from 'rijs.db'
import upload from '../'

export default function create(opts){
const ripple = core() // empty base collection of resources

// enrich..
data(ripple) // register data types
css(ripple) // register css types
fn(ripple) // register fn types
helpers(ripple) // expose helper functions and constants
mysql(ripple) // adds mysql adaptor crud hooks
db(ripple, opts) // enable external connections
components(ripple) // invoke web components, fn.call(<el>, data)
needs(ripple) // define default attrs for components
precss(ripple) // preapplies scoped css
shadow(ripple) // encapsulates with shadow dom or closes gap
serve(ripple, opts) // serve client libraries
offline(ripple) // loads/saves from/to localstorage
sync(ripple, opts) // syncs resources between server/client
backpressure(ripple) // restricts broadcast to clients based on need
features(ripple) // extend components with features
versioned(ripple) // versioning info and time travel
sessions(ripple, opts) // populates sessionid on each connection
resdir(ripple, opts) // loads from resources folder
upload(ripple)

return ripple
}
52 changes: 52 additions & 0 deletions test/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import 'utilise'
import rijs from './rijs'
import popper from 'popper'
import devnull from 'dev-null'

// the popper js api returns a ripple instance
// which we can later extend with more resources
const ripple = popper({
watch: '.'
, ripple: rijs
, runner: 'tape'
, browsers: ['ie11', 'chrome', 'firefox']
, port: 1945
, tests: `browserify ./test/client.js \
-t babelify \
-t tapify \
-i socket.io \
-i socket.io-client \
-i socket.io-stream \
| sed -E \"s/require\\('socket\\.io-stream'\\)/window.ss/g\"`
// socket.io{-stream} does not play well in browserify
// so we include these as globals
, globals: `
<script src="socket.io/socket.io.js"></script>
<script src="https://npmcdn.com/socket.io-stream/socket.io-stream.js"></script>
`
})

// register a resource
ripple('events', [], { from })

// request handler
function from(req, res){
// ignore all other requests to this resource
if (req.type !== 'upload') return

// pipe the photos somewhere
req.value
.photos[0]
.pipe(devnull())
.on('finish', finish)

function finish() {
if (req.value.name !== 'foo')
throw new Error('name not as expected')

if (req.value.photos.length !== 1)
throw new Error('photos not as expected')

res(200, 'ok')
}
}

0 comments on commit 2cd0007

Please sign in to comment.