text: "use strict";
  
  const {strict: assert} = require("assert");
  
  const {zrequire} = require("../zjsunit/namespace");
  const {run_test} = require("../zjsunit/test");
  const blueslip = require("../zjsunit/zblueslip");
  const {page_params} = require("../zjsunit/zpage_params");
  
  const muted_topics = zrequire("muted_topics");
  const muted_users = zrequire("muted_users");
  const stream_data = zrequire("stream_data");
  
  const design = {
      stream_id: 100,
      name: "design",
  };
  
  const devel = {
      stream_id: 101,
      name: "devel",
  };
  
  const office = {
      stream_id: 102,
      name: "office",
  };
  
  const social = {
      stream_id: 103,
      name: "social",
  };
  
  const unknown = {
      stream_id: 999,
      name: "whatever",
  };
  
  stream_data.add_sub(design);
  stream_data.add_sub(devel);
  stream_data.add_sub(office);
  stream_data.add_sub(social);
  
  function test(label, f) {
      run_test(label, ({override}) => {
          muted_topics.set_muted_topics([]);
          muted_users.set_muted_users([]);
          f({override});
      });
  }
  
  test("edge_cases", () => {
      // private messages
      assert.ok(!muted_topics.is_topic_muted(undefined, undefined));
  
      // invalid user
      assert.ok(!muted_users.is_user_muted(undefined));
  });
  
  test("add_and_remove_mutes", () => {
      assert.ok(!muted_topics.is_topic_muted(devel.stream_id, "java"));
      muted_topics.add_muted_topic(devel.stream_id, "java");
      assert.ok(muted_topics.is_topic_muted(devel.stream_id, "java"));
  
      // test idempotency
      muted_topics.add_muted_topic(devel.stream_id, "java");
      assert.ok(muted_topics.is_topic_muted(devel.stream_id, "java"));
  
      muted_topics.remove_muted_topic(devel.stream_id, "java");
      assert.ok(!muted_topics.is_topic_muted(devel.stream_id, "java"));
  
      // test idempotency
      muted_topics.remove_muted_topic(devel.stream_id, "java");
      assert.ok(!muted_topics.is_topic_muted(devel.stream_id, "java"));
  
      // test unknown stream is harmless too
      muted_topics.remove_muted_topic(unknown.stream_id, "java");
      assert.ok(!muted_topics.is_topic_muted(unknown.stream_id, "java"));
  
      assert.ok(!muted_users.is_user_muted(1));
      muted_users.add_muted_user(1);
      assert.ok(muted_users.is_user_muted(1));
  
      // test idempotency
      muted_users.add_muted_user(1);
      assert.ok(muted_users.is_user_muted(1));
  
      muted_users.remove_muted_user(1);
      assert.ok(!muted_users.is_user_muted(1));
  
      // test idempotency
      muted_users.remove_muted_user(1);
      assert.ok(!muted_users.is_user_muted(1));
  });
  
  test("get_unmuted_users", () => {
      const hamlet = {
          user_id: 1,
          full_name: "King Hamlet",
      };
      const cordelia = {
          user_id: 2,
          full_name: "Cordelia, Lear's Daughter",
      };
      const othello = {
          user_id: 3,
          full_name: "Othello, Moor of Venice",
      };
  
      muted_users.add_muted_user(hamlet.user_id);
      muted_users.add_muted_user(cordelia.user_id);
  
      assert.deepEqual(
          muted_users.filter_muted_user_ids([hamlet.user_id, cordelia.user_id, othello.user_id]),
          [othello.user_id],
      );
      assert.deepEqual(muted_users.filter_muted_users([hamlet, cordelia, othello]), [othello]);
  });
  
  test("get_mutes", () => {
      assert.deepEqual(muted_topics.get_muted_topics(), []);
      muted_topics.add_muted_topic(office.stream_id, "gossip", 1577836800);
      muted_topics.add_muted_topic(devel.stream_id, "java", 1577836700);
      const all_muted_topics = muted_topics
          .get_muted_topics()
          .sort((a, b) => a.date_muted - b.date_muted);
  
      assert.deepEqual(all_muted_topics, [
          {
              date_muted: 1577836700000,
              date_muted_str: "Dec\u00A031,\u00A02019",
              stream: devel.name,
              stream_id: devel.stream_id,
              topic: "java",
          },
          {
              date_muted: 1577836800000,
              date_muted_str: "Jan\u00A001,\u00A02020",
              stream: office.name,
              stream_id: office.stream_id,
              topic: "gossip",
          },
      ]);
  
      assert.deepEqual(muted_users.get_muted_users(), []);
      muted_users.add_muted_user(6, 1577836800);
      muted_users.add_muted_user(4, 1577836800);
      const all_muted_users = muted_users
          .get_muted_users()
          .sort((a, b) => a.date_muted - b.date_muted);
  
      assert.deepEqual(all_muted_users, [
          {
              date_muted: 1577836800000,
              date_muted_str: "Jan\u00A001,\u00A02020",
              id: 6,
          },
          {
              date_muted: 1577836800000,
              date_muted_str: "Jan\u00A001,\u00A02020",
              id: 4,
          },
      ]);
  });
  
  test("unknown streams", () => {
      blueslip.expect("warn", "Unknown stream in set_muted_topics: BOGUS STREAM");
  
      page_params.muted_topics = [
          ["social", "breakfast", 1577836800],
          ["design", "typography", 1577836800],
          ["BOGUS STREAM", "whatever", 1577836800],
      ];
      page_params.muted_users = [
          {id: 3, timestamp: 1577836800},
          {id: 2, timestamp: 1577836800},
      ];
      muted_topics.initialize();
      muted_users.initialize();
  
      assert.deepEqual(muted_topics.get_muted_topics().sort(), [
          {
              date_muted: 1577836800000,
              date_muted_str: "Jan\u00A001,\u00A02020",
              stream: social.name,
              stream_id: social.stream_id,
              topic: "breakfast",
          },
          {
              date_muted: 1577836800000,
              date_muted_str: "Jan\u00A001,\u00A02020",
              stream: design.name,
              stream_id: design.stream_id,
              topic: "typography",
          },
      ]);
  
      assert.deepEqual(muted_users.get_muted_users().sort(), [
          {
              date_muted: 1577836800000,
              date_muted_str: "Jan\u00A001,\u00A02020",
              id: 3,
          },
          {
              date_muted: 1577836800000,
              date_muted_str: "Jan\u00A001,\u00A02020",
              id: 2,
          },
      ]);
  });
  
  test("case_insensitivity", () => {
      muted_topics.set_muted_topics([]);
      assert.ok(!muted_topics.is_topic_muted(social.stream_id, "breakfast"));
      muted_topics.set_muted_topics([["SOCial", "breakfast"]]);
      assert.ok(muted_topics.is_topic_muted(social.stream_id, "breakfast"));
      assert.ok(muted_topics.is_topic_muted(social.stream_id, "breakFAST"));
  });
  