ensure a spec can't leave the page, causing a craaaazy loop
This commit is contained in:
parent
fe18d2a3fd
commit
13bcd5226e
@ -35,6 +35,9 @@
|
||||
class HeadlessSpecRunnerPage: public QWebPage
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
HeadlessSpecRunnerPage();
|
||||
void oneFalseConfirm();
|
||||
signals:
|
||||
void consoleLog(const QString &msg, int lineNumber, const QString &sourceID);
|
||||
void internalLog(const QString ¬e, const QString &msg);
|
||||
@ -42,8 +45,17 @@ protected:
|
||||
void javaScriptConsoleMessage(const QString & message, int lineNumber, const QString & sourceID);
|
||||
bool javaScriptConfirm(QWebFrame *frame, const QString &msg);
|
||||
void javaScriptAlert(QWebFrame *frame, const QString &msg);
|
||||
private:
|
||||
bool confirmResult;
|
||||
};
|
||||
|
||||
HeadlessSpecRunnerPage::HeadlessSpecRunnerPage()
|
||||
: QWebPage()
|
||||
, confirmResult(true)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void HeadlessSpecRunnerPage::javaScriptConsoleMessage(const QString &message, int lineNumber, const QString &sourceID)
|
||||
{
|
||||
emit consoleLog(message, lineNumber, sourceID);
|
||||
@ -51,8 +63,13 @@ void HeadlessSpecRunnerPage::javaScriptConsoleMessage(const QString &message, in
|
||||
|
||||
bool HeadlessSpecRunnerPage::javaScriptConfirm(QWebFrame *frame, const QString &msg)
|
||||
{
|
||||
emit internalLog("TODO", "jasmine-headless-webkit can't handle confirm() yet! You should mock window.confirm for now. Returning true.");
|
||||
return true;
|
||||
if (confirmResult) {
|
||||
emit internalLog("TODO", "jasmine-headless-webkit can't handle confirm() yet! You should mock window.confirm for now. Returning true.");
|
||||
return true;
|
||||
} else {
|
||||
confirmResult = true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void HeadlessSpecRunnerPage::javaScriptAlert(QWebFrame *frame, const QString &msg)
|
||||
@ -60,6 +77,11 @@ void HeadlessSpecRunnerPage::javaScriptAlert(QWebFrame *frame, const QString &ms
|
||||
emit internalLog("alert", msg);
|
||||
}
|
||||
|
||||
void HeadlessSpecRunnerPage::oneFalseConfirm()
|
||||
{
|
||||
confirmResult = false;
|
||||
}
|
||||
|
||||
class HeadlessSpecRunner: public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -71,6 +93,7 @@ public:
|
||||
void go();
|
||||
public slots:
|
||||
void log(const QString &msg);
|
||||
void leavePageAttempt(const QString &msg);
|
||||
void specPassed();
|
||||
void specFailed(const QString &specDetail);
|
||||
void printName(const QString &name);
|
||||
@ -250,6 +273,16 @@ void HeadlessSpecRunner::log(const QString &msg)
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
void HeadlessSpecRunner::leavePageAttempt(const QString &msg)
|
||||
{
|
||||
red();
|
||||
std::cout << "[error] ";
|
||||
clear();
|
||||
std::cout << qPrintable(msg) << std::endl;
|
||||
m_page.oneFalseConfirm();
|
||||
hasErrors = true;
|
||||
}
|
||||
|
||||
void HeadlessSpecRunner::printName(const QString &name)
|
||||
{
|
||||
std::cout << std::endl << std::endl;
|
||||
|
@ -50,7 +50,7 @@ jasmine.Spec.prototype.getSpecSplitName = ->
|
||||
parts
|
||||
|
||||
class jasmine.HeadlessReporter
|
||||
constructor: ->
|
||||
constructor: (@callback = null) ->
|
||||
@results = []
|
||||
@failedCount = 0
|
||||
@length = 0
|
||||
@ -59,6 +59,7 @@ class jasmine.HeadlessReporter
|
||||
do (result) =>
|
||||
result.print()
|
||||
|
||||
this.callback() if @callback
|
||||
JHW.finishSuite((new Date() - @startTime) / 1000.0, @length, @failedCount)
|
||||
reportRunnerStarting: (runner) ->
|
||||
@startTime = new Date()
|
||||
|
@ -83,7 +83,8 @@
|
||||
return parts;
|
||||
};
|
||||
jasmine.HeadlessReporter = (function() {
|
||||
function HeadlessReporter() {
|
||||
function HeadlessReporter(callback) {
|
||||
this.callback = callback != null ? callback : null;
|
||||
this.results = [];
|
||||
this.failedCount = 0;
|
||||
this.length = 0;
|
||||
@ -98,6 +99,9 @@
|
||||
result = _ref[_i];
|
||||
_fn(result);
|
||||
}
|
||||
if (this.callback) {
|
||||
this.callback();
|
||||
}
|
||||
return JHW.finishSuite((new Date() - this.startTime) / 1000.0, this.length, this.failedCount);
|
||||
};
|
||||
HeadlessReporter.prototype.reportRunnerStarting = function(runner) {
|
||||
|
@ -31,6 +31,16 @@ module Jasmine
|
||||
}, pp: function(data) {
|
||||
JHW.log(jasmine ? jasmine.pp(data) : JSON.stringify(data));
|
||||
} };
|
||||
|
||||
window.onbeforeunload = function(e) {
|
||||
JHW.leavePageAttempt('The code tried to leave the test page. Check for unhandled form submits and link clicks.');
|
||||
|
||||
if (e = e || window.event) {
|
||||
e.returnValue = "leaving";
|
||||
}
|
||||
|
||||
return "leaving";
|
||||
};
|
||||
</script>
|
||||
#{files.join("\n")}
|
||||
<script type="text/javascript">
|
||||
@ -40,7 +50,9 @@ HeadlessReporterResult.specLineNumbers = #{MultiJson.encode(spec_lines)};
|
||||
<body>
|
||||
|
||||
<script type="text/javascript">
|
||||
jasmine.getEnv().addReporter(new jasmine.HeadlessReporter());
|
||||
jasmine.getEnv().addReporter(new jasmine.HeadlessReporter(function() {
|
||||
window.onbeforeunload = null;
|
||||
}));
|
||||
jasmine.getEnv().execute();
|
||||
</script>
|
||||
|
||||
|
@ -60,6 +60,15 @@ describe "jasmine-headless-webkit" do
|
||||
end
|
||||
end
|
||||
|
||||
describe 'tries to leave page' do
|
||||
it "should not leave the page nor loop" do
|
||||
system %{bin/jasmine-headless-webkit -j spec/jasmine/leave_page/leave_page.yml --report #{report}}
|
||||
$?.exitstatus.should == 1
|
||||
|
||||
report.should be_a_report_containing(2, 0, false)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'with filtered run' do
|
||||
context "don't run a full run, just the filtered run" do
|
||||
it "should succeed and run both" do
|
||||
|
4
spec/jasmine/leave_page/leave_page.js
Normal file
4
spec/jasmine/leave_page/leave_page.js
Normal file
@ -0,0 +1,4 @@
|
||||
function yes() {
|
||||
document.location.href = 'http://www.google.com/'
|
||||
}
|
||||
|
9
spec/jasmine/leave_page/leave_page.yml
Normal file
9
spec/jasmine/leave_page/leave_page.yml
Normal file
@ -0,0 +1,9 @@
|
||||
src_files:
|
||||
- spec/jasmine/leave_page/leave_page.js
|
||||
|
||||
spec_files:
|
||||
- spec/jasmine/leave_page/leave_page_spec.js
|
||||
|
||||
src_dir: .
|
||||
spec_dir: .
|
||||
|
11
spec/jasmine/leave_page/leave_page_spec.js
Normal file
11
spec/jasmine/leave_page/leave_page_spec.js
Normal file
@ -0,0 +1,11 @@
|
||||
describe("something", function() {
|
||||
it("should be true", function() {
|
||||
yes();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
it("should so something else", function() {
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user