diff options
Diffstat (limited to 'dom/cache/test/mochitest/test_cache.js')
-rw-r--r-- | dom/cache/test/mochitest/test_cache.js | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/dom/cache/test/mochitest/test_cache.js b/dom/cache/test/mochitest/test_cache.js new file mode 100644 index 0000000000..4e80485eb0 --- /dev/null +++ b/dom/cache/test/mochitest/test_cache.js @@ -0,0 +1,195 @@ +/* global context testDone:true */ + +var c = null; +var request = "https://example.com/hmm?q=foobar" + context; +var response = new Response("This is some Response!"); +var name = "snafu" + context; +var foobar = "foobar" + context; + +ok(!!caches, "caches object should be available on global"); +caches + .open(name) + .then(function(openCache) { + ok( + openCache instanceof Cache, + "cache object should be resolved from caches.open" + ); + return caches.has(name); + }) + .then(function(hasResult) { + ok(hasResult, "caches.has() should resolve true"); + return caches.keys(); + }) + .then(function(keys) { + ok(!!keys, "caches.keys() should resolve to a truthy value"); + ok( + keys.length >= 1, + "caches.keys() should resolve to an array of length at least 1" + ); + ok( + keys.includes(name), + "caches.keys() should resolve to an array containing key" + ); + return caches.delete(name); + }) + .then(function(deleteResult) { + ok(deleteResult, "caches.delete() should resolve true"); + return caches.has(name); + }) + .then(function(hasMissingCache) { + ok(!hasMissingCache, "missing key should return false from has"); + }) + .then(function() { + return caches.open(name); + }) + .then(function(snafu) { + return snafu.keys(); + }) + .then(function(empty) { + is(0, empty.length, "cache.keys() should resolve to an array of length 0"); + }) + .then(function() { + return caches.open(name); + }) + .then(function(snafu) { + var req = "./cachekey"; + var res = new Response("Hello world"); + return snafu + .put("ftp://invalid", res) + .then(function() { + ok(false, "This should fail"); + }) + .catch(function(err) { + is( + err.name, + "TypeError", + "put() should throw TypeError for invalid scheme" + ); + return snafu.put(req, res); + }) + .then(function(v) { + return snafu; + }); + }) + .then(function(snafu) { + return Promise.all([snafu, snafu.keys()]); + }) + .then(function(args) { + var snafu = args[0]; + var keys = args[1]; + is(1, keys.length, "cache.keys() should resolve to an array of length 1"); + ok(keys[0] instanceof Request, "key should be a Request"); + ok(keys[0].url.match(/cachekey$/), "Request URL should match original"); + return Promise.all([ + snafu, + snafu.match(keys[0]), + snafu.match("ftp://invalid"), + ]); + }) + .then(function(args) { + var snafu = args[0]; + var res = args[1]; + ok(res instanceof Response, "value should be a Response"); + is(res.status, 200, "Response status should be 200"); + is( + undefined, + args[2], + "Match with invalid scheme should resolve undefined" + ); + return Promise.all([snafu, snafu.put("./cachekey2", res)]); + }) + .then(function(args) { + var snafu = args[0]; + return snafu.match("./cachekey2"); + }) + .then(function(res) { + return res.text().then(function(v) { + is(v, "Hello world", "Response body should match original"); + }); + }) + .then(function() { + // FIXME(nsm): Can't use a Request object for now since the operations + // consume it's 'body'. See + // https://github.com/slightlyoff/ServiceWorker/issues/510. + return caches.open(foobar); + }) + .then(function(openCache) { + c = openCache; + return c.put(request, response); + }) + .then(function(putResponse) { + is(putResponse, undefined, "The promise should resolve to undefined"); + return c.keys(request); + }) + .then(function(keys) { + ok(keys, "Valid keys object expected"); + is(keys.length, 1, "Only one key is expected"); + return c.keys(); + }) + .then(function(keys) { + ok(keys, "Valid keys object expected"); + is(keys.length, 1, "Only one key is expected"); + return c.matchAll(request); + }) + .then(function(matchAllResponses) { + ok(matchAllResponses, "matchAll should succeed"); + is(matchAllResponses.length, 1, "Only one match is expected"); + return c.match(request); + }) + .then(function(matchResponse) { + ok(matchResponse, "match should succeed"); + return caches.match(request); + }) + .then(function(storageMatchResponse) { + ok(storageMatchResponse, "storage match should succeed"); + return caches.match(request, { cacheName: foobar }); + }) + .then(function(storageMatchResponse) { + ok(storageMatchResponse, "storage match with cacheName should succeed"); + var request2 = new Request("https://example.com/hmm?q=snafu" + context); + return c.match(request2, { ignoreSearch: true }); + }) + .then(function(match2Response) { + ok(match2Response, "match should succeed"); + return c.delete(request); + }) + .then(function(deleteResult) { + ok(deleteResult, "delete should succeed"); + return c.keys(); + }) + .then(function(keys) { + ok(keys, "Valid keys object expected"); + is(keys.length, 0, "Zero keys is expected"); + return c.matchAll(request); + }) + .then(function(matchAll2Responses) { + ok(matchAll2Responses, "matchAll should succeed"); + is(matchAll2Responses.length, 0, "Zero matches is expected"); + return caches.has(foobar); + }) + .then(function(hasResult) { + ok(hasResult, "has should succeed"); + return caches.keys(); + }) + .then(function(keys) { + ok(keys, "Valid keys object expected"); + ok(keys.length >= 2, "At least two keys are expected"); + ok(keys.includes(name), "snafu should exist"); + ok( + keys.indexOf(foobar) >= keys.indexOf(name), + "foobar should come after it" + ); + return caches.delete(foobar); + }) + .then(function(deleteResult) { + ok(deleteResult, "delete should succeed"); + return caches.has(foobar); + }) + .then(function(hasMissingCache) { + ok(!hasMissingCache, "has should have a result"); + return caches.delete(name); + }) + .then(function(deleteResult) { + ok(deleteResult, "delete should succeed"); + testDone(); + }); |