/* global context testDone:true */

var name = "keys" + context;
var c;

var tests = [
  "//mochi.test:8888/?page" + context,
  "//mochi.test:8888/?another" + context,
];

caches.open(name).then(function(cache) {
  c = cache;
  return c.addAll(tests);
}).then(function() {
  // Add another cache entry using Cache.add
  var another = "//mochi.test:8888/?yetanother" + context;
  tests.push(another);
  return c.add(another);
}).then(function() {
  // Add another cache entry with URL fragment using Cache.add
  var anotherWithFragment = "//mochi.test:8888/?fragment" + context + "#fragment";
  tests.push(anotherWithFragment);
  return c.add(anotherWithFragment);
}).then(function() {
  return c.keys();
}).then(function(keys) {
  is(keys.length, tests.length, "Same number of elements");
  // Verify both the insertion order of the requests and their validity.
  keys.forEach(function(r, i) {
    ok(r instanceof Request, "Valid request object");
    ok(r.url.includes(tests[i]), "Valid URL");
  });
  // Try searching for just one request
  return c.keys(tests[1]);
}).then(function(keys) {
  is(keys.length, 1, "One match should be found");
  ok(keys[0].url.includes(tests[1]), "Valid URL");
  // Try to see if ignoreSearch works as expected.
  return c.keys(new Request("//mochi.test:8888/?foo"), {ignoreSearch: true});
}).then(function(key_arr) {
  is(key_arr.length, tests.length, "Same number of elements");
  key_arr.forEach(function(r, i) {
    ok(r instanceof Request, "Valid request object");
    ok(r.url.includes(tests[i]), "Valid URL");
  });
  // Try to see if ignoreMethod works as expected
  return Promise.all(
    ["POST", "PUT", "DELETE", "OPTIONS"]
      .map(function(method) {
        var req = new Request(tests[2], {method});
        return c.keys(req)
          .then(function(keys) {
            is(keys.length, 0, "No request should be matched without ignoreMethod");
            return c.keys(req, {ignoreMethod: true});
          }).then(function(keys) {
            is(keys.length, 1, "One match should be found");
            ok(keys[0].url.includes(tests[2]), "Valid URL");
          });
      })
  );
}).then(function() {
  // But HEAD should be allowed only when ignoreMethod is ture
  return c.keys(new Request(tests[0], {method: "HEAD"}), {ignoreMethod: true});
}).then(function(keys) {
  is(keys.length, 1, "One match should be found");
  ok(keys[0].url.includes(tests[0]), "Valid URL");
  // Make sure cacheName is ignored.
  return c.keys(tests[0], {cacheName: "non-existing-cache"});
}).then(function(keys) {
  is(keys.length, 1, "One match should be found");
  ok(keys[0].url.includes(tests[0]), "Valid URL");
  return caches.delete(name);
}).then(function(deleted) {
  ok(deleted, "The cache should be successfully deleted");
  testDone();
});
