Skip to content

Commit

Permalink
the bare basic for testing using the webdriver.io harness.
Browse files Browse the repository at this point in the history
  • Loading branch information
FotoVerite committed Oct 20, 2016
1 parent ba9e2b6 commit 0c0d114
Show file tree
Hide file tree
Showing 7 changed files with 321 additions and 4 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -1 +1,2 @@
node_modules
errorShots/*
3 changes: 2 additions & 1 deletion index.js
Expand Up @@ -301,7 +301,8 @@ function joinRoom (room) {
if (err) console.error(err)

let output = waudio(audioStream ? audioStream.clone() : null)
let myelem = views.remoteAudio(storage)
//TODO we should assign the publickey to this element. Worried that setting this later will have cascading effects. Mikeal advice.
let myelem = views.remoteAudio(storage, storage.get('username'), 'me')
connectAudio(myelem, output)

message.update({
Expand Down
4 changes: 2 additions & 2 deletions lib/views.js
Expand Up @@ -71,7 +71,7 @@ const messageView = funky `
<i class="${(item) => item.icon} icon"></i>
<div class="content">
<div class="header">${(item) => item.title || ''}</div>
<p>${(item) => item.message || ''}</p>
<p id='message-text'>${(item) => item.message || ''}</p>
</div>
</div>
`
Expand All @@ -83,7 +83,7 @@ exports.message = ({title, message, icon, type}) => {
}

const remoteAudioView = funky `
<div class="card" id="a${item => item.key}">
<div class="card" id="card-${item => item.key}">
<div style="height:49px;width:290">
<canvas id="canvas"
width="290"
Expand Down
7 changes: 6 additions & 1 deletion package.json
Expand Up @@ -36,6 +36,11 @@
"beefy": "^2.1.8",
"browserify": "^13.1.0",
"standard": "^8.4.0",
"watchify": "^3.7.0"
"watchify": "^3.7.0",
"wdio-mocha-framework": "^0.4.3",
"wdio-sauce-service": "^0.2.5",
"wdio-selenium-standalone-service": "0.0.7",
"wdio-spec-reporter": "0.0.3",
"webdriverio": "^4.2.16"
}
}
29 changes: 29 additions & 0 deletions test/specs/landing-page.js
@@ -0,0 +1,29 @@
var assert = require('assert');
describe('landing page', function() {
it('has the roll call title and basic buttons', function () {
browser.url('http://127.0.0.1:9966');
var title = browser.getTitle();
assert.equal(title, 'Roll Call');
var partyButton = browser.element("button#join-party")
var createRoomButton = browser.element("button#create-room")
partyButton.waitForExist(2500);
createRoomButton.waitForExist(2500);
});

it('has a link to the party room', function () {
browser.url('http://127.0.0.1:9966');
var partyButton = browser.element("button#join-party")
partyButton.waitForExist(2500);
partyButton.click()
assert.equal(browser.getUrl(), 'http://127.0.0.1:9966/?room=room')
});

it('has a link to a new room', function () {
browser.url('http://127.0.0.1:9966');
var title = browser.getTitle();
var createRoomButton = browser.element("button#create-room")
createRoomButton.waitForExist(2500);
createRoomButton.click()
assert(browser.getUrl().match(/http:\/\/127.0.0.1:9966\/\?room=\w{20}/))
});
});
80 changes: 80 additions & 0 deletions test/specs/single-user-room.js
@@ -0,0 +1,80 @@
var assert = require('assert');
describe('single-user-page', function() {

it('shows a message container telling the user to wait', function () {
browser.url('http://127.0.0.1:9966/?room=single-user2');
var message = browser.element("#message-text")
message.waitForExist(500);
assert.equal(browser.getText('#message-text'), 'We are establishing a connection to your room, please be patient...')
})

it('has the roll call title', function () {
browser.url('http://127.0.0.1:9966/?room=single-user');
var title = browser.getTitle();
assert.equal(title, 'Roll Call');
})

it('has a settings button', function () {
browser.url('http://127.0.0.1:9966/?room=single-user');
var settingsButton = browser.element("button#settings")
settingsButton.waitForExist(2500);
assert(settingsButton.isExisting())
})

it('has a share button', function () {
browser.url('http://127.0.0.1:9966/?room=single-user');
var shareButton = browser.element("button#share")
shareButton.waitForExist(2500);
assert(shareButton.isExisting())
})

it('has a record button', function () {
browser.url('http://127.0.0.1:9966/?room=single-user');
var recordButton = browser.element("button#record")
recordButton.waitForExist(2500);
assert(recordButton.isExisting())
})

it('has an audio card and it designated elements', function () {
browser.url('http://127.0.0.1:9966/?room=single-user');
var audioCard = browser.element("div#card-me")
audioCard.waitForExist(2500);
var editableName = browser.element('div#card-me .person-name')
assert(audioCard.isExisting())
assert(editableName.isExisting())
assert.equal(editableName.getText(), 'Me')
assert(browser.element('div#card-me .mute-checkbox').isExisting())
})


it('can change it username by the editable', function () {
browser.url('http://127.0.0.1:9966/?room=single-user');
var audioCard = browser.element("div#card-me")
audioCard.waitForExist(2500);
var editableName = browser.element('div#card-me .person-name')
assert(editableName.isExisting())
editableName.setValue('Matthew')
assert.equal(editableName.getText(), 'Matthew')
})


it('can change it username by the settings', function () {
//TODO this test fails because we don't update the editable.
browser.url('http://127.0.0.1:9966/?room=single-user');
var settingsButton = browser.element("button#settings")
settingsButton.waitForExist(2500);
assert(settingsButton.isExisting())
browser.click("button#settings")
var settingsForm = browser.element("#settings")
settingsForm.waitForExist(2500);
assert(settingsForm.isExisting())
browser.element("#settings input[name='username'").setValue('John Smith')
browser.element("#settings .approve").click()
var editableName = browser.element('div#card-me .person-name')
browser.waitUntil(function () {
return browser.getText('div#card-me .person-name') === 'John Smith'
}, 500, 'expected name to update in card');
})


});
201 changes: 201 additions & 0 deletions wdio.conf.js
@@ -0,0 +1,201 @@
exports.config = {

//
// ==================
// Specify Test Files
// ==================
// Define which test specs should run. The pattern is relative to the directory
// from which `wdio` was called. Notice that, if you are calling `wdio` from an
// NPM script (see https://docs.npmjs.com/cli/run-script) then the current working
// directory is where your package.json resides, so `wdio` will be called from there.
//
specs: [
'./test/specs/**/*.js'
],
// Patterns to exclude.
exclude: [
// 'path/to/excluded/files'
],
//
// ============
// Capabilities
// ============
// Define your capabilities here. WebdriverIO can run multiple capabilities at the same
// time. Depending on the number of capabilities, WebdriverIO launches several test
// sessions. Within your capabilities you can overwrite the spec and exclude options in
// order to group specific specs to a specific capability.
//
// First, you can define how many instances should be started at the same time. Let's
// say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
// set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
// files and you set maxInstances to 10, all spec files will get tested at the same time
// and 30 processes will get spawned. The property handles how many capabilities
// from the same test should run tests.
//
maxInstances: 10,
//
// If you have trouble getting all important capabilities together, check out the
// Sauce Labs platform configurator - a great tool to configure your capabilities:
// https://docs.saucelabs.com/reference/platforms-configurator
//
capabilities: [{
// maxInstances can get overwritten per capability. So if you have an in-house Selenium
// grid with only 5 firefox instance available you can make sure that not more than
// 5 instance gets started at a time.
maxInstances: 5,
//
browserName: 'chrome',
chromeOptions: {
"args": [
"window-size=1366,768",
"no-proxy-server",
"no-default-browser-check",
"no-first-run",
"disable-boot-animation",
"disable-default-apps",
"disable-extensions",
"disable-translate",
"--use-fake-ui-for-media-stream",
"--use-fake-device-for-media-stream",
],
},
}],
//
// ===================
// Test Configurations
// ===================
// Define all options that are relevant for the WebdriverIO instance here
//
// By default WebdriverIO commands are executed in a synchronous way using
// the wdio-sync package. If you still want to run your tests in an async way
// e.g. using promises you can set the sync option to false.
sync: true,
//
// Level of logging verbosity: silent | verbose | command | data | result | error
logLevel: 'silent',
//
// Enables colors for log output.
coloredLogs: true,
//
// Saves a screenshot to a given path if a command fails.
screenshotPath: './errorShots/',
//
// Set a base URL in order to shorten url command calls. If your url parameter starts
// with "/", then the base url gets prepended.
baseUrl: 'http://127.0.0.1:9966',
//
// Default timeout for all waitFor* commands.
waitforTimeout: 10000,
//
// Default timeout in milliseconds for request
// if Selenium Grid doesn't send response
connectionRetryTimeout: 90000,
//
// Default request retries count
connectionRetryCount: 3,
//
// Initialize the browser instance with a WebdriverIO plugin. The object should have the
// plugin name as key and the desired plugin options as properties. Make sure you have
// the plugin installed before running any tests. The following plugins are currently
// available:
// WebdriverCSS: https://github.com/webdriverio/webdrivercss
// WebdriverRTC: https://github.com/webdriverio/webdriverrtc
// Browserevent: https://github.com/webdriverio/browserevent
// plugins: {
// webdrivercss: {
// screenshotRoot: 'my-shots',
// failedComparisonsRoot: 'diffs',
// misMatchTolerance: 0.05,
// screenWidth: [320,480,640,1024]
// },
// webdriverrtc: {},
// browserevent: {}
// },
//
// Test runner services
// Services take over a specific job you don't want to take care of. They enhance
// your test setup with almost no effort. Unlike plugins, they don't add new
// commands. Instead, they hook themselves up into the test process.
services: ['sauce','selenium-standalone'],
//
// Framework you want to run your specs with.
// The following are supported: Mocha, Jasmine, and Cucumber
// see also: http://webdriver.io/guide/testrunner/frameworks.html
//
// Make sure you have the wdio adapter package for the specific framework installed
// before running any tests.
framework: 'mocha',
//
// Test reporter for stdout.
// The only one supported by default is 'dot'
// see also: http://webdriver.io/guide/testrunner/reporters.html
reporters: ['spec'],

//
// Options to be passed to Mocha.
// See the full list at http://mochajs.org/
mochaOpts: {
ui: 'bdd'
},
//
// =====
// Hooks
// =====
// WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
// it and to build services around it. You can either apply a single function or an array of
// methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
// resolved to continue.
//
// Gets executed once before all workers get launched.
// onPrepare: function (config, capabilities) {
// },
//
// Gets executed before test execution begins. At this point you can access all global
// variables, such as `browser`. It is the perfect place to define custom commands.
// before: function (capabilities, specs) {
// },
//
// Hook that gets executed before the suite starts
// beforeSuite: function (suite) {
// },
//
// Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
// beforeEach in Mocha)
// beforeHook: function () {
// },
//
// Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
// afterEach in Mocha)
// afterHook: function () {
// },
//
// Function to be executed before a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
// beforeTest: function (test) {
// },
//
// Runs before a WebdriverIO command gets executed.
// beforeCommand: function (commandName, args) {
// },
//
// Runs after a WebdriverIO command gets executed
// afterCommand: function (commandName, args, result, error) {
// },
//
// Function to be executed after a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
// afterTest: function (test) {
// },
//
// Hook that gets executed after the suite has ended
// afterSuite: function (suite) {
// },
//
// Gets executed after all tests are done. You still have access to all global variables from
// the test.
// after: function (result, capabilities, specs) {
// },
//
// Gets executed after all workers got shut down and the process is about to exit. It is not
// possible to defer the end of the process using a promise.
// onComplete: function(exitCode) {
// }
}

0 comments on commit 0c0d114

Please sign in to comment.