/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

const userAgentID = "ba31ac13-88d4-4984-8e6b-8731315a7cf8";

function run_test() {
  do_get_profile();
  setPrefs({
    userAgentID,
  });
  run_next_test();
}

add_task(async function test_notification_version_string() {
  let db = PushServiceWebSocket.newPushDB();
  registerCleanupFunction(() => {
    return db.drop().then(_ => db.close());
  });
  await db.put({
    channelID: "6ff97d56-d0c0-43bc-8f5b-61b855e1d93b",
    pushEndpoint: "https://example.org/updates/1",
    scope: "https://example.com/page/1",
    originAttributes: "",
    version: 2,
    quota: Infinity,
    systemRecord: true,
  });

  let notifyPromise = promiseObserverNotification(
    PushServiceComponent.pushTopic
  );

  let ackDone;
  let ackPromise = new Promise(resolve => (ackDone = resolve));
  PushService.init({
    serverURI: "wss://push.example.org/",
    db,
    makeWebSocket(uri) {
      return new MockWebSocket(uri, {
        onHello(request) {
          this.serverSendMsg(
            JSON.stringify({
              messageType: "hello",
              status: 200,
              uaid: userAgentID,
            })
          );
          this.serverSendMsg(
            JSON.stringify({
              messageType: "notification",
              updates: [
                {
                  channelID: "6ff97d56-d0c0-43bc-8f5b-61b855e1d93b",
                  version: "4",
                },
              ],
            })
          );
        },
        onACK: ackDone,
      });
    },
  });

  let { subject: message } = await notifyPromise;
  equal(
    message.QueryInterface(Ci.nsIPushMessage).data,
    null,
    "Unexpected data for Simple Push message"
  );

  await ackPromise;

  let storeRecord = await db.getByKeyID("6ff97d56-d0c0-43bc-8f5b-61b855e1d93b");
  strictEqual(storeRecord.version, 4, "Wrong record version");
  equal(storeRecord.quota, Infinity, "Wrong quota");
});
