Skip to content

Instantly share code, notes, and snippets.

@abelevtsov
Forked from barahilia/run-jasmine.js
Last active August 29, 2015 14:16
Show Gist options
  • Select an option

  • Save abelevtsov/057a4eeb05a73d233b50 to your computer and use it in GitHub Desktop.

Select an option

Save abelevtsov/057a4eeb05a73d233b50 to your computer and use it in GitHub Desktop.

Revisions

  1. @barahilia barahilia revised this gist Mar 20, 2014. 1 changed file with 7 additions and 7 deletions.
    14 changes: 7 additions & 7 deletions run-jasmine.js
    Original file line number Diff line number Diff line change
    @@ -107,27 +107,27 @@ page.open(system.args[1], function (status) {
    }, function () {
    var exitCode = page.evaluate(function () {
    var currentSuite;
    var successList = document.body.querySelectorAll('.results > .summary .specSummary.passed');
    var successList = document.body.querySelectorAll('.results > .summary .specs > .passed');
    var suites = {};
    if (successList && successList.length > 0) {
    for (var i = 0; i < successList.length; ++i) {
    var el = successList[i],
    name = el.children[0].title,
    suite = name.substring(0, name.indexOf(' '));
    name = el.children[0].innerText,
    suite = el.parentElement.parentElement.querySelector('.suite-detail').innerText;

    suites[suite] = suites[suite] || [];
    suites[suite].push({ status: 'success', name: name });
    }
    }

    var failedList = document.body.querySelectorAll('.results > #details > .specDetail.failed');
    var failedList = document.body.querySelectorAll('.results > .failures > .spec-detail.failed');
    if (failedList && failedList.length > 0) {
    console.log('');
    console.log(failedList.length + ' test(s) FAILED:');
    for (var i = 0; i < failedList.length; ++i) {
    var el = failedList[i],
    name = el.querySelector('.description').innerText,
    msg = el.querySelector('.resultMessage.fail').innerText,
    msg = el.querySelector('.result-message').innerText,
    suite = name.substring(0, name.indexOf(' '));

    // remove trailing period
    @@ -159,10 +159,10 @@ page.open(system.args[1], function (status) {
    console.log('TEAMCITY_SUITEFINISHED:' + JSON.stringify({ suite: suite }));
    }

    if (failedList && failedList.length > 0) {
    if (failedList && failedList.length > 0) {
    return 1;
    } else {
    console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
    console.log(document.body.querySelector('.alert > .bar.passed').innerText);
    return 0;
    }
    });
  2. @dlidstrom dlidstrom revised this gist Jan 20, 2014. 1 changed file with 94 additions and 92 deletions.
    186 changes: 94 additions & 92 deletions run-jasmine.js
    Original file line number Diff line number Diff line change
    @@ -17,26 +17,25 @@ function waitFor(testFx, onReady, timeOutMillis) {
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3001, //< Default Max Timeout is 3s
    start = new Date().getTime(),
    condition = false,
    interval = setInterval(function() {
    if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
    interval = setInterval(function () {
    if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
    // If not time-out yet and condition not yet fulfilled
    condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
    condition = (typeof (testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
    } else {
    if(!condition) {
    if (!condition) {
    // If condition still not fulfilled (timeout but condition is 'false')
    console.log("'waitFor()' timeout");
    phantom.exit(1);
    } else {
    // Condition fulfilled (timeout and/or condition is 'true')
    console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
    typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
    typeof (onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
    clearInterval(interval); //< Stop this interval
    }
    }
    }, 100); //< repeat check every 100ms
    };


    if (system.args.length !== 2) {
    console.log('Usage: run-jasmine.js URL');
    phantom.exit(1);
    @@ -55,114 +54,117 @@ var page = require('webpage').create();
    ##teamcity[testSuiteFinished name='suite.name']
    */
    // Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
    page.onConsoleMessage = function(msg) {
    var teamCityMessage = msg.indexOf('TEAMCITY_') === 0;
    if (teamCityMessage) {
    if (!env.hasOwnProperty('TEAMCITY_PROJECT_NAME')) return;
    var separatorIndex = msg.indexOf(':');
    var command = msg.substring(0, separatorIndex);
    var data = JSON.parse(msg.substring(separatorIndex + 1));
    switch (command) {
    case 'TEAMCITY_TESTSTARTED': {
    console.log("##teamcity[testStarted name='" + escape(data.name) + "']");
    break;
    }
    case 'TEAMCITY_TESTFINISHED': {
    console.log("##teamcity[testFinished name='" + escape(data.name) + "']");
    break;
    }
    case 'TEAMCITY_SUITESTARTED': {
    console.log("##teamcity[testSuiteStarted name='" + escape(data.suite) + "']");
    break;
    }
    case 'TEAMCITY_SUITEFINISHED': {
    console.log("##teamcity[testSuiteFinished name='" + escape(data.suite) + "']");
    break;
    }
    case 'TEAMCITY_TESTFAILED': {
    console.log("##teamcity[testFailed name='" + escape(data.name) + "' message='" + escape(data.message) + "']");
    break;
    }
    page.onConsoleMessage = function (msg) {
    var teamCityMessage = msg.indexOf('TEAMCITY_') === 0;
    if (teamCityMessage) {
    if (!env.hasOwnProperty('TEAMCITY_PROJECT_NAME')) return;
    var separatorIndex = msg.indexOf(':');
    var command = msg.substring(0, separatorIndex);
    var data = JSON.parse(msg.substring(separatorIndex + 1));
    switch (command) {
    case 'TEAMCITY_TESTSTARTED': {
    console.log("##teamcity[testStarted name='" + escape(data.name) + "']");
    break;
    }
    case 'TEAMCITY_TESTFINISHED': {
    console.log("##teamcity[testFinished name='" + escape(data.name) + "']");
    break;
    }
    case 'TEAMCITY_SUITESTARTED': {
    console.log("##teamcity[testSuiteStarted name='" + escape(data.suite) + "']");
    break;
    }
    case 'TEAMCITY_SUITEFINISHED': {
    console.log("##teamcity[testSuiteFinished name='" + escape(data.suite) + "']");
    break;
    }
    case 'TEAMCITY_TESTFAILED': {
    console.log("##teamcity[testFailed name='" + escape(data.name) + "' message='" + escape(data.message) + "']");
    break;
    }
    }
    }
    else {
    if (env.hasOwnProperty('TEAMCITY_PROJECT_NAME')) return;
    console.log(msg);
    }
    }
    else {
    if (env.hasOwnProperty('TEAMCITY_PROJECT_NAME')) return;
    console.log(msg);
    }

    function escape(message) {
    while (message.indexOf("'") >= 0) message = message.replace("'", '"');
    return message;
    }
    function escape(message) {
    while (message.indexOf("'") >= 0) message = message.replace("'", '"');
    return message;
    }
    };

    page.open(system.args[1], function(status){
    page.open(system.args[1], function (status) {
    if (status !== "success") {
    console.log("Unable to access network");
    phantom.exit();
    } else {
    waitFor(function(){
    return page.evaluate(function(){
    waitFor(function () {
    return page.evaluate(function () {
    return document.body.querySelector('.symbolSummary .pending') === null
    });
    }, function(){
    var exitCode = page.evaluate(function(){
    var currentSuite;
    var successList = document.body.querySelectorAll('.results > .summary .specSummary.passed');
    var suites = {};
    if (successList && successList.length > 0) {
    for (var i = 0; i < successList.length; ++i) {
    var el = successList[i],
    name = el.children[0].title,
    suite = name.substring(0, name.indexOf(' '));
    }, function () {
    var exitCode = page.evaluate(function () {
    var currentSuite;
    var successList = document.body.querySelectorAll('.results > .summary .specSummary.passed');
    var suites = {};
    if (successList && successList.length > 0) {
    for (var i = 0; i < successList.length; ++i) {
    var el = successList[i],
    name = el.children[0].title,
    suite = name.substring(0, name.indexOf(' '));

    suites[suite] = suites[suite] || [];
    suites[suite].push({ status: 'success', name: name });
    suites[suite] = suites[suite] || [];
    suites[suite].push({ status: 'success', name: name });
    }
    }
    }

    var failedList = document.body.querySelectorAll('.results > #details > .specDetail.failed');
    if (failedList && failedList.length > 0) {
    console.log('');
    console.log(failedList.length + ' test(s) FAILED:');
    for (var i = 0; i < failedList.length; ++i) {
    var el = failedList[i],
    name = el.querySelector('.description').innerText,
    msg = el.querySelector('.resultMessage.fail').innerText,
    suite = name.substring(0, name.indexOf(' '));
    var failedList = document.body.querySelectorAll('.results > #details > .specDetail.failed');
    if (failedList && failedList.length > 0) {
    console.log('');
    console.log(failedList.length + ' test(s) FAILED:');
    for (var i = 0; i < failedList.length; ++i) {
    var el = failedList[i],
    name = el.querySelector('.description').innerText,
    msg = el.querySelector('.resultMessage.fail').innerText,
    suite = name.substring(0, name.indexOf(' '));

    // remove trailing period
    name = name.substring(0, name.length - 1);
    // remove trailing period
    name = name.substring(0, name.length - 1);

    suites[suite] = suites[suite] || [];
    suites[suite].push({ suite: suite, status: 'failed', name: name, message: name + ': ' + msg });
    suites[suite] = suites[suite] || [];
    suites[suite].push({ suite: suite, status: 'failed', name: name, message: name + ': ' + msg });
    }
    }

    for (var suite in suites) {
    var tests = suites[suite];
    console.log('TEAMCITY_SUITESTARTED:' + JSON.stringify({ suite: suite }));
    for (var i in tests) {
    var test = tests[i];
    console.log('TEAMCITY_TESTSTARTED:' + JSON.stringify({ name: test.name }));
    if (test.status === 'success') {
    }
    else if (test.status === 'failed') {
    console.log('TEAMCITY_TESTFAILED:' + JSON.stringify({ name: test.name, message: test.message }));
    console.log('');
    console.log(test.suite);
    console.log(test.message);
    var tests = suites[suite];
    console.log('TEAMCITY_SUITESTARTED:' + JSON.stringify({ suite: suite }));
    for (var i in tests) {
    var test = tests[i];
    console.log('TEAMCITY_TESTSTARTED:' + JSON.stringify({ name: test.name }));
    if (test.status === 'success') {
    }
    else if (test.status === 'failed') {
    console.log('TEAMCITY_TESTFAILED:' + JSON.stringify({ name: test.name, message: test.message }));
    console.log('');
    console.log(test.suite);
    console.log(test.message);
    }

    console.log('TEAMCITY_TESTFINISHED:' + JSON.stringify({ name: test.name }));
    }

    console.log('TEAMCITY_TESTFINISHED:' + JSON.stringify({ name: test.name }));
    }
    console.log('TEAMCITY_SUITEFINISHED:' + JSON.stringify({ suite: suite }));
    }

    console.log('TEAMCITY_SUITEFINISHED:' + JSON.stringify({ suite: suite }));
    if (failedList && failedList.length > 0) {
    return 1;
    } else {
    console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
    return 0;
    }
    return 1;
    } else {
    console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
    return 0;
    }
    });
    phantom.exit(exitCode);
    });
  3. @dlidstrom dlidstrom revised this gist Jan 17, 2014. 1 changed file with 100 additions and 43 deletions.
    143 changes: 100 additions & 43 deletions run-jasmine.js
    Original file line number Diff line number Diff line change
    @@ -43,34 +43,57 @@ if (system.args.length !== 2) {
    }

    var page = require('webpage').create();
    var currentSuite;

    /**
    *
    ##teamcity[testSuiteStarted name='suite.name']
    ##teamcity[testSuiteStarted name='nested.suite']
    ##teamcity[testStarted name='package_or_namespace.ClassName.TestName']
    ##teamcity[testFailed name='package_or_namespace.ClassName.TestName' message='The number should be 20000' details='expected:<20000> but was:<10000>']
    ##teamcity[testFinished name='package_or_namespace.ClassName.TestName']
    ##teamcity[testSuiteFinished name='nested.suite']
    ##teamcity[testSuiteFinished name='suite.name']
    */
    // Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
    page.onConsoleMessage = function(msg, lineNum) {

    var log = function (s) {
    if (s.indexOf('|') < 0 && s.indexOf('TEAMCITY_SUITE_END') < 0)
    console.log(s);
    };
    var dividerIndex = msg.indexOf('|');
    if (env.hasOwnProperty('TEAMCITY_PROJECT_NAME') && dividerIndex >= 0) {
    log = function (s) {
    var suite = msg.substring(0, msg.indexOf(' ')).trim();
    var suiteEnd = msg.indexOf('TEAMCITY_SUITE_END') >= 0;
    var message = msg.substring(0, dividerIndex);
    var details = msg.substring(dividerIndex + 1);
    while (message.indexOf("'") >= 0) message = message.replace("'", '"');
    while (details.indexOf("'") >= 0) details = details.replace("'", '"');
    if (currentSuite && currentSuite !== suite || suiteEnd)
    console.log("##teamcity[testFinished name='" + currentSuite + "']");
    if ((!currentSuite || currentSuite !== suite) && !suiteEnd)
    console.log("##teamcity[testStarted name='" + suite + "']");
    if (!suiteEnd)
    console.log("##teamcity[testFailed name='" + suite + "' message='" + message + ' ' + details + "']");
    currentSuite = suite;
    };
    page.onConsoleMessage = function(msg) {
    var teamCityMessage = msg.indexOf('TEAMCITY_') === 0;
    if (teamCityMessage) {
    if (!env.hasOwnProperty('TEAMCITY_PROJECT_NAME')) return;
    var separatorIndex = msg.indexOf(':');
    var command = msg.substring(0, separatorIndex);
    var data = JSON.parse(msg.substring(separatorIndex + 1));
    switch (command) {
    case 'TEAMCITY_TESTSTARTED': {
    console.log("##teamcity[testStarted name='" + escape(data.name) + "']");
    break;
    }
    case 'TEAMCITY_TESTFINISHED': {
    console.log("##teamcity[testFinished name='" + escape(data.name) + "']");
    break;
    }
    case 'TEAMCITY_SUITESTARTED': {
    console.log("##teamcity[testSuiteStarted name='" + escape(data.suite) + "']");
    break;
    }
    case 'TEAMCITY_SUITEFINISHED': {
    console.log("##teamcity[testSuiteFinished name='" + escape(data.suite) + "']");
    break;
    }
    case 'TEAMCITY_TESTFAILED': {
    console.log("##teamcity[testFailed name='" + escape(data.name) + "' message='" + escape(data.message) + "']");
    break;
    }
    }
    }
    else {
    if (env.hasOwnProperty('TEAMCITY_PROJECT_NAME')) return;
    console.log(msg);
    }

    function escape(message) {
    while (message.indexOf("'") >= 0) message = message.replace("'", '"');
    return message;
    }
    log(msg);
    };

    page.open(system.args[1], function(status){
    @@ -84,28 +107,62 @@ page.open(system.args[1], function(status){
    });
    }, function(){
    var exitCode = page.evaluate(function(){
    var currentSuite;
    var successList = document.body.querySelectorAll('.results > .summary .specSummary.passed');
    var suites = {};
    if (successList && successList.length > 0) {
    for (var i = 0; i < successList.length; ++i) {
    var el = successList[i],
    name = el.children[0].title,
    suite = name.substring(0, name.indexOf(' '));

    suites[suite] = suites[suite] || [];
    suites[suite].push({ status: 'success', name: name });
    }
    }

    var failedList = document.body.querySelectorAll('.results > #details > .specDetail.failed');
    if (failedList && failedList.length > 0) {
    console.log('');
    console.log(document.body.querySelector('.description').innerText);
    var list = document.body.querySelectorAll('.results > #details > .specDetail.failed');
    if (list && list.length > 0) {
    console.log('');
    console.log(list.length + ' test(s) FAILED:');
    for (i = 0; i < list.length; ++i) {
    var el = list[i],
    desc = el.querySelector('.description'),
    msg = el.querySelector('.resultMessage.fail');
    console.log('');
    console.log(desc.innerText);
    console.log(msg.innerText);
    console.log(desc.innerText + '|' + msg.innerText);
    console.log(failedList.length + ' test(s) FAILED:');
    for (var i = 0; i < failedList.length; ++i) {
    var el = failedList[i],
    name = el.querySelector('.description').innerText,
    msg = el.querySelector('.resultMessage.fail').innerText,
    suite = name.substring(0, name.indexOf(' '));

    // remove trailing period
    name = name.substring(0, name.length - 1);

    suites[suite] = suites[suite] || [];
    suites[suite].push({ suite: suite, status: 'failed', name: name, message: name + ': ' + msg });
    }

    for (var suite in suites) {
    var tests = suites[suite];
    console.log('TEAMCITY_SUITESTARTED:' + JSON.stringify({ suite: suite }));
    for (var i in tests) {
    var test = tests[i];
    console.log('TEAMCITY_TESTSTARTED:' + JSON.stringify({ name: test.name }));
    if (test.status === 'success') {
    }
    else if (test.status === 'failed') {
    console.log('TEAMCITY_TESTFAILED:' + JSON.stringify({ name: test.name, message: test.message }));
    console.log('');
    console.log(test.suite);
    console.log(test.message);
    }

    console.log('TEAMCITY_TESTFINISHED:' + JSON.stringify({ name: test.name }));
    }
    console.log('TEAMCITY_SUITE_END|')
    return 1;
    } else {
    console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
    return 0;

    console.log('TEAMCITY_SUITEFINISHED:' + JSON.stringify({ suite: suite }));
    }
    return 1;
    } else {
    console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
    return 0;
    }
    });
    phantom.exit(exitCode);
    });
  4. @dlidstrom dlidstrom created this gist Jan 15, 2014.
    113 changes: 113 additions & 0 deletions run-jasmine.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,113 @@
    var system = require('system'),
    env = system.env;

    /**
    * Wait until the test condition is true or a timeout occurs. Useful for waiting
    * on a server response or for a ui change (fadeIn, etc.) to occur.
    *
    * @param testFx javascript condition that evaluates to a boolean,
    * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
    * as a callback function.
    * @param onReady what to do when testFx condition is fulfilled,
    * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
    * as a callback function.
    * @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
    */
    function waitFor(testFx, onReady, timeOutMillis) {
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3001, //< Default Max Timeout is 3s
    start = new Date().getTime(),
    condition = false,
    interval = setInterval(function() {
    if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
    // If not time-out yet and condition not yet fulfilled
    condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
    } else {
    if(!condition) {
    // If condition still not fulfilled (timeout but condition is 'false')
    console.log("'waitFor()' timeout");
    phantom.exit(1);
    } else {
    // Condition fulfilled (timeout and/or condition is 'true')
    console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
    typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
    clearInterval(interval); //< Stop this interval
    }
    }
    }, 100); //< repeat check every 100ms
    };


    if (system.args.length !== 2) {
    console.log('Usage: run-jasmine.js URL');
    phantom.exit(1);
    }

    var page = require('webpage').create();
    var currentSuite;

    // Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
    page.onConsoleMessage = function(msg, lineNum) {

    var log = function (s) {
    if (s.indexOf('|') < 0 && s.indexOf('TEAMCITY_SUITE_END') < 0)
    console.log(s);
    };
    var dividerIndex = msg.indexOf('|');
    if (env.hasOwnProperty('TEAMCITY_PROJECT_NAME') && dividerIndex >= 0) {
    log = function (s) {
    var suite = msg.substring(0, msg.indexOf(' ')).trim();
    var suiteEnd = msg.indexOf('TEAMCITY_SUITE_END') >= 0;
    var message = msg.substring(0, dividerIndex);
    var details = msg.substring(dividerIndex + 1);
    while (message.indexOf("'") >= 0) message = message.replace("'", '"');
    while (details.indexOf("'") >= 0) details = details.replace("'", '"');
    if (currentSuite && currentSuite !== suite || suiteEnd)
    console.log("##teamcity[testFinished name='" + currentSuite + "']");
    if ((!currentSuite || currentSuite !== suite) && !suiteEnd)
    console.log("##teamcity[testStarted name='" + suite + "']");
    if (!suiteEnd)
    console.log("##teamcity[testFailed name='" + suite + "' message='" + message + ' ' + details + "']");
    currentSuite = suite;
    };
    }
    log(msg);
    };

    page.open(system.args[1], function(status){
    if (status !== "success") {
    console.log("Unable to access network");
    phantom.exit();
    } else {
    waitFor(function(){
    return page.evaluate(function(){
    return document.body.querySelector('.symbolSummary .pending') === null
    });
    }, function(){
    var exitCode = page.evaluate(function(){
    console.log('');
    console.log(document.body.querySelector('.description').innerText);
    var list = document.body.querySelectorAll('.results > #details > .specDetail.failed');
    if (list && list.length > 0) {
    console.log('');
    console.log(list.length + ' test(s) FAILED:');
    for (i = 0; i < list.length; ++i) {
    var el = list[i],
    desc = el.querySelector('.description'),
    msg = el.querySelector('.resultMessage.fail');
    console.log('');
    console.log(desc.innerText);
    console.log(msg.innerText);
    console.log(desc.innerText + '|' + msg.innerText);
    console.log('');
    }
    console.log('TEAMCITY_SUITE_END|')
    return 1;
    } else {
    console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
    return 0;
    }
    });
    phantom.exit(exitCode);
    });
    }
    });