Browse Source
The karma tests don't pass yet, and aren't ready to land on develop. This reverts commitpull/1386/head438453e61a
, reversing changes made to50f94eb040
.
9 changed files with 11 additions and 598 deletions
@ -1,9 +1,8 @@
|
||||
/cert.pem |
||||
/.DS_Store |
||||
/karma-reports |
||||
/key.pem |
||||
/lib |
||||
/node_modules |
||||
/packages/ |
||||
/vector/bundle.* |
||||
/vector/components.css |
||||
node_modules |
||||
vector/bundle.* |
||||
lib |
||||
.DS_Store |
||||
key.pem |
||||
cert.pem |
||||
vector/components.css |
||||
packages/ |
||||
|
@ -1,134 +0,0 @@
|
||||
// karma.conf.js - the config file for karma, which runs our tests.
|
||||
|
||||
var path = require('path'); |
||||
var fs = require('fs'); |
||||
var webpack = require('webpack'); |
||||
|
||||
/* |
||||
* We use webpack to build our tests. It's a pain to have to wait for webpack |
||||
* to build everything; however it's the easiest way to load our dependencies |
||||
* from node_modules. |
||||
* |
||||
* If you run karma in multi-run mode (with `npm run test-multi`), it will watch |
||||
* the tests for changes, and webpack will rebuild using a cache. This is much quicker |
||||
* than a clean rebuild. |
||||
*/ |
||||
|
||||
// the name of the test file. By default, a special file which runs all tests.
|
||||
var testFile = process.env.KARMA_TEST_FILE || 'test/all-tests.js'; |
||||
|
||||
process.env.PHANTOMJS_BIN = 'node_modules/.bin/phantomjs'; |
||||
process.env.Q_DEBUG = 1; |
||||
|
||||
module.exports = function (config) { |
||||
config.set({ |
||||
// frameworks to use
|
||||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
||||
frameworks: ['mocha'], |
||||
|
||||
// list of files / patterns to load in the browser
|
||||
files: [ |
||||
testFile, |
||||
{pattern: 'vector/img/*', watched: false, included: false, served: true, nocache: false}, |
||||
], |
||||
|
||||
// redirect img links to the karma server
|
||||
proxies: { |
||||
"/img/": "/base/vector/img/", |
||||
}, |
||||
|
||||
// preprocess matching files before serving them to the browser
|
||||
// available preprocessors:
|
||||
// https://npmjs.org/browse/keyword/karma-preprocessor
|
||||
preprocessors: { |
||||
'test/**/*.js': ['webpack', 'sourcemap'] |
||||
}, |
||||
|
||||
// test results reporter to use
|
||||
// possible values: 'dots', 'progress'
|
||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||
reporters: ['progress', 'junit'], |
||||
|
||||
// web server port
|
||||
port: 9876, |
||||
|
||||
// enable / disable colors in the output (reporters and logs)
|
||||
colors: true, |
||||
|
||||
// level of logging
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR ||
|
||||
// config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
logLevel: config.LOG_INFO, |
||||
|
||||
// enable / disable watching file and executing tests whenever any file
|
||||
// changes
|
||||
autoWatch: true, |
||||
|
||||
// start these browsers
|
||||
// available browser launchers:
|
||||
// https://npmjs.org/browse/keyword/karma-launcher
|
||||
browsers: [ |
||||
'Chrome', |
||||
//'PhantomJS',
|
||||
], |
||||
|
||||
// Continuous Integration mode
|
||||
// if true, Karma captures browsers, runs the tests and exits
|
||||
// singleRun: false,
|
||||
|
||||
// Concurrency level
|
||||
// how many browser should be started simultaneous
|
||||
concurrency: Infinity, |
||||
|
||||
junitReporter: { |
||||
outputDir: 'karma-reports', |
||||
}, |
||||
|
||||
webpack: { |
||||
module: { |
||||
loaders: [ |
||||
{ test: /\.json$/, loader: "json" }, |
||||
{ |
||||
test: /\.js$/, loader: "babel", |
||||
include: [path.resolve('./src'), |
||||
path.resolve('./test'), |
||||
], |
||||
query: { |
||||
// we're using babel 5, for consistency with
|
||||
// the release build, which doesn't use the
|
||||
// presets.
|
||||
// presets: ['react', 'es2015'],
|
||||
}, |
||||
}, |
||||
], |
||||
noParse: [ |
||||
// don't parse the languages within highlight.js. They
|
||||
// cause stack overflows
|
||||
// (https://github.com/webpack/webpack/issues/1721), and
|
||||
// there is no need for webpack to parse them - they can
|
||||
// just be included as-is.
|
||||
/highlight\.js\/lib\/languages/, |
||||
|
||||
// also disable parsing for sinon, because it
|
||||
// tries to do voodoo with 'require' which upsets
|
||||
// webpack (https://github.com/webpack/webpack/issues/304)
|
||||
/sinon\/pkg\/sinon\.js$/, |
||||
], |
||||
}, |
||||
resolve: { |
||||
alias: { |
||||
// alias any requires to the react module to the one in our path, otherwise
|
||||
// we tend to get the react source included twice when using npm link.
|
||||
react: path.resolve('./node_modules/react'), |
||||
|
||||
sinon: 'sinon/pkg/sinon.js', |
||||
}, |
||||
root: [ |
||||
path.resolve('./src'), |
||||
path.resolve('./test'), |
||||
], |
||||
}, |
||||
devtool: 'inline-source-map', |
||||
}, |
||||
}); |
||||
}; |
@ -1,7 +0,0 @@
|
||||
// all-tests.js
|
||||
//
|
||||
// Our master test file: uses the webpack require API to find our test files
|
||||
// and run them
|
||||
|
||||
var context = require.context('./app-tests', true, /\.jsx?$/); |
||||
context.keys().forEach(context); |
@ -1,168 +0,0 @@
|
||||
/* |
||||
Copyright 2016 OpenMarket Ltd |
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); |
||||
you may not use this file except in compliance with the License. |
||||
You may obtain a copy of the License at |
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software |
||||
distributed under the License is distributed on an "AS IS" BASIS, |
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
See the License for the specific language governing permissions and |
||||
limitations under the License. |
||||
*/ |
||||
|
||||
/* joining.js: tests for the various paths when joining a room */ |
||||
|
||||
require('skin-sdk'); |
||||
|
||||
var jssdk = require('matrix-js-sdk'); |
||||
|
||||
var sdk = require('matrix-react-sdk'); |
||||
var peg = require('matrix-react-sdk/lib/MatrixClientPeg'); |
||||
var dis = require('matrix-react-sdk/lib/dispatcher'); |
||||
var MatrixChat = sdk.getComponent('structures.MatrixChat'); |
||||
var RoomDirectory = sdk.getComponent('structures.RoomDirectory'); |
||||
var RoomPreviewBar = sdk.getComponent('rooms.RoomPreviewBar'); |
||||
var RoomView = sdk.getComponent('structures.RoomView'); |
||||
|
||||
var React = require('react'); |
||||
var ReactDOM = require('react-dom'); |
||||
var ReactTestUtils = require('react-addons-test-utils'); |
||||
var expect = require('expect'); |
||||
var q = require('q'); |
||||
|
||||
var test_utils = require('../test-utils'); |
||||
var MockHttpBackend = require('../mock-request'); |
||||
|
||||
var HS_URL='http://localhost'; |
||||
var IS_URL='http://localhost'; |
||||
var USER_ID='@me:localhost'; |
||||
var ACCESS_TOKEN='access_token'; |
||||
|
||||
describe('joining a room', function () { |
||||
describe('over federation', function () { |
||||
var parentDiv; |
||||
var httpBackend; |
||||
var matrixChat; |
||||
|
||||
beforeEach(function() { |
||||
test_utils.beforeEach(this); |
||||
httpBackend = new MockHttpBackend(); |
||||
jssdk.request(httpBackend.requestFn); |
||||
parentDiv = document.createElement('div'); |
||||
|
||||
// uncomment this to actually add the div to the UI, to help with
|
||||
// debugging (but slow things down)
|
||||
// document.body.appendChild(parentDiv);
|
||||
}); |
||||
|
||||
afterEach(function() { |
||||
if (parentDiv) { |
||||
ReactDOM.unmountComponentAtNode(parentDiv); |
||||
parentDiv.remove(); |
||||
parentDiv = null; |
||||
} |
||||
httpBackend.verifyNoOutstandingRequests(); |
||||
}); |
||||
|
||||
it('should not get stuck at a spinner', function(done) { |
||||
var ROOM_ALIAS = '#alias:localhost'; |
||||
var ROOM_ID = '!id:localhost'; |
||||
|
||||
httpBackend.when('PUT', '/presence/'+encodeURIComponent(USER_ID)+'/status') |
||||
.respond(200, {}); |
||||
if (test_utils.browserSupportsWebRTC()) { |
||||
httpBackend.when('GET', '/voip/turnServer').respond(200, {}); |
||||
} |
||||
httpBackend.when('GET', '/pushrules').respond(200, {}); |
||||
httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' }); |
||||
httpBackend.when('GET', '/sync').respond(200, {}); |
||||
httpBackend.when('GET', '/publicRooms').respond(200, {chunk: []}); |
||||
|
||||
// start with a logged-in client
|
||||
peg.replaceUsingAccessToken(HS_URL, IS_URL, USER_ID, ACCESS_TOKEN); |
||||
|
||||
var mc = <MatrixChat config={{}}/>; |
||||
matrixChat = ReactDOM.render(mc, parentDiv); |
||||
|
||||
// switch to the Directory
|
||||
dis.dispatch({ |
||||
action: 'view_room_directory', |
||||
}); |
||||
|
||||
var roomView; |
||||
httpBackend.flush().then(() => { |
||||
var roomDir = ReactTestUtils.findRenderedComponentWithType( |
||||
matrixChat, RoomDirectory); |
||||
|
||||
// enter an alias in the input, and simulate enter
|
||||
var input = ReactTestUtils.findRenderedDOMComponentWithTag( |
||||
roomDir, 'input'); |
||||
input.value = ROOM_ALIAS; |
||||
ReactTestUtils.Simulate.keyUp(input, {key: 'Enter'}); |
||||
|
||||
// that should create a roomview which will start a peek; wait
|
||||
// for the peek.
|
||||
httpBackend.when('GET', '/rooms/'+encodeURIComponent(ROOM_ALIAS)+"/initialSync") |
||||
.respond(401, {errcode: 'M_GUEST_ACCESS_FORBIDDEN'}); |
||||
return httpBackend.flush(); |
||||
}).then(() => { |
||||
httpBackend.verifyNoOutstandingExpectation(); |
||||
|
||||
// we should now have a roomview, with a preview bar
|
||||
roomView = ReactTestUtils.findRenderedComponentWithType( |
||||
matrixChat, RoomView); |
||||
|
||||
var previewBar = ReactTestUtils.findRenderedComponentWithType( |
||||
roomView, RoomPreviewBar); |
||||
|
||||
var joinLink = ReactTestUtils.findRenderedDOMComponentWithTag( |
||||
previewBar, 'a'); |
||||
|
||||
ReactTestUtils.Simulate.click(joinLink); |
||||
|
||||
// that will fire off a request to check our displayname, followed by a
|
||||
// join request
|
||||
httpBackend.when('GET', '/profile/'+encodeURIComponent(USER_ID)) |
||||
.respond(200, {displayname: 'boris'}); |
||||
httpBackend.when('POST', '/join/'+encodeURIComponent(ROOM_ALIAS)) |
||||
.respond(200, {room_id: ROOM_ID}); |
||||
return httpBackend.flush(); |
||||
}).then(() => { |
||||
httpBackend.verifyNoOutstandingExpectation(); |
||||
|
||||
// the roomview should now be loading
|
||||
expect(roomView.state.room).toBe(null); |
||||
expect(roomView.state.joining).toBe(true); |
||||
|
||||
// there should be a spinner
|
||||
ReactTestUtils.findRenderedDOMComponentWithClass( |
||||
roomView, "mx_Spinner"); |
||||
|
||||
// now send the room down the /sync pipe
|
||||
httpBackend.when('GET', '/sync'). |
||||
respond(200, { |
||||
rooms: { |
||||
join: { |
||||
[ROOM_ID]: { |
||||
state: {}, |
||||
timeline: { |
||||
events: [], |
||||
limited: true, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}); |
||||
return httpBackend.flush(); |
||||
}).then(() => { |
||||
// now the room should have loaded
|
||||
expect(roomView.state.room).toExist(); |
||||
expect(roomView.state.joining).toBe(false); |
||||
}).done(done, done); |
||||
}); |
||||
}); |
||||
}); |
@ -1,228 +0,0 @@
|
||||
"use strict"; |
||||
var q = require("q"); |
||||
var expect = require('expect'); |
||||
|
||||
/** |
||||
* Construct a mock HTTP backend, heavily inspired by Angular.js. |
||||
* @constructor |
||||
*/ |
||||
function HttpBackend() { |
||||
this.requests = []; |
||||
this.expectedRequests = []; |
||||
var self = this; |
||||
// the request function dependency that the SDK needs.
|
||||
this.requestFn = function(opts, callback) { |
||||
var realReq = new Request(opts.method, opts.uri, opts.body, opts.qs); |
||||
realReq.callback = callback; |
||||
console.log("HTTP backend received request: %s %s", opts.method, opts.uri); |
||||
self.requests.push(realReq); |
||||
|
||||
var abort = function() { |
||||
var idx = self.requests.indexOf(realReq); |
||||
if (idx >= 0) { |
||||
console.log("Aborting HTTP request: %s %s", opts.method, opts.uri); |
||||
self.requests.splice(idx, 1); |
||||
} |
||||
} |
||||
return { |
||||
abort: abort |
||||
}; |
||||
}; |
||||
} |
||||
HttpBackend.prototype = { |
||||
/** |
||||
* Respond to all of the requests (flush the queue). |
||||
* @param {string} path The path to flush (optional) default: all. |
||||
* @param {integer} numToFlush The number of things to flush (optional), default: all. |
||||
* @return {Promise} resolved when there is nothing left to flush. |
||||
*/ |
||||
flush: function(path, numToFlush) { |
||||
var defer = q.defer(); |
||||
var self = this; |
||||
var flushed = 0; |
||||
var triedWaiting = false; |
||||
console.log( |
||||
"HTTP backend flushing... (path=%s numToFlush=%s)", path, numToFlush |
||||
); |
||||
var tryFlush = function() { |
||||
// if there's more real requests and more expected requests, flush 'em.
|
||||
console.log( |
||||
" trying to flush queue => reqs=%s expected=%s [%s]", |
||||
self.requests.length, self.expectedRequests.length, path |
||||
); |
||||
if (self._takeFromQueue(path)) { |
||||
// try again on the next tick.
|
||||
console.log(" flushed. Trying for more. [%s]", path); |
||||
flushed += 1; |
||||
if (numToFlush && flushed === numToFlush) { |
||||
console.log(" [%s] Flushed assigned amount: %s", path, numToFlush); |
||||
defer.resolve(); |
||||
} |
||||
else { |
||||
setTimeout(tryFlush, 0); |
||||
} |
||||
} |
||||
else if (flushed === 0 && !triedWaiting) { |
||||
// we may not have made the request yet, wait a generous amount of
|
||||
// time before giving up.
|
||||
setTimeout(tryFlush, 5); |
||||
triedWaiting = true; |
||||
} |
||||
else { |
||||
console.log(" no more flushes. [%s]", path); |
||||
defer.resolve(); |
||||
} |
||||
}; |
||||
|
||||
setTimeout(tryFlush, 0); |
||||
|
||||
return defer.promise; |
||||
}, |
||||
|
||||
/** |
||||
* Attempts to resolve requests/expected requests. |
||||
* @param {string} path The path to flush (optional) default: all. |
||||
* @return {boolean} true if something was resolved. |
||||
*/ |
||||
_takeFromQueue: function(path) { |
||||
var req = null; |
||||
var i, j; |
||||
var matchingReq, expectedReq, testResponse = null; |
||||
for (i = 0; i < this.requests.length; i++) { |
||||
req = this.requests[i]; |
||||
for (j = 0; j < this.expectedRequests.length; j++) { |
||||
expectedReq = this.expectedRequests[j]; |
||||
if (path && path !== expectedReq.path) { continue; } |
||||
if (expectedReq.method === req.method && |
||||
req.path.indexOf(expectedReq.path) !== -1) { |
||||
if (!expectedReq.data || (JSON.stringify(expectedReq.data) === |
||||
JSON.stringify(req.data))) { |
||||
matchingReq = expectedReq; |
||||
this.expectedRequests.splice(j, 1); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (matchingReq) { |
||||
// remove from request queue
|
||||
this.requests.splice(i, 1); |
||||
i--; |
||||
|
||||
for (j = 0; j < matchingReq.checks.length; j++) { |
||||
matchingReq.checks[j](req); |
||||
} |
||||
testResponse = matchingReq.response; |
||||
console.log(" responding to %s", matchingReq.path); |
||||
var body = testResponse.body; |
||||
if (Object.prototype.toString.call(body) == "[object Function]") { |
||||
body = body(req.path, req.data); |
||||
} |
||||
req.callback( |
||||
testResponse.err, testResponse.response, body |
||||
); |
||||
matchingReq = null; |
||||
} |
||||
} |
||||
if (testResponse) { // flushed something
|
||||
return true; |
||||
} |
||||
return false; |
||||
}, |
||||
|
||||
/** |
||||
* Makes sure that the SDK hasn't sent any more requests to the backend. |
||||
*/ |
||||
verifyNoOutstandingRequests: function() { |
||||
var firstOutstandingReq = this.requests[0] || {}; |
||||
expect(this.requests.length).toEqual(0, |
||||
"Expected no more HTTP requests but received request to " + |
||||
firstOutstandingReq.path |
||||
); |
||||
}, |
||||
|
||||
/** |
||||
* Makes sure that the test doesn't have any unresolved requests. |
||||
*/ |
||||
verifyNoOutstandingExpectation: function() { |
||||
var firstOutstandingExpectation = this.expectedRequests[0] || {}; |
||||
expect(this.expectedRequests.length).toEqual( |
||||
0, |
||||
"Expected to see HTTP request for " |
||||
+ firstOutstandingExpectation.method |
||||
+ " " + firstOutstandingExpectation.path |
||||
); |
||||
}, |
||||
|
||||
/** |
||||
* Create an expected request. |
||||
* @param {string} method The HTTP method |
||||
* @param {string} path The path (which can be partial) |
||||
* @param {Object} data The expected data. |
||||
* @return {Request} An expected request. |
||||
*/ |
||||
when: function(method, path, data) { |
||||
var pendingReq = new Request(method, path, data); |
||||
this.expectedRequests.push(pendingReq); |
||||
return pendingReq; |
||||
} |
||||
}; |
||||
|
||||
function Request(method, path, data, queryParams) { |
||||
this.method = method; |
||||
this.path = path; |
||||
this.data = data; |
||||
this.queryParams = queryParams; |
||||
this.callback = null; |
||||
this.response = null; |
||||
this.checks = []; |
||||
} |
||||
Request.prototype = { |
||||
/** |
||||
* Execute a check when this request has been satisfied. |
||||
* @param {Function} fn The function to execute. |
||||
* @return {Request} for chaining calls. |
||||
*/ |
||||
check: function(fn) { |
||||
this.checks.push(fn); |
||||
return this; |
||||
}, |
||||
|
||||
/** |
||||
* Respond with the given data when this request is satisfied. |
||||
* @param {Number} code The HTTP status code. |
||||
* @param {Object|Function} data The HTTP JSON body. If this is a function, |
||||
* it will be invoked when the JSON body is required (which should be returned). |
||||
*/ |
||||
respond: function(code, data) { |
||||
this.response = { |
||||
response: { |
||||
statusCode: code, |
||||
headers: {} |
||||
}, |
||||
body: data, |
||||
err: null |
||||
}; |
||||
}, |
||||
|
||||
/** |
||||
* Fail with an Error when this request is satisfied. |
||||
* @param {Number} code The HTTP status code. |
||||
* @param {Error} err The error to throw (e.g. Network Error) |
||||
*/ |
||||
fail: function(code, err) { |
||||
this.response = { |
||||
response: { |
||||
statusCode: code, |
||||
headers: {} |
||||
}, |
||||
body: null, |
||||
err: err |
||||
}; |
||||
}, |
||||
}; |
||||
|
||||
/** |
||||
* The HttpBackend class. |
||||
*/ |
||||
module.exports = HttpBackend; |
@ -1,8 +0,0 @@
|
||||
/* |
||||
* skin-sdk.js |
||||
* |
||||
* Skins the react-sdk with the vector components |
||||
*/ |
||||
|
||||
var sdk = require('matrix-react-sdk'); |
||||
sdk.loadSkin(require('component-index')); |
@ -1,24 +0,0 @@
|
||||
"use strict"; |
||||
|
||||
var q = require('q'); |
||||
|
||||
/** |
||||
* Perform common actions before each test case, e.g. printing the test case |
||||
* name to stdout. |
||||
* @param {Mocha.Context} context The test context |
||||
*/ |
||||
module.exports.beforeEach = function(context) { |
||||
var desc = context.currentTest.fullTitle(); |
||||
console.log(); |
||||
console.log(desc); |
||||
console.log(new Array(1 + desc.length).join("=")); |
||||
}; |
||||
|
||||
/** |
||||
* returns true if the current environment supports webrtc |
||||
*/ |
||||
module.exports.browserSupportsWebRTC = function() { |
||||
var n = global.window.navigator; |
||||
return n.getUserMedia || n.webkitGetUserMedia || |
||||
n.mozGetUserMedia; |
||||
}; |
Loading…
Reference in new issue