2020-08-01 03:43:15 +02:00
"use strict" ;
2024-10-09 00:25:41 +02:00
const assert = require ( "node:assert/strict" ) ;
2020-11-30 23:46:45 +01:00
2024-11-13 07:05:32 +01:00
const { mock _esm , zrequire } = require ( "./lib/namespace.cjs" ) ;
const { run _test } = require ( "./lib/test.cjs" ) ;
const blueslip = require ( "./lib/zblueslip.cjs" ) ;
const $ = require ( "./lib/zjquery.cjs" ) ;
const { page _params } = require ( "./lib/zpage_params.cjs" ) ;
2020-12-01 00:02:16 +01:00
2021-03-11 05:43:45 +01:00
const hash _util = zrequire ( "hash_util" ) ;
2020-12-01 23:21:38 +01:00
const compose _state = zrequire ( "compose_state" ) ;
2021-03-26 15:21:47 +01:00
const narrow _banner = zrequire ( "narrow_banner" ) ;
2020-12-01 23:21:38 +01:00
const people = zrequire ( "people" ) ;
const stream _data = zrequire ( "stream_data" ) ;
2023-02-22 23:03:47 +01:00
const { Filter } = zrequire ( "../src/filter" ) ;
2024-06-05 10:51:22 +02:00
const message _view = zrequire ( "message_view" ) ;
2023-10-05 23:18:00 +02:00
const narrow _title = zrequire ( "narrow_title" ) ;
2023-10-05 18:40:10 +02:00
const recent _view _util = zrequire ( "recent_view_util" ) ;
const inbox _util = zrequire ( "inbox_util" ) ;
2024-02-13 03:44:04 +01:00
const message _lists = zrequire ( "message_lists" ) ;
2024-10-09 22:44:13 +02:00
const { set _current _user , set _realm } = zrequire ( "state_data" ) ;
2024-07-08 19:00:08 +02:00
const user _groups = zrequire ( "user_groups" ) ;
2024-10-09 08:44:21 +02:00
const { initialize _user _settings } = zrequire ( "user_settings" ) ;
2024-10-09 22:44:13 +02:00
set _current _user ( { } ) ;
const realm = { } ;
set _realm ( realm ) ;
2024-10-09 08:44:21 +02:00
initialize _user _settings ( { user _settings : { } } ) ;
2017-04-25 15:25:31 +02:00
2023-11-03 04:20:28 +01:00
mock _esm ( "../src/compose_banner" , {
2024-07-08 19:00:08 +02:00
clear _errors ( ) { } ,
2023-11-03 04:20:28 +01:00
clear _search _view _banner ( ) { } ,
} ) ;
2023-02-22 23:04:10 +01:00
const compose _pm _pill = mock _esm ( "../src/compose_pm_pill" ) ;
2024-06-12 12:04:08 +02:00
mock _esm ( "../src/settings_data" , {
user _can _access _all _other _users : ( ) => true ,
} ) ;
2023-02-22 23:04:10 +01:00
mock _esm ( "../src/spectators" , {
2022-11-17 23:33:43 +01:00
login _to _access ( ) { } ,
2022-04-29 12:48:19 +02:00
} ) ;
2021-09-01 18:23:28 +02:00
function empty _narrow _html ( title , html , search _data ) {
const opts = {
title ,
html ,
search _data ,
} ;
2023-02-22 23:04:10 +01:00
return require ( "../templates/empty_feed_notice.hbs" ) ( opts ) ;
2021-09-01 18:23:28 +02:00
}
2023-12-22 00:26:14 +01:00
function set _filter ( terms ) {
terms = terms . map ( ( op ) => ( {
js: Convert _.map(a, …) to a.map(…).
And convert the corresponding function expressions to arrow style
while we’re here.
import * as babelParser from "recast/parsers/babel";
import * as recast from "recast";
import * as tsParser from "recast/parsers/typescript";
import { builders as b, namedTypes as n } from "ast-types";
import K from "ast-types/gen/kinds";
import fs from "fs";
import path from "path";
import process from "process";
const checkExpression = (node: n.Node): node is K.ExpressionKind =>
n.Expression.check(node);
for (const file of process.argv.slice(2)) {
console.log("Parsing", file);
const ast = recast.parse(fs.readFileSync(file, { encoding: "utf8" }), {
parser: path.extname(file) === ".ts" ? tsParser : babelParser,
});
let changed = false;
recast.visit(ast, {
visitCallExpression(path) {
const { callee, arguments: args } = path.node;
if (
n.MemberExpression.check(callee) &&
!callee.computed &&
n.Identifier.check(callee.object) &&
callee.object.name === "_" &&
n.Identifier.check(callee.property) &&
callee.property.name === "map" &&
args.length === 2 &&
checkExpression(args[0]) &&
checkExpression(args[1])
) {
const [arr, fn] = args;
path.replace(
b.callExpression(b.memberExpression(arr, b.identifier("map")), [
n.FunctionExpression.check(fn) ||
n.ArrowFunctionExpression.check(fn)
? b.arrowFunctionExpression(
fn.params,
n.BlockStatement.check(fn.body) &&
fn.body.body.length === 1 &&
n.ReturnStatement.check(fn.body.body[0])
? fn.body.body[0].argument || b.identifier("undefined")
: fn.body
)
: fn,
])
);
changed = true;
}
this.traverse(path);
},
});
if (changed) {
console.log("Writing", file);
fs.writeFileSync(file, recast.print(ast).code, { encoding: "utf8" });
}
}
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-02-08 02:43:49 +01:00
operator : op [ 0 ] ,
operand : op [ 1 ] ,
} ) ) ;
2024-02-13 03:44:04 +01:00
message _lists . set _current ( {
data : {
filter : new Filter ( terms ) ,
2024-07-08 19:00:08 +02:00
fetch _status : {
has _found _newest : ( ) => true ,
} ,
2024-02-13 03:44:04 +01:00
} ,
} ) ;
2013-09-18 19:01:21 +02:00
}
2019-11-02 00:06:25 +01:00
const me = {
2020-07-15 01:29:15 +02:00
email : "me@example.com" ,
2018-10-18 19:41:44 +02:00
user _id : 5 ,
2020-07-15 01:29:15 +02:00
full _name : "Me Myself" ,
2018-10-18 19:41:44 +02:00
} ;
2019-11-02 00:06:25 +01:00
const alice = {
2020-07-15 01:29:15 +02:00
email : "alice@example.com" ,
2018-05-28 14:10:33 +02:00
user _id : 23 ,
2020-07-15 01:29:15 +02:00
full _name : "Alice Smith" ,
2018-05-28 14:10:33 +02:00
} ;
2019-11-02 00:06:25 +01:00
const ray = {
2020-07-15 01:29:15 +02:00
email : "ray@example.com" ,
2018-05-28 14:10:33 +02:00
user _id : 22 ,
2020-07-15 01:29:15 +02:00
full _name : "Raymond" ,
2018-05-28 14:10:33 +02:00
} ;
2022-11-04 14:39:50 +01:00
const bot = {
email : "bot@example.com" ,
user _id : 25 ,
full _name : "Example Bot" ,
is _bot : true ,
} ;
2024-07-08 19:00:08 +02:00
const nobody = {
name : "role:nobody" ,
id : 1 ,
members : new Set ( [ ] ) ,
is _system _group : true ,
direct _subgroup _ids : new Set ( [ ] ) ,
} ;
const everyone = {
name : "role:everyone" ,
id : 2 ,
members : new Set ( [ 5 ] ) ,
is _system _group : true ,
direct _subgroup _ids : new Set ( [ ] ) ,
} ;
user _groups . initialize ( { realm _user _groups : [ nobody , everyone ] } ) ;
2021-09-01 18:23:28 +02:00
run _test ( "empty_narrow_html" , ( { mock _template } ) => {
2023-06-29 21:59:08 +02:00
mock _template ( "empty_feed_notice.hbs" , true , ( _data , html ) => html ) ;
2021-09-01 18:23:28 +02:00
let actual _html = empty _narrow _html ( "This is a title" , "<h1> This is the html </h1>" ) ;
assert . equal (
actual _html ,
` <div class="empty_feed_notice">
2023-10-20 13:39:47 +02:00
< h4 class = "empty-feed-notice-title" > This is a title < / h 4 >
< div class = "empty-feed-notice-description" >
< h1 > This is the html < / h 1 >
< / d i v >
2021-09-01 18:23:28 +02:00
< / d i v >
` ,
) ;
const search _data _with _all _search _types = {
topic _query : "test" ,
stream _query : "new" ,
has _stop _word : true ,
query _words : [
{ query _word : "search" , is _stop _word : false } ,
{ query _word : "a" , is _stop _word : true } ,
] ,
} ;
actual _html = empty _narrow _html (
"This is a title" ,
undefined ,
search _data _with _all _search _types ,
) ;
assert . equal (
actual _html ,
` <div class="empty_feed_notice">
2023-10-20 13:39:47 +02:00
< h4 class = "empty-feed-notice-title" > This is a title < / h 4 >
< div class = "empty-feed-notice-description" >
Some common words were excluded from your search . < br / > You searched for :
< span > stream : new < / s p a n >
< span > topic : test < / s p a n >
< span > search < / s p a n >
< del > a < / d e l >
2021-09-01 18:23:28 +02:00
< / d i v >
< / d i v >
` ,
) ;
const search _data _with _stream _without _stop _words = {
has _stop _word : false ,
stream _query : "hello world" ,
query _words : [ { query _word : "searchA" , is _stop _word : false } ] ,
} ;
actual _html = empty _narrow _html (
"This is a title" ,
undefined ,
search _data _with _stream _without _stop _words ,
) ;
assert . equal (
actual _html ,
` <div class="empty_feed_notice">
2023-10-20 13:39:47 +02:00
< h4 class = "empty-feed-notice-title" > This is a title < / h 4 >
< div class = "empty-feed-notice-description" >
You searched for :
< span > stream : hello world < / s p a n >
< span > searchA < / s p a n >
2021-09-01 18:23:28 +02:00
< / d i v >
< / d i v >
` ,
) ;
const search _data _with _topic _without _stop _words = {
has _stop _word : false ,
topic _query : "hello" ,
query _words : [ { query _word : "searchB" , is _stop _word : false } ] ,
} ;
actual _html = empty _narrow _html (
"This is a title" ,
undefined ,
search _data _with _topic _without _stop _words ,
) ;
assert . equal (
actual _html ,
` <div class="empty_feed_notice">
2023-10-20 13:39:47 +02:00
< h4 class = "empty-feed-notice-title" > This is a title < / h 4 >
< div class = "empty-feed-notice-description" >
You searched for :
< span > topic : hello < / s p a n >
< span > searchB < / s p a n >
2021-09-01 18:23:28 +02:00
< / d i v >
< / d i v >
` ,
) ;
} ) ;
2023-04-07 11:23:26 +02:00
run _test ( "urls" , ( ) => {
2020-05-26 22:34:15 +02:00
people . add _active _user ( ray ) ;
people . add _active _user ( alice ) ;
people . add _active _user ( me ) ;
2018-10-18 19:41:44 +02:00
people . initialize _current _user ( me . user _id ) ;
2017-01-06 14:42:52 +01:00
2022-03-01 19:14:26 +01:00
let url = hash _util . pm _with _url ( ray . email ) ;
2023-04-11 21:04:33 +02:00
assert . equal ( url , "#narrow/dm/22-Raymond" ) ;
2017-01-06 14:42:52 +01:00
2024-06-11 21:45:05 +02:00
url = hash _util . direct _message _group _with _url ( "22,23" ) ;
2023-04-11 21:04:33 +02:00
assert . equal ( url , "#narrow/dm/22,23-group" ) ;
2017-01-06 14:42:52 +01:00
2022-03-01 19:14:26 +01:00
url = hash _util . by _sender _url ( ray . email ) ;
2022-10-25 14:38:45 +02:00
assert . equal ( url , "#narrow/sender/22-Raymond" ) ;
2017-01-19 03:53:50 +01:00
2023-04-11 21:04:33 +02:00
let emails = hash _util . decode _operand ( "dm" , "22,23-group" ) ;
assert . equal ( emails , "alice@example.com,ray@example.com" ) ;
emails = hash _util . decode _operand ( "dm" , "5,22,23-group" ) ;
assert . equal ( emails , "alice@example.com,ray@example.com" ) ;
emails = hash _util . decode _operand ( "dm" , "5-group" ) ;
assert . equal ( emails , "me@example.com" ) ;
// Even though we renamed "pm-with" to "dm", preexisting
// links/URLs with "pm-with" operator are decoded correctly.
emails = hash _util . decode _operand ( "pm-with" , "22,23-group" ) ;
2020-07-15 01:29:15 +02:00
assert . equal ( emails , "alice@example.com,ray@example.com" ) ;
2018-10-18 19:41:44 +02:00
2020-12-01 00:57:57 +01:00
emails = hash _util . decode _operand ( "pm-with" , "5,22,23-group" ) ;
2020-07-15 01:29:15 +02:00
assert . equal ( emails , "alice@example.com,ray@example.com" ) ;
2018-10-18 19:41:44 +02:00
2020-12-01 00:57:57 +01:00
emails = hash _util . decode _operand ( "pm-with" , "5-group" ) ;
2020-07-15 01:29:15 +02:00
assert . equal ( emails , "me@example.com" ) ;
2018-05-15 12:40:07 +02:00
} ) ;
2017-01-25 19:13:10 +01:00
2024-10-09 22:20:06 +02:00
run _test ( "show_empty_narrow_message" , ( { mock _template , override } ) => {
override ( realm , "stop_words" , [ ] ) ;
2021-04-03 19:07:13 +02:00
2023-06-29 21:59:08 +02:00
mock _template ( "empty_feed_notice.hbs" , true , ( _data , html ) => html ) ;
2021-09-01 18:23:28 +02:00
2024-02-13 03:44:04 +01:00
message _lists . set _current ( undefined ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2022-12-08 12:35:49 +01:00
"translated: There are no messages here." ,
2021-09-01 18:23:28 +02:00
'translated HTML: Why not <a href="#" class="empty_feed_compose_stream">start the conversation</a>?' ,
) ,
) ;
2017-01-25 19:13:10 +01:00
// for non-existent or private stream
2024-08-03 03:05:34 +02:00
set _filter ( [ [ "stream" , "999" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2024-10-13 08:24:20 +02:00
empty _narrow _html (
"translated: This channel doesn't exist, or you are not allowed to view it." ,
) ,
2021-09-01 18:23:28 +02:00
) ;
2017-01-25 19:13:10 +01:00
2024-10-13 08:21:52 +02:00
set _filter ( [
[ "stream" , "999" ] ,
[ "topic" , "foo" ] ,
[ "near" , "99" ] ,
] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
"translated: This channel doesn't exist, or you are not allowed to view it." ,
) ,
) ;
2022-04-28 05:15:11 +02:00
// for non-subbed public stream
2024-08-03 03:05:34 +02:00
const rome _id = 99 ;
stream _data . add _sub ( { name : "ROME" , stream _id : rome _id } ) ;
set _filter ( [ [ "stream" , rome _id . toString ( ) ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2024-04-18 15:16:21 +02:00
"translated: There are no messages here." ,
'translated HTML: Why not <a href="#" class="empty_feed_compose_stream">start the conversation</a>?' ,
2021-09-01 18:23:28 +02:00
) ,
) ;
2017-01-25 19:13:10 +01:00
2022-04-28 05:15:11 +02:00
// for non-web-public stream for spectator
2022-02-15 12:25:11 +01:00
page _params . is _spectator = true ;
2024-08-03 03:05:34 +02:00
set _filter ( [ [ "stream" , rome _id . toString ( ) ] ] ) ;
2022-02-15 12:25:11 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
"" ,
2023-05-02 04:30:33 +02:00
'translated HTML: This is not a <a target="_blank" rel="noopener noreferrer" href="/help/public-access-option">publicly accessible</a> conversation.' ,
2022-02-15 12:25:11 +01:00
) ,
) ;
set _filter ( [
2024-08-03 03:05:34 +02:00
[ "stream" , rome _id . toString ( ) ] ,
2022-02-15 12:25:11 +01:00
[ "topic" , "foo" ] ,
] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
"" ,
2023-05-02 04:30:33 +02:00
'translated HTML: This is not a <a target="_blank" rel="noopener noreferrer" href="/help/public-access-option">publicly accessible</a> conversation.' ,
2022-02-15 12:25:11 +01:00
) ,
) ;
2022-04-29 12:50:45 +02:00
// for web-public stream for spectator
2024-08-03 03:05:34 +02:00
const web _public _id = 1231 ;
stream _data . add _sub ( { name : "web-public-stream" , stream _id : web _public _id , is _web _public : true } ) ;
2022-04-29 12:50:45 +02:00
set _filter ( [
2024-08-03 03:05:34 +02:00
[ "stream" , web _public _id . toString ( ) ] ,
2022-04-29 12:50:45 +02:00
[ "topic" , "foo" ] ,
] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2023-09-12 04:26:25 +02:00
empty _narrow _html ( "translated: There are no messages here." ) ,
2022-04-29 12:50:45 +02:00
) ;
2022-02-15 12:25:11 +01:00
page _params . is _spectator = false ;
2020-07-15 01:29:15 +02:00
set _filter ( [ [ "is" , "starred" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-04-20 16:05:21 +02:00
"translated: You have no starred messages." ,
2024-06-25 16:56:23 +02:00
'translated HTML: Starring messages is a good way to keep track of important messages, such as tasks you need to go back to, or useful references. To star a message, hover over a message and click the <i class="zulip-icon zulip-icon-star" aria-hidden="true"></i>. <a target="_blank" rel="noopener noreferrer" href="/help/star-a-message">Learn more</a>' ,
2021-09-01 18:23:28 +02:00
) ,
) ;
2017-01-25 19:13:10 +01:00
2020-07-15 01:29:15 +02:00
set _filter ( [ [ "is" , "mentioned" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2024-06-25 16:53:58 +02:00
"translated: This view will show messages where you are mentioned." ,
2024-07-10 00:50:53 +02:00
'translated HTML: To call attention to a message, you can mention a user, a group, topic participants, or all subscribers to a channel. Type @ in the compose box, and choose who you\'d like to mention from the list of suggestions. <a target="_blank" rel="noopener noreferrer" href="/help/mention-a-user-or-group">Learn more</a>' ,
2021-09-01 18:23:28 +02:00
) ,
) ;
2017-01-25 19:13:10 +01:00
2024-10-09 22:20:06 +02:00
override ( realm , "realm_direct_message_permission_group" , everyone . id ) ;
override ( realm , "realm_direct_message_initiator_group" , everyone . id ) ;
2023-04-07 14:03:34 +02:00
set _filter ( [ [ "is" , "dm" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-01-24 19:49:56 +01:00
"translated: You have no direct messages yet!" ,
2021-09-01 18:23:28 +02:00
'translated HTML: Why not <a href="#" class="empty_feed_compose_private">start the conversation</a>?' ,
) ,
) ;
2017-01-25 19:13:10 +01:00
2020-07-15 01:29:15 +02:00
set _filter ( [ [ "is" , "unread" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: You have no unread messages!" ) ,
) ;
2017-06-18 23:50:00 +02:00
2021-07-13 10:11:51 +02:00
set _filter ( [ [ "is" , "resolved" ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: No topics are marked as resolved." ) ,
) ;
2021-07-13 10:11:51 +02:00
2023-10-25 19:44:52 +02:00
set _filter ( [ [ "is" , "followed" ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: You aren't following any topics." ) ,
) ;
2023-04-07 14:03:34 +02:00
// organization has disabled sending direct messages
2024-10-09 22:20:06 +02:00
override ( realm , "realm_direct_message_permission_group" , nobody . id ) ;
2022-10-31 20:40:22 +01:00
// prioritize information about invalid user(s) in narrow/search
2023-04-11 21:04:33 +02:00
set _filter ( [ [ "dm" , [ "Yo" ] ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: This user does not exist!" ) ,
) ;
2018-05-28 14:10:33 +02:00
2020-05-26 22:34:15 +02:00
people . add _active _user ( alice ) ;
2023-04-11 21:04:33 +02:00
set _filter ( [ [ "dm" , [ "alice@example.com" , "Yo" ] ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: One or more of these users do not exist!" ) ,
) ;
2017-01-25 19:13:10 +01:00
2023-04-11 21:04:33 +02:00
set _filter ( [ [ "dm" , "alice@example.com" ] ] ) ;
2022-10-31 20:40:22 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2024-07-08 19:00:08 +02:00
"translated: Direct messages are disabled in this organization." ,
'translated HTML: <a target="_blank" rel="noopener noreferrer" href="/help/restrict-direct-messages">Learn more.</a>' ,
2022-10-31 20:40:22 +01:00
) ,
) ;
2023-04-07 14:03:34 +02:00
// direct messages with a bot are possible even though
// the organization has disabled sending direct messages
2022-11-04 14:39:50 +01:00
people . add _active _user ( bot ) ;
2023-04-11 21:04:33 +02:00
set _filter ( [ [ "dm" , "bot@example.com" ] ] ) ;
2022-11-04 14:39:50 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-01-24 19:49:56 +01:00
"translated: You have no direct messages with Example Bot yet." ,
2022-11-04 14:39:50 +01:00
'translated HTML: Why not <a href="#" class="empty_feed_compose_private">start the conversation</a>?' ,
) ,
) ;
2023-04-07 14:03:34 +02:00
// group direct messages with bots are not possible when
// sending direct messages is disabled
2023-04-11 21:04:33 +02:00
set _filter ( [ [ "dm" , bot . email + "," + alice . email ] ] ) ;
2022-11-04 14:39:50 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2024-07-08 19:00:08 +02:00
"translated: Direct messages are disabled in this organization." ,
'translated HTML: <a target="_blank" rel="noopener noreferrer" href="/help/restrict-direct-messages">Learn more.</a>' ,
2022-11-04 14:39:50 +01:00
) ,
) ;
2023-04-07 14:03:34 +02:00
// sending direct messages enabled
2024-10-09 22:20:06 +02:00
override ( realm , "realm_direct_message_permission_group" , everyone . id ) ;
2023-04-11 21:04:33 +02:00
set _filter ( [ [ "dm" , "alice@example.com" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-01-24 19:49:56 +01:00
"translated: You have no direct messages with Alice Smith yet." ,
2021-09-01 18:23:28 +02:00
'translated HTML: Why not <a href="#" class="empty_feed_compose_private">start the conversation</a>?' ,
) ,
) ;
2017-01-25 19:13:10 +01:00
2024-08-13 19:32:06 +02:00
// sending direct messages to deactivated user
2024-10-09 22:20:06 +02:00
override ( realm , "realm_direct_message_permission_group" , everyone . id ) ;
2024-08-13 19:32:06 +02:00
people . deactivate ( alice ) ;
set _filter ( [ [ "dm" , alice . email ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: You have no direct messages with Alice Smith." ) ,
) ;
people . add _active _user ( alice ) ;
2021-03-31 19:19:02 +02:00
people . add _active _user ( me ) ;
people . initialize _current _user ( me . user _id ) ;
2023-04-11 21:04:33 +02:00
set _filter ( [ [ "dm" , me . email ] ] ) ;
2021-03-31 19:19:02 +02:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-01-24 19:49:56 +01:00
"translated: You have not sent any direct messages to yourself yet!" ,
2024-02-27 03:43:21 +01:00
"translated HTML: Use this space for personal notes, or to test out Zulip features." ,
2021-09-01 18:23:28 +02:00
) ,
) ;
2021-03-31 19:19:02 +02:00
2023-04-11 21:04:33 +02:00
set _filter ( [ [ "dm" , me . email + "," + alice . email ] ] ) ;
2021-03-31 20:26:13 +02:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-01-24 19:49:56 +01:00
"translated: You have no direct messages with these users yet." ,
2021-09-01 18:23:28 +02:00
'translated HTML: Why not <a href="#" class="empty_feed_compose_private">start the conversation</a>?' ,
) ,
) ;
2021-03-31 20:26:13 +02:00
2024-08-13 19:32:06 +02:00
// group dm with a deactivated user
people . deactivate ( alice ) ;
set _filter ( [ [ "dm" , ray . email + "," + alice . email ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: You have no direct messages with these users." ) ,
) ;
people . add _active _user ( alice ) ;
2023-04-19 17:35:32 +02:00
// organization has disabled sending direct messages
2024-10-09 22:20:06 +02:00
override ( realm , "realm_direct_message_permission_group" , nobody . id ) ;
2023-04-19 17:35:32 +02:00
// prioritize information about invalid user in narrow/search
set _filter ( [ [ "dm-including" , [ "Yo" ] ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: This user does not exist!" ) ,
) ;
set _filter ( [ [ "dm-including" , "alice@example.com" ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2024-07-08 19:00:08 +02:00
"translated: Direct messages are disabled in this organization." ,
'translated HTML: <a target="_blank" rel="noopener noreferrer" href="/help/restrict-direct-messages">Learn more.</a>' ,
2023-04-19 17:35:32 +02:00
) ,
) ;
// direct messages with a bot are possible even though
// the organization has disabled sending direct messages
set _filter ( [ [ "dm-including" , "bot@example.com" ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2023-05-11 01:25:20 +02:00
empty _narrow _html ( "translated: You have no direct messages including Example Bot yet." ) ,
2023-04-19 17:35:32 +02:00
) ;
// sending direct messages enabled
2024-10-09 22:20:06 +02:00
override ( realm , "realm_direct_message_permission_group" , everyone . id ) ;
override ( realm , "realm_direct_message_permission_group" , everyone . id ) ;
2023-04-19 17:35:32 +02:00
set _filter ( [ [ "dm-including" , "alice@example.com" ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2023-05-11 01:25:20 +02:00
empty _narrow _html ( "translated: You have no direct messages including Alice Smith yet." ) ,
2023-04-19 17:35:32 +02:00
) ;
set _filter ( [ [ "dm-including" , me . email ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: You don't have any direct message conversations yet." ) ,
) ;
2020-07-15 01:29:15 +02:00
set _filter ( [ [ "sender" , "ray@example.com" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2022-11-22 14:03:12 +01:00
empty _narrow _html ( "translated: You haven't received any messages sent by Raymond yet." ) ,
2021-09-01 18:23:28 +02:00
) ;
2017-01-25 19:13:10 +01:00
2020-07-15 01:29:15 +02:00
set _filter ( [ [ "sender" , "sinwar@example.com" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html ( "translated: This user does not exist!" ) ,
) ;
2021-03-31 18:31:49 +02:00
set _filter ( [
[ "sender" , "alice@example.com" ] ,
2024-08-03 03:05:34 +02:00
[ "stream" , rome _id . toString ( ) ] ,
2021-03-31 18:31:49 +02:00
] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2023-03-16 14:56:35 +01:00
empty _narrow _html ( "translated: No search results." ) ,
2021-09-01 18:23:28 +02:00
) ;
2021-03-31 18:44:00 +02:00
set _filter ( [ [ "is" , "invalid" ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2022-12-08 12:35:49 +01:00
"translated: There are no messages here." ,
2021-09-01 18:23:28 +02:00
'translated HTML: Why not <a href="#" class="empty_feed_compose_stream">start the conversation</a>?' ,
) ,
) ;
2021-03-31 18:51:39 +02:00
2024-08-03 03:05:34 +02:00
const my _stream _id = 103 ;
2021-03-31 19:04:05 +02:00
const my _stream = {
name : "my stream" ,
2024-08-03 03:05:34 +02:00
stream _id : my _stream _id ,
2021-03-31 19:04:05 +02:00
} ;
stream _data . add _sub ( my _stream ) ;
stream _data . subscribe _myself ( my _stream ) ;
2024-08-03 03:05:34 +02:00
set _filter ( [ [ "stream" , my _stream _id . toString ( ) ] ] ) ;
2021-03-31 19:04:05 +02:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2022-12-08 12:35:49 +01:00
"translated: There are no messages here." ,
2021-09-01 18:23:28 +02:00
'translated HTML: Why not <a href="#" class="empty_feed_compose_stream">start the conversation</a>?' ,
) ,
) ;
2021-03-31 19:04:05 +02:00
2021-03-31 18:51:39 +02:00
set _filter ( [ [ "stream" , "" ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2024-10-13 08:24:20 +02:00
empty _narrow _html (
"translated: This channel doesn't exist, or you are not allowed to view it." ,
) ,
2021-09-01 18:23:28 +02:00
) ;
2024-02-28 12:24:44 +01:00
set _filter ( [
[ "has" , "reaction" ] ,
[ "sender" , "me" ] ,
] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
"translated: None of your messages have emoji reactions yet." ,
'translated HTML: Learn more about emoji reactions <a target="_blank" rel="noopener noreferrer" href="/help/emoji-reactions">here</a>.' ,
) ,
) ;
2021-09-01 18:23:28 +02:00
} ) ;
2024-10-09 22:20:06 +02:00
run _test ( "show_empty_narrow_message_with_search" , ( { mock _template , override } ) => {
override ( realm , "stop_words" , [ ] ) ;
2021-09-01 18:23:28 +02:00
2023-06-29 21:59:08 +02:00
mock _template ( "empty_feed_notice.hbs" , true , ( _data , html ) => html ) ;
2021-09-01 18:23:28 +02:00
2024-02-13 03:44:04 +01:00
message _lists . set _current ( undefined ) ;
2021-09-01 18:23:28 +02:00
set _filter ( [ [ "search" , "grail" ] ] ) ;
narrow _banner . show _empty _narrow _message ( ) ;
assert . match ( $ ( ".empty_feed_notice_main" ) . html ( ) , /<span>grail<\/span>/ ) ;
2019-03-07 09:27:45 +01:00
} ) ;
2021-03-31 18:06:29 +02:00
run _test ( "hide_empty_narrow_message" , ( ) => {
narrow _banner . hide _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal ( $ ( ".empty_feed_notice" ) . text ( ) , "never-been-set" ) ;
2021-03-31 18:06:29 +02:00
} ) ;
2024-10-09 22:20:06 +02:00
run _test ( "show_search_stopwords" , ( { mock _template , override } ) => {
override ( realm , "stop_words" , [ "what" , "about" ] ) ;
2021-04-03 19:07:13 +02:00
2023-06-29 21:59:08 +02:00
mock _template ( "empty_feed_notice.hbs" , true , ( _data , html ) => html ) ;
2019-01-28 17:44:48 +01:00
2021-09-01 18:23:28 +02:00
const expected _search _data = {
has _stop _word : true ,
query _words : [
{ query _word : "what" , is _stop _word : true } ,
{ query _word : "about" , is _stop _word : true } ,
{ query _word : "grail" , is _stop _word : false } ,
] ,
2019-01-28 17:44:48 +01:00
} ;
2024-02-13 03:44:04 +01:00
message _lists . set _current ( undefined ) ;
2020-07-15 01:29:15 +02:00
set _filter ( [ [ "search" , "what about grail" ] ] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2023-03-16 14:56:35 +01:00
empty _narrow _html ( "translated: No search results." , undefined , expected _search _data ) ,
2021-09-01 18:23:28 +02:00
) ;
2019-03-07 09:27:45 +01:00
2024-08-03 03:05:34 +02:00
const streamA _id = 88 ;
stream _data . add _sub ( { name : "streamA" , stream _id : streamA _id } ) ;
2021-09-01 18:23:28 +02:00
const expected _stream _search _data = {
has _stop _word : true ,
stream _query : "streamA" ,
query _words : [
{ query _word : "what" , is _stop _word : true } ,
{ query _word : "about" , is _stop _word : true } ,
{ query _word : "grail" , is _stop _word : false } ,
] ,
} ;
2020-07-15 00:34:28 +02:00
set _filter ( [
2024-08-03 03:05:34 +02:00
[ "stream" , streamA _id . toString ( ) ] ,
2020-07-15 00:34:28 +02:00
[ "search" , "what about grail" ] ,
] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
2023-03-16 14:56:35 +01:00
empty _narrow _html ( "translated: No search results." , undefined , expected _stream _search _data ) ,
2021-09-01 18:23:28 +02:00
) ;
2019-03-07 09:27:45 +01:00
2021-09-01 18:23:28 +02:00
const expected _stream _topic _search _data = {
has _stop _word : true ,
stream _query : "streamA" ,
topic _query : "topicA" ,
query _words : [
{ query _word : "what" , is _stop _word : true } ,
{ query _word : "about" , is _stop _word : true } ,
{ query _word : "grail" , is _stop _word : false } ,
] ,
} ;
2020-07-15 00:34:28 +02:00
set _filter ( [
2024-08-03 03:05:34 +02:00
[ "stream" , streamA _id . toString ( ) ] ,
2020-07-15 00:34:28 +02:00
[ "topic" , "topicA" ] ,
[ "search" , "what about grail" ] ,
] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2021-09-01 18:23:28 +02:00
assert . equal (
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-03-16 14:56:35 +01:00
"translated: No search results." ,
2021-09-01 18:23:28 +02:00
undefined ,
expected _stream _topic _search _data ,
) ,
) ;
2018-05-15 12:40:07 +02:00
} ) ;
2018-11-30 00:20:10 +01:00
2021-09-01 18:23:28 +02:00
run _test ( "show_invalid_narrow_message" , ( { mock _template } ) => {
2024-02-13 03:44:04 +01:00
message _lists . set _current ( undefined ) ;
2023-06-29 21:59:08 +02:00
mock _template ( "empty_feed_notice.hbs" , true , ( _data , html ) => html ) ;
2019-03-07 09:12:00 +01:00
2024-08-03 03:05:34 +02:00
const streamA _id = 88 ;
const streamB _id = 77 ;
stream _data . add _sub ( { name : "streamA" , stream _id : streamA _id } ) ;
stream _data . add _sub ( { name : "streamB" , stream _id : streamB _id } ) ;
2019-03-07 09:12:00 +01:00
2020-07-15 00:34:28 +02:00
set _filter ( [
2024-08-03 03:05:34 +02:00
[ "stream" , streamA _id . toString ( ) ] ,
[ "stream" , streamB _id . toString ( ) ] ,
2020-07-15 00:34:28 +02:00
] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2020-07-15 00:34:28 +02:00
assert . equal (
2021-09-01 18:23:28 +02:00
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-03-16 14:56:35 +01:00
"translated: No search results." ,
2024-04-18 15:16:21 +02:00
"translated HTML: <p>You are searching for messages that belong to more than one channel, which is not possible.</p>" ,
2021-09-01 18:23:28 +02:00
) ,
2020-07-15 00:34:28 +02:00
) ;
2019-03-07 09:12:00 +01:00
2020-07-15 00:34:28 +02:00
set _filter ( [
[ "topic" , "topicA" ] ,
[ "topic" , "topicB" ] ,
] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2020-07-15 00:34:28 +02:00
assert . equal (
2021-09-01 18:23:28 +02:00
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-03-16 14:56:35 +01:00
"translated: No search results." ,
2021-09-01 18:23:28 +02:00
"translated HTML: <p>You are searching for messages that belong to more than one topic, which is not possible.</p>" ,
) ,
2020-07-15 00:34:28 +02:00
) ;
2019-03-07 09:12:00 +01:00
2020-05-26 22:34:15 +02:00
people . add _active _user ( ray ) ;
people . add _active _user ( alice ) ;
2019-03-07 09:12:00 +01:00
2020-07-15 00:34:28 +02:00
set _filter ( [
[ "sender" , "alice@example.com" ] ,
[ "sender" , "ray@example.com" ] ,
] ) ;
2021-03-26 15:21:47 +01:00
narrow _banner . show _empty _narrow _message ( ) ;
2020-07-15 00:34:28 +02:00
assert . equal (
2021-09-01 18:23:28 +02:00
$ ( ".empty_feed_notice_main" ) . html ( ) ,
empty _narrow _html (
2023-03-16 14:56:35 +01:00
"translated: No search results." ,
2021-09-01 18:23:28 +02:00
"translated HTML: <p>You are searching for messages that are sent by more than one person, which is not possible.</p>" ,
) ,
2020-07-15 00:34:28 +02:00
) ;
2019-03-07 09:12:00 +01:00
} ) ;
2023-10-05 08:04:23 +02:00
run _test ( "narrow_to_compose_target errors" , ( { disallow _rewire } ) => {
2024-06-05 10:51:22 +02:00
disallow _rewire ( message _view , "show" ) ;
2018-11-30 00:20:10 +01:00
// No-op when not composing.
2024-01-07 23:28:42 +01:00
compose _state . set _message _type ( undefined ) ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
// No-op when empty stream.
2021-02-24 15:39:43 +01:00
compose _state . set _message _type ( "stream" ) ;
2023-06-27 01:40:25 +02:00
compose _state . set _stream _id ( "" ) ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2021-02-24 15:39:43 +01:00
} ) ;
2022-01-08 10:27:06 +01:00
run _test ( "narrow_to_compose_target streams" , ( { override _rewire } ) => {
2021-02-24 15:39:43 +01:00
const args = { called : false } ;
2024-06-05 10:51:22 +02:00
override _rewire ( message _view , "show" , ( terms , opts ) => {
2023-12-22 00:26:14 +01:00
args . terms = terms ;
2021-02-24 15:39:43 +01:00
args . opts = opts ;
args . called = true ;
} ) ;
2018-11-30 00:20:10 +01:00
2021-02-24 15:39:43 +01:00
compose _state . set _message _type ( "stream" ) ;
2024-08-03 03:05:34 +02:00
const rome _id = 99 ;
stream _data . add _sub ( { name : "ROME" , stream _id : rome _id } ) ;
2023-06-27 01:40:25 +02:00
compose _state . set _stream _id ( 99 ) ;
2018-11-30 00:20:10 +01:00
// Test with existing topic
2021-02-24 15:39:43 +01:00
compose _state . topic ( "one" ) ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2020-07-15 01:29:15 +02:00
assert . equal ( args . opts . trigger , "narrow_to_compose_target" ) ;
2023-12-22 00:26:14 +01:00
assert . deepEqual ( args . terms , [
2024-08-03 03:05:34 +02:00
{ operator : "channel" , operand : rome _id . toString ( ) } ,
2020-07-15 01:29:15 +02:00
{ operator : "topic" , operand : "one" } ,
2018-11-30 00:20:10 +01:00
] ) ;
// Test with new topic
2021-02-24 15:39:43 +01:00
compose _state . topic ( "four" ) ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2023-12-22 00:26:14 +01:00
assert . deepEqual ( args . terms , [
2024-08-03 03:05:34 +02:00
{ operator : "channel" , operand : rome _id . toString ( ) } ,
2021-07-05 18:48:06 +02:00
{ operator : "topic" , operand : "four" } ,
] ) ;
2018-11-30 00:20:10 +01:00
// Test with blank topic
2021-02-24 15:39:43 +01:00
compose _state . topic ( "" ) ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2024-08-03 03:05:34 +02:00
assert . deepEqual ( args . terms , [ { operator : "channel" , operand : rome _id . toString ( ) } ] ) ;
2018-11-30 00:20:10 +01:00
// Test with no topic
2021-02-24 15:39:43 +01:00
compose _state . topic ( undefined ) ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2024-08-03 03:05:34 +02:00
assert . deepEqual ( args . terms , [ { operator : "channel" , operand : rome _id . toString ( ) } ] ) ;
2021-02-24 15:39:43 +01:00
} ) ;
2018-11-30 00:20:10 +01:00
2023-04-11 21:04:33 +02:00
run _test ( "narrow_to_compose_target direct messages" , ( { override , override _rewire } ) => {
2021-02-24 15:39:43 +01:00
const args = { called : false } ;
2024-06-05 10:51:22 +02:00
override _rewire ( message _view , "show" , ( terms , opts ) => {
2023-12-22 00:26:14 +01:00
args . terms = terms ;
2021-02-24 15:39:43 +01:00
args . opts = opts ;
args . called = true ;
} ) ;
let emails ;
2022-07-10 01:06:33 +02:00
override ( compose _pm _pill , "get_emails" , ( ) => emails ) ;
2021-02-24 15:39:43 +01:00
compose _state . set _message _type ( "private" ) ;
2020-05-26 22:34:15 +02:00
people . add _active _user ( ray ) ;
people . add _active _user ( alice ) ;
people . add _active _user ( me ) ;
2018-11-30 00:20:10 +01:00
// Test with valid person
2021-02-24 15:39:43 +01:00
emails = "alice@example.com" ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2023-12-22 00:26:14 +01:00
assert . deepEqual ( args . terms , [ { operator : "dm" , operand : "alice@example.com" } ] ) ;
2018-11-30 00:20:10 +01:00
// Test with valid persons
2021-02-24 15:39:43 +01:00
emails = "alice@example.com,ray@example.com" ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2023-12-22 00:26:14 +01:00
assert . deepEqual ( args . terms , [ { operator : "dm" , operand : "alice@example.com,ray@example.com" } ] ) ;
2018-11-30 00:20:10 +01:00
2020-03-28 01:25:56 +01:00
// Test with some invalid persons
2021-02-24 15:39:43 +01:00
emails = "alice@example.com,random,ray@example.com" ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2023-12-22 00:26:14 +01:00
assert . deepEqual ( args . terms , [ { operator : "is" , operand : "dm" } ] ) ;
2018-11-30 00:20:10 +01:00
2020-03-28 01:25:56 +01:00
// Test with all invalid persons
2021-02-24 15:39:43 +01:00
emails = "alice,random,ray" ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2023-12-22 00:26:14 +01:00
assert . deepEqual ( args . terms , [ { operator : "is" , operand : "dm" } ] ) ;
2018-11-30 00:20:10 +01:00
// Test with no persons
2021-02-24 15:39:43 +01:00
emails = "" ;
2018-11-30 00:20:10 +01:00
args . called = false ;
2024-06-05 10:51:22 +02:00
message _view . to _compose _target ( ) ;
2018-11-30 00:20:10 +01:00
assert . equal ( args . called , true ) ;
2023-12-22 00:26:14 +01:00
assert . deepEqual ( args . terms , [ { operator : "is" , operand : "dm" } ] ) ;
2018-11-30 00:20:10 +01:00
} ) ;
2022-12-15 15:03:56 +01:00
2023-10-05 18:40:10 +02:00
run _test ( "narrow_compute_title" , ( ) => {
2022-12-15 15:03:56 +01:00
// Only tests cases where the narrow title is different from the filter title.
let filter ;
2023-10-05 18:40:10 +02:00
// Recent conversations & Inbox have `undefined` filter.
2022-12-15 15:22:33 +01:00
filter = undefined ;
2023-10-05 18:40:10 +02:00
recent _view _util . set _visible ( true ) ;
inbox _util . set _visible ( false ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "translated: Recent conversations" ) ;
2022-12-15 15:22:33 +01:00
2023-10-05 18:40:10 +02:00
recent _view _util . set _visible ( false ) ;
inbox _util . set _visible ( true ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "translated: Inbox" ) ;
2023-10-05 18:40:10 +02:00
inbox _util . set _visible ( false ) ;
filter = new Filter ( [ { operator : "in" , operand : "home" } ] ) ;
2024-04-02 13:10:48 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "translated: Combined feed" ) ;
2022-12-15 15:22:33 +01:00
2022-12-15 15:03:56 +01:00
// Search & uncommon narrows
filter = new Filter ( [ { operator : "search" , operand : "potato" } ] ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "translated: Search results" ) ;
2022-12-15 15:03:56 +01:00
filter = new Filter ( [ { operator : "sender" , operand : "me" } ] ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "translated: Messages sent by you" ) ;
2022-12-15 15:03:56 +01:00
// Stream narrows
2024-08-03 03:05:34 +02:00
const foo _stream _id = 43 ;
2022-12-15 15:03:56 +01:00
const sub = {
name : "Foo" ,
2024-08-03 03:05:34 +02:00
stream _id : foo _stream _id ,
2022-12-15 15:03:56 +01:00
} ;
stream _data . add _sub ( sub ) ;
filter = new Filter ( [
2024-08-03 03:05:34 +02:00
{ operator : "stream" , operand : foo _stream _id . toString ( ) } ,
2022-12-15 15:03:56 +01:00
{ operator : "topic" , operand : "bar" } ,
] ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "#Foo > bar" ) ;
2022-12-15 15:03:56 +01:00
2024-08-03 03:05:34 +02:00
filter = new Filter ( [ { operator : "stream" , operand : foo _stream _id . toString ( ) } ] ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "#Foo" ) ;
2022-12-15 15:03:56 +01:00
filter = new Filter ( [ { operator : "stream" , operand : "Elephant" } ] ) ;
2024-08-03 03:05:34 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "translated: Unknown channel" ) ;
2022-12-15 15:03:56 +01:00
2023-04-11 21:04:33 +02:00
// Direct messages with narrows
2022-12-15 15:03:56 +01:00
const joe = {
email : "joe@example.com" ,
user _id : 31 ,
full _name : "joe" ,
} ;
people . add _active _user ( joe ) ;
2023-04-11 21:04:33 +02:00
filter = new Filter ( [ { operator : "dm" , operand : "joe@example.com" } ] ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "joe" ) ;
2022-12-15 15:03:56 +01:00
2023-04-11 21:04:33 +02:00
filter = new Filter ( [ { operator : "dm" , operand : "joe@example.com,sally@doesnotexist.com" } ] ) ;
2023-07-12 07:22:30 +02:00
blueslip . expect ( "warn" , "Unknown emails" ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "translated: Invalid users" ) ;
2022-12-15 15:03:56 +01:00
2023-07-12 07:22:30 +02:00
blueslip . reset ( ) ;
2023-04-11 21:04:33 +02:00
filter = new Filter ( [ { operator : "dm" , operand : "sally@doesnotexist.com" } ] ) ;
2023-07-12 07:22:30 +02:00
blueslip . expect ( "warn" , "Unknown emails" ) ;
2023-10-05 23:18:00 +02:00
assert . equal ( narrow _title . compute _narrow _title ( filter ) , "translated: Invalid user" ) ;
2022-12-15 15:03:56 +01:00
} ) ;