| <!DOCTYPE html> |
| <!-- |
| Copyright 2010 WebDriver committers |
| Copyright 2010 Google Inc. |
| |
| 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. |
| --> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <title>Unit Tests for bot.inject</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.Error'); |
| goog.require('bot.ErrorCode'); |
| goog.require('bot.inject'); |
| goog.require('bot.inject.cache'); |
| goog.require('bot.json'); |
| goog.require('bot.userAgent'); |
| goog.require('goog.Promise'); |
| goog.require('goog.dom'); |
| goog.require('goog.events'); |
| goog.require('goog.userAgent'); |
| goog.require('goog.userAgent.product'); |
| </script> |
| </head> |
| <body> |
| <div id="qunit"></div> |
| <div id="qunit-fixture"></div> |
| <div style="display:none"> |
| <iframe id="test-frame" src="testdata/blank_page.html"></iframe> |
| </div> |
| <script type="text/javascript"> |
| goog.global.MY_GLOBAL_CONSTANT = 123; |
| |
| var frame, frameWin, frameDoc; |
| |
| QUnit.testStart(function() { |
| frame = goog.dom.$('test-frame'); |
| frameWin = goog.dom.getFrameContentWindow(frame); |
| frameDoc = goog.dom.getFrameContentDocument(frame); |
| |
| document[bot.inject.cache.CACHE_KEY_] = null; |
| frameDoc[bot.inject.cache.CACHE_KEY_] = null; |
| }); |
| |
| QUnit.test('AddWindowToCache', function(assert) { |
| var id = bot.inject.cache.addElement(frameWin); |
| assert.strictEqual(bot.inject.cache.getElement(id), frameWin); |
| }); |
| |
| |
| QUnit.test('AddWindowToCacheMultipleTimesReusesIds', function(assert) { |
| var id1 = bot.inject.cache.addElement(frameWin); |
| var id2 = bot.inject.cache.addElement(frameWin); |
| assert.strictEqual(id2, id1); |
| }); |
| |
| |
| QUnit.test('GetElementThrowsIfWindowIsClosed', function(assert) { |
| var win = {document: 1, closed: 1}; |
| var id = bot.inject.cache.addElement(win); |
| assert.throws(function() { bot.inject.cache.getElement(id); }); |
| }); |
| |
| |
| QUnit.test('ShouldWrapAndUnwrapWindow', function(assert) { |
| var wrapped = bot.inject.wrapValue(frameWin); |
| assert.ok(wrapped !== null); |
| assert.ok(wrapped !== undefined); |
| assert.ok(goog.isObject(wrapped)); |
| assert.ok(goog.object.containsKey(wrapped, bot.inject.WINDOW_KEY)); |
| |
| var id = wrapped[bot.inject.WINDOW_KEY]; |
| var res = bot.inject.cache.getElement(id); |
| assert.strictEqual(res, frameWin); |
| assert.strictEqual(bot.inject.unwrapValue(wrapped), frameWin); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToCacheElements', function(assert) { |
| var id = bot.inject.cache.addElement(document.body); |
| var el = bot.inject.cache.getElement(id); |
| assert.strictEqual(el, document.body); |
| }); |
| |
| |
| QUnit.test('ShouldReuseExistingIdIfElementAlreadyExistsInTheCache', function(assert) { |
| var id1 = bot.inject.cache.addElement(document.body); |
| var id2 = bot.inject.cache.addElement(document.body); |
| assert.strictEqual(id2, id1); |
| }); |
| |
| |
| QUnit.test('ShouldThrowIfElementDoesNotExistInTheCache', function(assert) { |
| assert.throws(function() { bot.inject.cache.getElement('not-there'); }); |
| }); |
| |
| |
| QUnit.test('ShouldDecodeIdsWhenRetrievingFromTheCache', function(assert) { |
| var id = bot.inject.cache.addElement(document.body); |
| id = encodeURIComponent(id); |
| var el = bot.inject.cache.getElement(id); |
| assert.strictEqual(el, document.body); |
| }); |
| |
| |
| QUnit.test('ShouldThrowIfCachedElementIsNoLongerAttachedToTheDom', function(assert) { |
| if (goog.userAgent.IE) { |
| assert.ok(true, 'Skipping: TODO fix for IE'); |
| return; |
| } |
| var div = document.createElement('DIV'); |
| document.body.appendChild(div); |
| |
| var id = bot.inject.cache.addElement(div); |
| assert.strictEqual(bot.inject.cache.getElement(id), div); |
| |
| document.body.removeChild(div); |
| assert.throws(function() { bot.inject.cache.getElement(id); }); |
| }); |
| |
| |
| QUnit.test('DoesNotWrapStringBooleansNumbersOrNull', function(assert) { |
| assert.strictEqual(bot.inject.wrapValue('foo'), 'foo'); |
| assert.strictEqual(bot.inject.wrapValue(123), 123); |
| assert.ok(bot.inject.wrapValue(true)); |
| assert.strictEqual(bot.inject.wrapValue(null), null); |
| }); |
| |
| |
| QUnit.test('ConvertsUndefinedValueToNullForWrapping', function(assert) { |
| assert.strictEqual(bot.inject.wrapValue(undefined), null); |
| }); |
| |
| |
| QUnit.test('ShouldAddElementsToCacheWhenWrapping', function(assert) { |
| var wrapped = bot.inject.wrapValue(document.body); |
| assert.ok(wrapped !== null); |
| assert.ok(wrapped !== undefined); |
| assert.ok(goog.isObject(wrapped)); |
| assert.ok(goog.object.containsKey(wrapped, bot.inject.ELEMENT_KEY)); |
| |
| var id = wrapped[bot.inject.ELEMENT_KEY]; |
| var el = bot.inject.cache.getElement(id); |
| assert.strictEqual(el, document.body); |
| }); |
| |
| |
| QUnit.test('ShouldRecursivelyWrapArrays', function(assert) { |
| var unwrapped = [123, 'abc', null, document.body]; |
| var wrapped = bot.inject.wrapValue(unwrapped); |
| |
| assert.strictEqual(wrapped.length, unwrapped.length); |
| assert.strictEqual(wrapped[0], unwrapped[0]); |
| assert.strictEqual(wrapped[1], unwrapped[1]); |
| assert.strictEqual(wrapped[2], unwrapped[2]); |
| |
| assert.ok(goog.object.containsKey(wrapped[3], bot.inject.ELEMENT_KEY)); |
| assert.strictEqual(bot.inject.cache.getElement( |
| wrapped[3][bot.inject.ELEMENT_KEY]), unwrapped[3]); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToWrapNodeListsAsArrays', function(assert) { |
| var unwrapped = document.getElementsByTagName('body'); |
| var wrapped = bot.inject.wrapValue(unwrapped); |
| |
| assert.ok(Array.isArray(wrapped), 'should return an array, but was ' + goog.typeOf(wrapped)); |
| assert.strictEqual(wrapped.length, unwrapped.length); |
| assert.ok(goog.object.containsKey(wrapped[0], bot.inject.ELEMENT_KEY)); |
| assert.strictEqual(bot.inject.cache.getElement( |
| wrapped[0][bot.inject.ELEMENT_KEY]), document.body); |
| }); |
| |
| |
| QUnit.test('ShouldThrowWhenWrappingRecursiveStructure', function(assert) { |
| var obj1 = {}; |
| var obj2 = {}; |
| obj1['obj2'] = obj2; |
| obj2['obj1'] = obj1; |
| assert.throws(function() { bot.inject.wrapValue(obj1); }); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToUnWrapWrappedValues', function(assert) { |
| var unwrapped = [123, 'abc', null, document.body]; |
| var wrapped = bot.inject.wrapValue(unwrapped); |
| var roundTripped = bot.inject.unwrapValue(wrapped); |
| assert.deepEqual(roundTripped, unwrapped); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToUnWrapNestedArrays', function(assert) { |
| var unwrapped = [123, 'abc', null, [document.body, null, |
| [document.body]]]; |
| var wrapped = bot.inject.wrapValue(unwrapped); |
| var roundTripped = bot.inject.unwrapValue(wrapped); |
| assert.deepEqual(roundTripped, unwrapped); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToUnWrapNestedObjects', function(assert) { |
| var unwrapped = {'foo': {'bar': document.body}}; |
| var wrapped = bot.inject.wrapValue(unwrapped); |
| var roundTripped = bot.inject.unwrapValue(wrapped); |
| |
| assert.ok(goog.object.containsKey(roundTripped, 'foo')); |
| var foo = roundTripped['foo']; |
| |
| assert.ok(goog.object.containsKey(foo, 'bar')); |
| assert.strictEqual(foo['bar'], document.body); |
| }); |
| |
| |
| QUnit.test('ShouldUnWrapElementsUsingTheGivenDocumentsCache', function(assert) { |
| var wrapped = bot.inject.wrapValue(frameDoc.body); |
| assert.ok(wrapped !== null); |
| assert.ok(wrapped !== undefined); |
| assert.ok(goog.isObject(wrapped)); |
| assert.ok(goog.object.containsKey(wrapped, bot.inject.ELEMENT_KEY)); |
| |
| assert.throws(function() { bot.inject.unwrapValue(wrapped); }); |
| |
| var unwrapped = bot.inject.unwrapValue(wrapped, frameDoc); |
| assert.strictEqual(unwrapped, frameDoc.body); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToUnwrapArgumentsExecuteScriptAndWrapResult', function(assert) { |
| var id = bot.inject.cache.addElement(document.body); |
| var args = [{}]; |
| args[0][bot.inject.ELEMENT_KEY] = id; |
| var result = bot.inject.executeScript( |
| function() { return arguments[0]; }, args); |
| |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| |
| assert.ok(goog.object.containsKey(result, 'value')); |
| assert.ok(goog.object.containsKey(result['value'], |
| bot.inject.ELEMENT_KEY)); |
| assert.strictEqual(bot.inject.cache.getElement( |
| result['value'][bot.inject.ELEMENT_KEY]), document.body); |
| }); |
| |
| |
| QUnit.test('ShouldTrapAndReturnWrappedErrorsFromInjectedScripts', function(assert) { |
| var result = bot.inject.executeScript( |
| function() { throw Error('ouch'); }, []); |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.ok(goog.object.containsKey(result, 'value')); |
| |
| assert.strictEqual(result['status'], bot.ErrorCode.UNKNOWN_ERROR); |
| result = result['value']; |
| assert.ok(goog.object.containsKey(result, 'message')); |
| assert.strictEqual(result['message'], 'ouch'); |
| }); |
| |
| |
| QUnit.test('ShouldResetCacheWhenPageIsRefreshed', function(assert) { |
| var done = assert.async(); |
| var id = bot.inject.cache.addElement(frameDoc.body); |
| assert.strictEqual(bot.inject.cache.getElement(id, frameDoc), frameDoc.body); |
| |
| goog.events.listenOnce(frame, 'load', function() { |
| frameDoc = goog.dom.getFrameContentDocument(frame); |
| assert.throws(function() { bot.inject.cache.getElement(id, frameDoc); }); |
| done(); |
| }); |
| frameWin.location.reload(); |
| }); |
| |
| |
| QUnit.test('ShouldStringifyResultsWhenAskedToDoSo', function(assert) { |
| var result = bot.inject.executeScript(function() { |
| return arguments[0] + arguments[1]; |
| }, ['abc', 123], true); |
| |
| assert.strictEqual(goog.typeOf(result), 'string'); |
| var json = bot.json.parse(result); |
| assert.ok('status' in json, 'No status: ' + result); |
| assert.ok('value' in json, 'No value: ' + result); |
| assert.strictEqual(json['status'], 0); |
| assert.strictEqual(json['value'], 'abc123'); |
| }); |
| |
| |
| QUnit.test('ShouldStringifyErrorsWhenAskedForStringResults', function(assert) { |
| var result = bot.inject.executeScript(function() { |
| throw new bot.Error(bot.ErrorCode.NO_SUCH_ELEMENT, 'ouch'); |
| }, [], true); |
| |
| assert.strictEqual(goog.typeOf(result), 'string'); |
| var json = bot.json.parse(result); |
| assert.ok('status' in json, 'No status: ' + result); |
| assert.ok('value' in json, 'No value: ' + result); |
| assert.strictEqual(json['status'], bot.ErrorCode.NO_SUCH_ELEMENT); |
| assert.ok('message' in json['value'], 'No message: ' + result); |
| assert.strictEqual(json['value']['message'], 'ouch'); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToExecuteAsyncScript', function(assert) { |
| var done = assert.async(); |
| bot.inject.executeAsyncScript( |
| 'window.setTimeout(goog.partial(arguments[0], 1), 10)', |
| [], 250, function(result) { |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| assert.ok(goog.object.containsKey(result, 'value')); |
| assert.strictEqual(result['value'], 1); |
| done(); |
| }); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToExecuteAsyncScriptThatCallsbackSynchronously', function(assert) { |
| var done = assert.async(); |
| bot.inject.executeAsyncScript('arguments[0](1)', [], 0, function(result) { |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| assert.ok(goog.object.containsKey(result, 'value')); |
| assert.strictEqual(result['value'], 1); |
| done(); |
| }); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToExecuteAsyncFunc', function(assert) { |
| var done = assert.async(); |
| bot.inject.executeAsyncScript( |
| function(callback) { callback(1) }, [], 0, function(result) { |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| assert.ok(goog.object.containsKey(result, 'value')); |
| assert.strictEqual(result['value'], 1); |
| done(); |
| }); |
| }); |
| |
| |
| QUnit.test('ShouldThrowOnExecuteAsyncException', function(assert) { |
| var done = assert.async(); |
| bot.inject.executeAsyncScript('nosuchfunc()', [], 0, function(result) { |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.strictEqual(result['status'], bot.ErrorCode.UNKNOWN_ERROR); |
| done(); |
| }); |
| }); |
| |
| |
| QUnit.test('ShouldTimeoutInExecuteAsync', function(assert) { |
| var done = assert.async(); |
| bot.inject.executeAsyncScript('', [], 0, function(result) { |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.strictEqual(result['status'], bot.ErrorCode.SCRIPT_TIMEOUT); |
| done(); |
| }); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToStringifyResult', function(assert) { |
| var done = assert.async(); |
| bot.inject.executeAsyncScript('', [], 0, function(jsonResult) { |
| var result = bot.json.parse(jsonResult); |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.strictEqual(result['status'], bot.ErrorCode.SCRIPT_TIMEOUT); |
| done(); |
| }, true); |
| }); |
| |
| |
| QUnit.test('ShouldBeAbleToWrapAndUnwrapInExecuteAsyncScript', function(assert) { |
| var done = assert.async(); |
| var id = bot.inject.cache.addElement(document.body); |
| var args = [{}]; |
| args[0][bot.inject.ELEMENT_KEY] = id; |
| bot.inject.executeAsyncScript( |
| 'arguments[1](arguments[0])', args, 0, function(result) { |
| assert.ok(goog.object.containsKey(result, 'status')); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| |
| assert.ok(goog.object.containsKey(result, 'value')); |
| assert.ok(goog.object.containsKey(result['value'], |
| bot.inject.ELEMENT_KEY)); |
| assert.strictEqual(bot.inject.cache.getElement( |
| result['value'][bot.inject.ELEMENT_KEY]), document.body); |
| done(); |
| }); |
| }); |
| |
| QUnit.test('ShouldExecuteAsyncScriptsInTheContextOfTheSpecifiedWindow', function(assert) { |
| if (goog.userAgent.IE || goog.userAgent.product.SAFARI || |
| (goog.userAgent.product.ANDROID && |
| !bot.userAgent.isProductVersion(4))) { |
| assert.ok(true, 'Skipping: known issue on this browser'); |
| return; |
| } |
| |
| var done = assert.async(); |
| bot.inject.executeAsyncScript(function(callback) { |
| callback({ |
| 'this == window': (this == window), |
| 'this == top': (this == window.top), |
| 'typeof window.MY_GLOBAL_CONSTANT': (typeof MY_GLOBAL_CONSTANT), |
| 'typeof window.top.MY_GLOBAL_CONSTANT': |
| (typeof window.top.MY_GLOBAL_CONSTANT) |
| }); |
| }, [], 0, function(result) { |
| var jsonResult = bot.json.stringify(result); |
| |
| assert.ok(goog.object.containsKey(result, 'status'), jsonResult); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS, jsonResult); |
| |
| assert.ok(goog.object.containsKey(result, 'value'), jsonResult); |
| var value = result['value']; |
| |
| assert.strictEqual(value['this == window'], true, jsonResult); |
| assert.strictEqual(value['this == top'], false, jsonResult); |
| assert.strictEqual(value['typeof window.MY_GLOBAL_CONSTANT'], 'undefined', jsonResult); |
| assert.strictEqual(value['typeof window.top.MY_GLOBAL_CONSTANT'], 'number', jsonResult); |
| done(); |
| }, false, frameWin); |
| }); |
| |
| QUnit.test('ShouldExecuteScriptsInTheContextOfTheSpecifiedWindow', function(assert) { |
| if (goog.userAgent.IE || goog.userAgent.product.SAFARI || |
| (goog.userAgent.product.ANDROID && |
| !bot.userAgent.isProductVersion(4))) { |
| assert.ok(true, 'Skipping: known issue on this browser'); |
| return; |
| } |
| |
| var result = bot.inject.executeScript(function() { |
| return { |
| 'this == window': (this == window), |
| 'this == top': (this == window.top), |
| 'typeof window.MY_GLOBAL_CONSTANT': (typeof MY_GLOBAL_CONSTANT), |
| 'typeof window.top.MY_GLOBAL_CONSTANT': |
| (typeof window.top.MY_GLOBAL_CONSTANT) |
| }; |
| }, [], false, frameWin); |
| |
| var jsonResult = bot.json.stringify(result); |
| |
| assert.ok(goog.object.containsKey(result, 'status'), jsonResult); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS, jsonResult); |
| |
| assert.ok(goog.object.containsKey(result, 'value'), jsonResult); |
| var value = result['value']; |
| |
| assert.strictEqual(value['this == window'], true, jsonResult); |
| assert.strictEqual(value['this == top'], false, jsonResult); |
| assert.strictEqual(value['typeof window.MY_GLOBAL_CONSTANT'], 'undefined', jsonResult); |
| assert.strictEqual(value['typeof window.top.MY_GLOBAL_CONSTANT'], 'number', jsonResult); |
| }); |
| |
| QUnit.test('CorrectlyUnwrapsFunctionArgsForInjectedScripts', function(assert) { |
| var result = bot.inject.executeScript(function() { |
| return arguments[0](); |
| }, [function() {return 1;}]); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| assert.strictEqual(result['value'], 1); |
| }); |
| |
| QUnit.test('CorrectlyUnwrapsFunctionArgsForInjectedAsyncScripts', function(assert) { |
| var done = assert.async(); |
| bot.inject.executeAsyncScript(function() { |
| var callback = arguments[arguments.length - 1]; |
| callback(arguments[0]()); |
| }, [function() {return 1;}], 0, function(result) { |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| assert.strictEqual(result['value'], 1); |
| done(); |
| }, false); |
| }); |
| |
| QUnit.test('CorrectlyUnwrapsArgsForInjectedScripts', function(assert) { |
| if (goog.userAgent.IE) { |
| assert.ok(true, 'Skipping: TODO fix for IE'); |
| return; |
| } |
| var wrapped = bot.inject.wrapValue(frameDoc.body); |
| |
| var result = bot.inject.executeScript(function() { |
| return [arguments[0], arguments[0].tagName.toUpperCase()]; |
| }, [wrapped], false, frameWin); |
| |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| |
| var value = result['value']; |
| assert.ok(Array.isArray(value)); |
| assert.strictEqual(value.length, 2); |
| |
| assert.ok(goog.isObject(value[0])); |
| assert.ok(goog.object.containsKey(value[0], bot.inject.ELEMENT_KEY)); |
| assert.strictEqual(value[0][bot.inject.ELEMENT_KEY], |
| wrapped[bot.inject.ELEMENT_KEY]); |
| |
| assert.strictEqual(value[1], 'BODY'); |
| }); |
| |
| QUnit.test('CorrectlyUnwrapsArgsForInjectedAsyncScripts', function(assert) { |
| if (goog.userAgent.IE) { |
| assert.ok(true, 'Skipping: TODO fix for IE'); |
| return; |
| } |
| var wrapped = bot.inject.wrapValue(frameDoc.body); |
| |
| var done = assert.async(); |
| bot.inject.executeAsyncScript(function(element, callback) { |
| callback([element, element.tagName.toUpperCase()]); |
| }, [wrapped], 0, function(result) { |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS); |
| |
| var value = result['value']; |
| assert.ok(Array.isArray(value)); |
| assert.strictEqual(value.length, 2); |
| |
| assert.ok(goog.isObject(value[0])); |
| assert.ok(goog.object.containsKey(value[0], bot.inject.ELEMENT_KEY)); |
| assert.strictEqual(value[0][bot.inject.ELEMENT_KEY], |
| wrapped[bot.inject.ELEMENT_KEY]); |
| |
| assert.strictEqual(value[1], 'BODY'); |
| done(); |
| }, false, frameWin); |
| }); |
| |
| QUnit.test('ExecuteScriptShouldBeAbleToRecurseOnItself', function(assert) { |
| if (goog.userAgent.IE) { |
| assert.ok(true, 'Skipping: TODO fix for IE'); |
| return; |
| } |
| var json = bot.inject.executeScript(bot.inject.executeScript, |
| ['return 1 +2;'], true); |
| var result = bot.json.parse(json); |
| |
| assert.ok(goog.object.containsKey(result, 'status'), json); |
| assert.strictEqual(result['status'], bot.ErrorCode.SUCCESS, json); |
| assert.ok(goog.object.containsKey(result, 'value'), json); |
| |
| var innerResult = result['value']; |
| assert.ok(goog.isObject(innerResult), json); |
| assert.ok(goog.object.containsKey(innerResult, 'status'), json); |
| assert.strictEqual(innerResult['status'], bot.ErrorCode.SUCCESS, json); |
| assert.ok(goog.object.containsKey(innerResult, 'value'), json); |
| assert.strictEqual(innerResult['value'], 3, json); |
| }); |
| |
| </script> |
| </body> |
| </html> |