Files
zulip/frontend_tests/node_tests/stream_sort.js
madrix01 c1b5021d84 stream_list: Sort muted to end of sections and add labels.
The stream list left sidebar currently has 3 sections:
* Pinned (+ Muted pinned streams)
* Active (+ Muted active streams)
* Inactive streams

Previously, these sections were separated by horizontal lines, which
did not provide an easy way to discern why there were sections. We add
labels to these section dividers to help with this.

Additionally, within each section, we now sort all muted streams to
the bottom, so that they general minimal clutter.

Fixes #19812.
2022-08-06 21:59:23 -07:00

178 lines
5.6 KiB
JavaScript

"use strict";
const {strict: assert} = require("assert");
const {zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");
const stream_data = zrequire("stream_data");
const stream_sort = zrequire("stream_sort");
const scalene = {
subscribed: true,
name: "scalene",
stream_id: 1,
pin_to_top: true,
};
const fast_tortoise = {
subscribed: true,
name: "fast tortoise",
stream_id: 2,
pin_to_top: false,
};
const pneumonia = {
subscribed: true,
name: "pneumonia",
stream_id: 3,
pin_to_top: false,
};
const clarinet = {
subscribed: true,
name: "clarinet",
stream_id: 4,
pin_to_top: false,
};
const weaving = {
subscribed: false,
name: "weaving",
stream_id: 5,
pin_to_top: false,
};
const stream_hyphen_underscore_slash = {
subscribed: true,
name: "stream-hyphen_underscore/slash",
stream_id: 6,
pin_to_top: false,
};
const muted_active = {
subscribed: true,
name: "muted active",
stream_id: 7,
pin_to_top: false,
is_muted: true,
};
const muted_pinned = {
subscribed: true,
name: "muted pinned",
stream_id: 8,
pin_to_top: true,
is_muted: true,
};
function sort_groups(query) {
const streams = stream_data.subscribed_stream_ids();
return stream_sort.sort_groups(streams, query);
}
function test(label, f) {
run_test(label, (helpers) => {
stream_data.clear_subscriptions();
f(helpers);
});
}
test("no_subscribed_streams", () => {
const sorted = sort_groups("");
assert.deepEqual(sorted, {
dormant_streams: [],
muted_active_streams: [],
muted_pinned_streams: [],
normal_streams: [],
pinned_streams: [],
same_as_before: sorted.same_as_before,
});
assert.equal(stream_sort.first_stream_id(), undefined);
});
test("basics", ({override_rewire}) => {
stream_data.add_sub(scalene);
stream_data.add_sub(fast_tortoise);
stream_data.add_sub(pneumonia);
stream_data.add_sub(clarinet);
stream_data.add_sub(weaving);
stream_data.add_sub(stream_hyphen_underscore_slash);
stream_data.add_sub(muted_active);
stream_data.add_sub(muted_pinned);
override_rewire(stream_data, "is_active", (sub) => sub.name !== "pneumonia");
// Test sorting into categories/alphabetized
let sorted = sort_groups("");
assert.deepEqual(sorted.pinned_streams, [scalene.stream_id]);
assert.deepEqual(sorted.normal_streams, [
clarinet.stream_id,
fast_tortoise.stream_id,
stream_hyphen_underscore_slash.stream_id,
]);
assert.deepEqual(sorted.muted_pinned_streams, [muted_pinned.stream_id]);
assert.deepEqual(sorted.muted_active_streams, [muted_active.stream_id]);
assert.deepEqual(sorted.dormant_streams, [pneumonia.stream_id]);
// Test cursor helpers.
assert.equal(stream_sort.first_stream_id(), scalene.stream_id);
assert.equal(stream_sort.prev_stream_id(scalene.stream_id), undefined);
assert.equal(stream_sort.prev_stream_id(muted_pinned.stream_id), scalene.stream_id);
assert.equal(stream_sort.prev_stream_id(clarinet.stream_id), muted_pinned.stream_id);
assert.equal(
stream_sort.next_stream_id(fast_tortoise.stream_id),
stream_hyphen_underscore_slash.stream_id,
);
assert.equal(
stream_sort.next_stream_id(stream_hyphen_underscore_slash.stream_id),
muted_active.stream_id,
);
assert.equal(
stream_sort.next_stream_id(fast_tortoise.stream_id),
stream_hyphen_underscore_slash.stream_id,
);
assert.equal(stream_sort.next_stream_id(muted_active.stream_id), pneumonia.stream_id);
assert.equal(stream_sort.next_stream_id(pneumonia.stream_id), undefined);
// Test filtering
sorted = sort_groups("s");
assert.deepEqual(sorted.pinned_streams, [scalene.stream_id]);
assert.deepEqual(sorted.normal_streams, [stream_hyphen_underscore_slash.stream_id]);
assert.deepEqual(sorted.dormant_streams, []);
assert.equal(stream_sort.prev_stream_id(clarinet.stream_id), undefined);
assert.equal(stream_sort.next_stream_id(clarinet.stream_id), undefined);
// Test searching entire word, case-insensitive
sorted = sort_groups("PnEuMoNiA");
assert.deepEqual(sorted.pinned_streams, []);
assert.deepEqual(sorted.normal_streams, []);
assert.deepEqual(sorted.dormant_streams, [pneumonia.stream_id]);
// Test searching part of word
sorted = sort_groups("tortoise");
assert.deepEqual(sorted.pinned_streams, []);
assert.deepEqual(sorted.normal_streams, [fast_tortoise.stream_id]);
assert.deepEqual(sorted.dormant_streams, []);
// Test searching stream with spaces
sorted = sort_groups("fast t");
assert.deepEqual(sorted.pinned_streams, []);
assert.deepEqual(sorted.normal_streams, [fast_tortoise.stream_id]);
assert.deepEqual(sorted.dormant_streams, []);
// Test searching part of stream name with non space word separators
sorted = sort_groups("hyphen");
assert.deepEqual(sorted.pinned_streams, []);
assert.deepEqual(sorted.normal_streams, [stream_hyphen_underscore_slash.stream_id]);
assert.deepEqual(sorted.dormant_streams, []);
sorted = sort_groups("hyphen_underscore");
assert.deepEqual(sorted.pinned_streams, []);
assert.deepEqual(sorted.normal_streams, [stream_hyphen_underscore_slash.stream_id]);
assert.deepEqual(sorted.dormant_streams, []);
// Test searching part of stream name with non space word separators
sorted = sort_groups("underscore");
assert.deepEqual(sorted.pinned_streams, []);
assert.deepEqual(sorted.normal_streams, [stream_hyphen_underscore_slash.stream_id]);
assert.deepEqual(sorted.dormant_streams, []);
});