blob: 55e2beba5c0ccb6e93e4c0bf5059cecaca6d0919 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>action_test.html</title>
<link rel="stylesheet" href="/filez/_main/third_party/js/qunit/qunit.css">
<script src="/filez/_main/third_party/js/qunit/qunit.js"></script>
<script src="/filez/_main/third_party/js/qunit/qunit_test_runner.js"></script>
<script src="test_bootstrap.js"></script>
<script type="text/javascript">
goog.require('bot.action');
goog.require('bot.locators');
goog.require('goog.Promise');
goog.require('goog.Uri');
goog.require('goog.dom');
goog.require('goog.dom.forms');
goog.require('goog.events');
goog.require('goog.events.EventType');
</script>
<script type="text/javascript">
var submitted = goog.nullFunction;
var counts;
var listeningTo;
var CONTENT_EDITABLE_HTML = 'This is a contentEditable area\n <div id="child-content-editable">child content editable\n </div>\n ';
QUnit.testStart(function() {
counts = {};
listeningTo = [];
});
QUnit.testDone(function() {
while (listeningTo.length) {
goog.events.removeAll(listeningTo.shift());
}
submitted = goog.nullFunction;
// Restore contentEditable area after tests that clear it
var contentEditable = goog.dom.getElement('content-editable');
if (contentEditable) {
contentEditable.innerHTML = CONTENT_EDITABLE_HTML;
}
});
function expectAndCancelEvent(eventType, expectedTarget, assert) {
counts[eventType] = 0;
listeningTo.push(expectedTarget);
goog.events.listen(expectedTarget, eventType,
function(e) {
assert.strictEqual(e.target, expectedTarget,
'Not the expected ' + eventType + ' event target');
e.stopPropagation();
e.preventDefault();
counts[eventType] += 1;
});
}
function expectEvent(eventType, expectedTarget, assert) {
counts[eventType] = 0;
listeningTo.push(expectedTarget);
goog.events.listen(expectedTarget, eventType,
function(e) {
assert.strictEqual(e.target, expectedTarget,
'Not the expected ' + eventType + ' event target');
counts[eventType] += 1;
});
}
function expectBlurEvent(expectedTarget, assert) {
expectEvent(goog.events.EventType.BLUR, expectedTarget, assert);
}
function expectChangeEvent(expectedTarget, assert) {
expectEvent(goog.events.EventType.CHANGE, expectedTarget, assert);
}
function expectSubmitEvent(expectedTarget, assert) {
expectEvent(goog.events.EventType.SUBMIT, expectedTarget, assert);
}
function assertEventFired(assert, eventType, opt_count) {
var count = opt_count || 1;
assert.strictEqual(counts[eventType], count,
eventType + ' event not fired expected # of times!');
}
function assertBlurFired(assert) {
assertEventFired(assert, goog.events.EventType.BLUR);
}
function assertChangeFired(assert) {
assertEventFired(assert, goog.events.EventType.CHANGE);
}
function assertSubmitFired(assert) {
assertEventFired(assert, goog.events.EventType.SUBMIT);
}
function doNotExpectEvent(eventType, expectedTarget, assert) {
listeningTo.push(expectedTarget);
goog.events.listen(expectedTarget, eventType, function() {
assert.ok(false, 'Was not expecting a ' + eventType + ' event to be fired');
});
}
function doNotExpectChangeEvent(expectedTarget, assert) {
doNotExpectEvent(goog.events.EventType.CHANGE, expectedTarget, assert);
}
function doNotExpectSubmitEvent(expectedTarget, assert) {
doNotExpectEvent(goog.events.EventType.SUBMIT, expectedTarget, assert);
}
QUnit.test('clearing a non textual element throws', function(assert) {
assert.throws(function() { bot.action.clear(document.body); });
});
function forEachClearableElement(fn) {
var ids = ['textField', 'textArea', 'passwordField'];
for (var i = 0; i < ids.length; i++) {
fn(goog.dom.$(ids[i]));
}
}
QUnit.test('clearing an empty element should no op', function(assert) {
forEachClearableElement(function(e) {
e.value = '';
e.disabled = false;
e.readOnly = false;
doNotExpectChangeEvent(e, assert);
bot.action.clear(e);
assert.strictEqual(e.value, '');
});
});
QUnit.test('clearing a non empty element', function(assert) {
forEachClearableElement(function(e) {
e.value = 'foobar';
e.disabled = false;
e.readOnly = false;
expectBlurEvent(e, assert);
expectChangeEvent(e, assert);
bot.action.clear(e);
if (goog.userAgent.IE) {
assertBlurFired(assert);
}
assertChangeFired(assert);
assert.strictEqual(e.value, '');
});
});
QUnit.test('clearing a disabled element throws', function(assert) {
forEachClearableElement(function(e) {
e.value = 'foobar';
e.disabled = true;
e.readOnly = false;
doNotExpectChangeEvent(e, assert);
assert.throws(function() { bot.action.clear(e); });
assert.strictEqual(e.value, 'foobar');
e.value = '';
doNotExpectChangeEvent(e, assert);
assert.throws(function() { bot.action.clear(e); });
});
});
QUnit.test('clearing a read only element throws', function(assert) {
forEachClearableElement(function(e) {
e.value = 'foobar';
e.disabled = false;
e.readOnly = true;
doNotExpectChangeEvent(e, assert);
assert.throws(function() { bot.action.clear(e); });
assert.strictEqual(e.value, 'foobar');
e.value = '';
doNotExpectChangeEvent(e, assert);
assert.throws(function() { bot.action.clear(e); });
});
});
QUnit.test('clearing a content editable area', function(assert) {
var e = goog.dom.getElement('content-editable');
bot.action.clear(e);
assert.strictEqual(bot.dom.getVisibleText(e), '');
});
QUnit.test('clearing a child content editable area', function(assert) {
var e = goog.dom.getElement('child-content-editable');
bot.action.clear(e);
assert.strictEqual(bot.dom.getVisibleText(e), '');
});
QUnit.test('clearing a not content editable area', function(assert) {
var e = goog.dom.getElement('not-content-editable');
assert.throws(function() { bot.action.clear(e); });
});
QUnit.test('clearing a child not content editable area', function(assert) {
var e = goog.dom.getElement('child-not-content-editable');
assert.throws(function() { bot.action.clear(e); });
});
QUnit.test('clearing a file input should be no op', function(assert) {
var e = goog.dom.getElement('fileField');
doNotExpectChangeEvent(e, assert);
bot.action.clear(e);
assert.strictEqual(e.value, '');
});
QUnit.test('clearing number input with invalid data', function(assert) {
var e = goog.dom.getElement('numberField');
bot.action.type(e, "e");
bot.action.clear(e);
bot.action.type(e, "3");
assert.strictEqual(goog.dom.forms.getValue(e), "3");
});
QUnit.test('clearing a iframe content editable area', function(assert) {
var iframe = goog.dom.getElement('iframe');
var iframeDoc = goog.dom.getFrameContentDocument(iframe);
var e = bot.locators.findElement({ id: 'content-editable' }, iframeDoc);
bot.action.clear(e);
assert.strictEqual(bot.dom.getVisibleText(e), '');
});
QUnit.test('submitting a non form element should result in an error', function(assert) {
assert.throws(function() { bot.action.submit(document.body); });
});
QUnit.test('should not submit if submit event is cancelled', function(assert) {
var form = goog.dom.$('form_one');
expectAndCancelEvent(goog.events.EventType.SUBMIT, form, assert);
var wasSubmitted = false;
goog.global.submitted = function() {
wasSubmitted = true;
};
bot.action.submit(form);
assertSubmitFired(assert);
assert.notOk(wasSubmitted);
});
QUnit.test('should submit if submit event is not cancelled', function(assert) {
var form = goog.dom.$('form_one');
expectSubmitEvent(form, assert);
var done = assert.async();
goog.global.submitted = function() {
assertSubmitFired(assert);
done();
};
bot.action.submit(form);
});
QUnit.test('should be able to submit from any element that is a child of the form', function(assert) {
var form = goog.dom.$('form_one');
expectSubmitEvent(form, assert);
var done = assert.async();
goog.global.submitted = function() {
assertSubmitFired(assert);
done();
};
bot.action.submit(goog.dom.$('typer'));
});
QUnit.test('should be able to submit from a form with an element named submit', function(assert) {
var form = goog.dom.getElement('form_two');
var submitButton = goog.dom.getElement('submit');
expectSubmitEvent(form, assert);
var done = assert.async();
goog.global.submitted = function() {
assertSubmitFired(assert);
assert.strictEqual(submitButton.id, 'submit');
assert.strictEqual(submitButton.name, 'submit');
done();
};
bot.action.submit(goog.dom.getElement('typer2'));
});
</script>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<form id="form_one" action="javascript:submitted()">
<label for="typer">Type here: </label><input type="text" id="typer"/>
<input type="submit" id="submit-button" value="Submit!"/>
</form>
<form id="form_two" action="javascript:submitted()">
<label for="typer2">Type here: </label><input type="text" id="typer2"/>
<input type="submit" id="submit" name="submit" value="Submit!"/>
</form>
<form action="javascript:void(0)">
<div>
<label for="textField">Text field</label>
<input type="text" id="textField"/>
</div>
<div>
<label for="textArea">Text area</label>
<textarea id="textArea"></textarea>
</div>
<label for="passwordField">Password field</label>
<input type="password" id="passwordField">
</div>
</div>
<label for="fileField">File field</label>
<input type="file" id="fileField">
</div>
<div>
<label for="numberField">Number field</label>
<input type="number" id="numberField">
</div>
</form>
<div id="log">
</div>
<div id="content-editable" contentEditable="true">This is a contentEditable area
<div id="child-content-editable">child content editable
</div>
</div>
<div id="not-content-editable" contentEditable="false">This is not a contentEditable area
<div id="child-not-content-editable">child not content editable
</div>
</div>
<iframe id="iframe" src="testdata/trusted_types_iframe.html">
</iframe>
</body>
</html>