sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
393 lines (332 loc) • 11.9 kB
HTML
<html>
<!--
Copyright 2010 The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>UrlCapture tests</title>
<script src="../base.js"></script>
<script>
goog.require('goog.gears.UrlCapture');
goog.require('goog.testing.jsunit');
goog.require('goog.testing.LooseMock');
</script>
</head>
<body>
<script>
/**
* @return {GearsLocalServer} Stub local server.
*/
function newStubLocalServer() {
return {
createStore: function() {},
openStore: function() {},
removeStore: function() {}
};
}
/**
* @return {GearsResourceStore} Stub resource store.
*/
function newStubResourceStore() {
var nextCaptureId = 0;
var capturedUrls = [];
var result = {};
result.callbacks = {};
result.capture = function(urls, callback) {
var id = nextCaptureId++;
this.callbacks[id] = function(url, success, captureId) {
if (url && success) {
capturedUrls.push(url);
}
callback(url, success, captureId);
}
return id;
};
result.rename = function(oldUrl, newUrl) {
goog.array.remove(capturedUrls, oldUrl);
capturedUrls.push(newUrl);
};
result.copy = function(oldUrl, newUrl) {
capturedUrls.push(newUrl);
};
result.remove = function(url) {
goog.array.remove(capturedUrls, url);
};
result.isCaptured = function(url) {
return goog.array.contains(capturedUrls, url);
};
result.abortCapture = function(id) {
delete this.callbacks[id];
};
return result;
}
/**
* @param {GearsResourceStore} ResourceStore to be returned by #createStore.
* @return {Mock.<GearsLocalServer>} Mock local server expecting a single call
* to #createStore returning #stubResourceStore.
*/
function newMockLocalServerCreateStore(stubResourceStore) {
var result = new goog.testing.LooseMock(newStubLocalServer());
result.createStore(STORE_NAME, COOKIE_NAME).$returns(
stubResourceStore);
result.$replay();
return result;
}
/**
* @return {Object} Event listener for UrlCapture.
*/
function newListener(uut) {
var result = {
url_success: [],
url_error: [],
complete: [],
abort: []
};
goog.events.listen(uut, goog.gears.UrlCapture.EventType.URL_SUCCESS,
function(e) { result.url_success.push(e); });
goog.events.listen(uut, goog.gears.UrlCapture.EventType.URL_ERROR,
function(e) { result.url_error.push(e); });
goog.events.listen(uut, goog.gears.UrlCapture.EventType.COMPLETE,
function(e) { result.complete.push(e); });
goog.events.listen(uut, goog.gears.UrlCapture.EventType.ABORT,
function(e) { result.abort.push(e); });
return result;
}
function assertEventEquals(expectedType, expectedCaptureId, expectedUri,
expectedErrorUris, actualEvent) {
assertEquals('wrong type', expectedType, actualEvent.type);
assertEquals('wrong capture ID', expectedCaptureId, actualEvent.captureId);
assertEquals('wrong URL', expectedUri, actualEvent.uri);
assertArrayEquals('wrong error URIs', expectedErrorUris,
actualEvent.errorUris);
}
function assertIsCaptured(expectedCapturedUrls, expectedUncapturedUrls, uut) {
for (var i = 0; i < expectedCapturedUrls.length; ++i) {
var url = expectedCapturedUrls[i];
assertTrue('not captured: ' + url, uut.isCaptured(url));
}
for (var i = 0; i < expectedUncapturedUrls.length; ++i) {
var url = expectedUncapturedUrls[i];
assertFalse('captured: ' + url, uut.isCaptured(url));
}
}
var STORE_NAME = 'TestCapture';
var COOKIE_NAME = 'TestCookie';
/**
* Tests resource store exists.
*/
function testExists() {
var mockLocalServer = new goog.testing.LooseMock(newStubLocalServer());
mockLocalServer.openStore(STORE_NAME, COOKIE_NAME).$returns(true);
mockLocalServer.$replay();
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
assertTrue('exists failed for ' + STORE_NAME, uut.exists());
mockLocalServer.$verify();
}
/**
* Tests resource store does not exist.
*/
function testNotExists() {
var mockLocalServer = new goog.testing.LooseMock(newStubLocalServer());
mockLocalServer.openStore(STORE_NAME, COOKIE_NAME).$returns(false);
mockLocalServer.$replay();
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
assertFalse('exists succeeded for ' + STORE_NAME, uut.exists());
mockLocalServer.$verify();
}
/**
* Test remove resource store.
*/
function testRemoveStore() {
var mockLocalServer = new goog.testing.LooseMock(newStubLocalServer());
mockLocalServer.removeStore(STORE_NAME, COOKIE_NAME);
mockLocalServer.$replay();
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
uut.removeStore();
mockLocalServer.$verify();
}
/**
* Test empty capture request.
*/
function testEmptyCapture() {
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME,
newStubLocalServer());
assertThrows('should fail for null uris', function() { uut.capture(); });
assertThrows('should fail for 0 uris', function() { uut.capture([]); });
}
/**
* Test successful capture.
*/
function testCaptureUrlSuccess() {
// Create stubs and mocks.
var stubResourceStore = newStubResourceStore();
var mockLocalServer = newMockLocalServerCreateStore(stubResourceStore);
// Create url capturer and event listener.
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
var listener = newListener(uut);
// Start capture.
var url = '/foo.html';
var id = uut.capture([url]);
mockLocalServer.$verify();
assertEquals('wrong capture ID', 0, id);
var callback = stubResourceStore.callbacks[id];
assertEquals('missing callback', 'function', typeof callback);
// Callback capture success.
var uncapturedUrl = '/uncaptured.html';
assertIsCaptured([], [url, uncapturedUrl], uut);
callback(url, true, id);
assertIsCaptured([url], [uncapturedUrl], uut);
// Assert events.
assertEquals('url error', 0, listener.url_error.length);
assertEquals('abort', 0, listener.abort.length);
assertEquals('url success', 1, listener.url_success.length);
assertEventEquals(goog.gears.UrlCapture.EventType.URL_SUCCESS, id, url, [],
listener.url_success[0]);
assertEquals('url complete', 1, listener.complete.length);
assertEventEquals(goog.gears.UrlCapture.EventType.COMPLETE, id, null, [],
listener.complete[0]);
}
/**
* Test unsuccessful capture.
*/
function testCaptureUrlFail() {
// Create stubs and mocks.
var stubResourceStore = newStubResourceStore();
var mockLocalServer = newMockLocalServerCreateStore(stubResourceStore);
// Create url capturer and event listener.
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
var listener = newListener(uut);
// Start capture.
var url = '/foo.html';
var id = uut.capture([url]);
mockLocalServer.$verify();
assertEquals('wrong capture ID', 0, id);
var callback = stubResourceStore.callbacks[id];
assertEquals('missing callback', 'function', typeof callback);
// Callback capture success.
assertIsCaptured([], [url], uut);
callback(url, false, id);
assertIsCaptured([], [url], uut);
// Assert events.
assertEquals('url error', 1, listener.url_error.length);
assertEventEquals(goog.gears.UrlCapture.EventType.URL_ERROR, id, url, [],
listener.url_error[0]);
assertEquals('abort', 0, listener.abort.length);
assertEquals('url success', 0, listener.url_success.length);
assertEquals('url complete', 1, listener.complete.length);
assertEventEquals(goog.gears.UrlCapture.EventType.COMPLETE, id, null, [url],
listener.complete[0]);
}
/**
* Test abort capture.
*/
function testAbortCapture() {
// Create stubs and mocks.
var stubResourceStore = newStubResourceStore();
var mockLocalServer = newMockLocalServerCreateStore(stubResourceStore);
// Create url capturer and event listener.
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
var listener = newListener(uut);
// Throw exception for aborting with no ID.
assertThrows('should fail for no ID', function() { uut.abort(); });
assertThrows('should fail for null ID', function() { uut.abort(null); });
// Start capture.
var url = '/foo.html';
var id = uut.capture([url]);
mockLocalServer.$verify();
var callback = stubResourceStore.callbacks[id];
assertEquals('missing callback', 'function', typeof callback);
// Abort capture.
assertIsCaptured([], [url], uut);
uut.abort(id);
assertEquals('abort', 1, listener.abort.length);
assertFalse('found aborted callback', !!stubResourceStore.callbacks[id]);
assertIsCaptured([], [url], uut);
// Callback after abort captures URL but dispatches no events.
callback(url, true, id);
assertIsCaptured([url], [], uut);
// Assert events.
assertEquals('url error', 0, listener.url_error.length);
assertEquals('url success', 0, listener.url_success.length);
assertEquals('url complete', 0, listener.complete.length);
}
/**
* Test removing captured URL.
*/
function testRemoveUrl() {
// Create stubs and mocks.
var stubResourceStore = newStubResourceStore();
var mockLocalServer = newMockLocalServerCreateStore(stubResourceStore);
// Create url capturer.
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
// Throw exception for removing with no URL.
assertThrows('should fail for no URL', function() { uut.remove(); });
assertThrows('should fail for null URL', function() { uut.remove(null); });
// Start capture.
var url = '/foo.html';
var id = uut.capture([url]);
mockLocalServer.$verify();
assertIsCaptured([], [url], uut);
// Capture callback success.
stubResourceStore.callbacks[id](url, true, id);
assertIsCaptured([url], [], uut);
// Remove URL.
uut.remove(url);
assertIsCaptured([], [url], uut);
}
/**
* Test renaming captured URL.
*/
function testRenameUrl() {
// Create stubs and mocks.
var stubResourceStore = newStubResourceStore();
var mockLocalServer = newMockLocalServerCreateStore(stubResourceStore);
// Create url capturer.
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
// Throw exception for removing with no URL.
assertThrows('should fail for no URL', function() { uut.rename(); });
assertThrows('should fail for null URL', function() { uut.rename(null); });
// Start capture.
var url = '/foo.html';
var renamedUrl = '/renamed.html';
var id = uut.capture([url]);
mockLocalServer.$verify();
assertIsCaptured([], [url, renamedUrl], uut);
// Callback capture success.
stubResourceStore.callbacks[id](url, true, id);
assertIsCaptured([url], [renamedUrl], uut);
// Rename URL.
uut.rename(url, renamedUrl);
assertIsCaptured([renamedUrl], [url], uut);
}
/**
* Test copying captured URL.
*/
function testCopyUrl() {
// Create stubs and mocks.
var stubResourceStore = newStubResourceStore();
var mockLocalServer = newMockLocalServerCreateStore(stubResourceStore);
// Create url capturer.
var uut = new goog.gears.UrlCapture(STORE_NAME, COOKIE_NAME, mockLocalServer);
// Throw exception for removing with no URL.
assertThrows('should fail for no URL', function() { uut.copy(); });
assertThrows('should fail for null URL', function() { uut.copy(null); });
// Start capture.
var url = '/foo.html';
var copiedUrl = '/renamed.html';
var id = uut.capture([url]);
mockLocalServer.$verify();
assertIsCaptured([], [url, copiedUrl], uut);
// Callback capture success.
stubResourceStore.callbacks[id](url, true, id);
assertIsCaptured([url], [copiedUrl], uut);
// Copy URL.
uut.copy(url, copiedUrl);
assertIsCaptured([url, copiedUrl], [], uut);
}
</script>
</body>
</html>