2017-06-02 23:12:15 +02:00
|
|
|
|
set_global('$', global.make_zjquery());
|
2017-02-22 02:34:05 +01:00
|
|
|
|
|
2018-03-11 22:03:42 +01:00
|
|
|
|
zrequire('localstorage');
|
|
|
|
|
zrequire('drafts');
|
2019-07-26 03:47:36 +02:00
|
|
|
|
set_global('XDate', zrequire('XDate', 'xdate'));
|
2018-03-11 22:03:42 +01:00
|
|
|
|
zrequire('timerender');
|
2019-07-12 02:03:55 +02:00
|
|
|
|
set_global('Handlebars', global.make_handlebars());
|
2019-02-14 16:47:27 +01:00
|
|
|
|
zrequire('stream_color');
|
|
|
|
|
zrequire('colorspace');
|
2018-03-11 22:03:42 +01:00
|
|
|
|
|
2020-02-12 08:14:40 +01:00
|
|
|
|
const ls_container = new Map();
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const noop = function () { return; };
|
2018-03-11 22:03:42 +01:00
|
|
|
|
|
2017-02-22 02:34:05 +01:00
|
|
|
|
set_global('localStorage', {
|
|
|
|
|
getItem: function (key) {
|
2020-02-12 08:14:40 +01:00
|
|
|
|
return ls_container.get(key);
|
2017-02-22 02:34:05 +01:00
|
|
|
|
},
|
|
|
|
|
setItem: function (key, val) {
|
2020-02-12 08:14:40 +01:00
|
|
|
|
ls_container.set(key, val);
|
2017-02-22 02:34:05 +01:00
|
|
|
|
},
|
|
|
|
|
removeItem: function (key) {
|
2020-02-12 08:14:40 +01:00
|
|
|
|
ls_container.delete(key);
|
2017-02-22 02:34:05 +01:00
|
|
|
|
},
|
|
|
|
|
clear: function () {
|
2020-02-12 08:14:40 +01:00
|
|
|
|
ls_container.clear();
|
2017-02-22 02:34:05 +01:00
|
|
|
|
},
|
|
|
|
|
});
|
2017-03-29 08:54:26 +02:00
|
|
|
|
set_global('compose', {});
|
|
|
|
|
set_global('compose_state', {});
|
2018-03-11 22:03:42 +01:00
|
|
|
|
set_global('stream_data', {
|
|
|
|
|
get_color: function () {
|
|
|
|
|
return '#FFFFFF';
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
set_global('people', {
|
|
|
|
|
// Mocking get_by_email function, here we are
|
|
|
|
|
// just returning string before `@` in email
|
|
|
|
|
get_by_email: function (email) {
|
|
|
|
|
return {
|
|
|
|
|
full_name: email.split('@')[0],
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
set_global('markdown', {
|
|
|
|
|
apply_markdown: noop,
|
|
|
|
|
});
|
|
|
|
|
set_global('page_params', {
|
|
|
|
|
twenty_four_hour_time: false,
|
|
|
|
|
});
|
2017-02-22 02:34:05 +01:00
|
|
|
|
|
2017-03-29 08:22:25 +02:00
|
|
|
|
function stub_timestamp(timestamp, func) {
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const original_func = Date.prototype.getTime;
|
2017-03-29 08:22:25 +02:00
|
|
|
|
Date.prototype.getTime = function () {
|
2017-02-22 02:34:05 +01:00
|
|
|
|
return timestamp;
|
|
|
|
|
};
|
|
|
|
|
func();
|
2017-03-29 08:22:25 +02:00
|
|
|
|
Date.prototype.getTime = original_func;
|
2017-02-22 02:34:05 +01:00
|
|
|
|
}
|
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const legacy_draft = {
|
2018-12-16 17:36:41 +01:00
|
|
|
|
stream: "stream",
|
|
|
|
|
subject: "lunch",
|
|
|
|
|
type: "stream",
|
|
|
|
|
content: "whatever",
|
|
|
|
|
};
|
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const compose_args_for_legacy_draft = {
|
2018-12-16 17:36:41 +01:00
|
|
|
|
stream: "stream",
|
2018-11-15 19:14:16 +01:00
|
|
|
|
topic: "lunch",
|
2018-12-16 17:36:41 +01:00
|
|
|
|
type: "stream",
|
|
|
|
|
content: "whatever",
|
|
|
|
|
};
|
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_1 = {
|
2017-02-22 02:34:05 +01:00
|
|
|
|
stream: "stream",
|
2018-12-16 17:36:41 +01:00
|
|
|
|
topic: "topic",
|
2017-02-22 02:34:05 +01:00
|
|
|
|
type: "stream",
|
|
|
|
|
content: "Test Stream Message",
|
|
|
|
|
};
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_2 = {
|
2017-02-22 02:34:05 +01:00
|
|
|
|
private_message_recipient: "aaron@zulip.com",
|
2017-03-29 08:54:26 +02:00
|
|
|
|
reply_to: "aaron@zulip.com",
|
2017-02-22 02:34:05 +01:00
|
|
|
|
type: "private",
|
|
|
|
|
content: "Test Private Message",
|
|
|
|
|
};
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const short_msg = {
|
2018-08-21 23:04:30 +02:00
|
|
|
|
stream: "stream",
|
|
|
|
|
subject: "topic",
|
|
|
|
|
type: "stream",
|
|
|
|
|
content: "a",
|
|
|
|
|
};
|
2017-02-22 02:34:05 +01:00
|
|
|
|
|
2018-12-16 17:36:41 +01:00
|
|
|
|
run_test('legacy', () => {
|
|
|
|
|
assert.deepEqual(
|
|
|
|
|
drafts.restore_message(legacy_draft),
|
|
|
|
|
compose_args_for_legacy_draft
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
|
run_test('draft_model', () => {
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_model = drafts.draft_model;
|
|
|
|
|
const ls = localstorage();
|
2017-02-22 02:34:05 +01:00
|
|
|
|
|
|
|
|
|
localStorage.clear();
|
|
|
|
|
(function test_get() {
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const expected = { id1: draft_1, id2: draft_2 };
|
2017-02-22 02:34:05 +01:00
|
|
|
|
ls.set("drafts", expected);
|
|
|
|
|
|
|
|
|
|
assert.deepEqual(draft_model.get(), expected);
|
|
|
|
|
}());
|
|
|
|
|
|
|
|
|
|
localStorage.clear();
|
|
|
|
|
(function test_get() {
|
|
|
|
|
ls.set("drafts", { id1: draft_1 });
|
|
|
|
|
|
|
|
|
|
assert.deepEqual(draft_model.getDraft("id1"), draft_1);
|
|
|
|
|
assert.equal(draft_model.getDraft("id2"), false);
|
|
|
|
|
}());
|
|
|
|
|
|
|
|
|
|
localStorage.clear();
|
|
|
|
|
(function test_addDraft() {
|
2018-05-07 03:30:13 +02:00
|
|
|
|
stub_timestamp(1, function () {
|
2020-02-09 04:44:12 +01:00
|
|
|
|
const expected = { ...draft_1 };
|
2018-05-07 03:30:13 +02:00
|
|
|
|
expected.updatedAt = 1;
|
2020-02-09 04:44:12 +01:00
|
|
|
|
const id = draft_model.addDraft({ ...draft_1 });
|
2017-02-22 02:34:05 +01:00
|
|
|
|
|
2018-05-07 03:30:13 +02:00
|
|
|
|
assert.deepEqual(ls.get("drafts")[id], expected);
|
|
|
|
|
});
|
2017-02-22 02:34:05 +01:00
|
|
|
|
}());
|
|
|
|
|
|
|
|
|
|
localStorage.clear();
|
|
|
|
|
(function test_editDraft() {
|
2018-05-07 03:30:13 +02:00
|
|
|
|
stub_timestamp(2, function () {
|
|
|
|
|
ls.set("drafts", { id1: draft_1 });
|
2020-02-09 04:44:12 +01:00
|
|
|
|
const expected = { ...draft_2 };
|
2018-05-07 03:30:13 +02:00
|
|
|
|
expected.updatedAt = 2;
|
2020-02-09 04:44:12 +01:00
|
|
|
|
draft_model.editDraft("id1", { ...draft_2 });
|
2018-05-07 03:30:13 +02:00
|
|
|
|
|
|
|
|
|
assert.deepEqual(ls.get("drafts").id1, expected);
|
|
|
|
|
});
|
2017-02-22 02:34:05 +01:00
|
|
|
|
}());
|
|
|
|
|
|
|
|
|
|
localStorage.clear();
|
|
|
|
|
(function test_deleteDraft() {
|
2018-05-07 03:30:13 +02:00
|
|
|
|
ls.set("drafts", { id1: draft_1 });
|
|
|
|
|
draft_model.deleteDraft("id1");
|
2017-02-22 02:34:05 +01:00
|
|
|
|
|
2018-05-07 03:30:13 +02:00
|
|
|
|
assert.deepEqual(ls.get("drafts"), {});
|
2017-02-22 02:34:05 +01:00
|
|
|
|
}());
|
2018-05-15 12:40:07 +02:00
|
|
|
|
});
|
2017-03-29 08:54:26 +02:00
|
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
|
run_test('snapshot_message', () => {
|
2017-03-29 08:54:26 +02:00
|
|
|
|
function stub_draft(draft) {
|
2017-04-24 20:35:26 +02:00
|
|
|
|
global.compose_state.get_message_type = function () {
|
2017-03-29 08:54:26 +02:00
|
|
|
|
return draft.type;
|
|
|
|
|
};
|
2017-04-24 20:35:26 +02:00
|
|
|
|
global.compose_state.composing = function () {
|
|
|
|
|
return !!draft.type;
|
|
|
|
|
};
|
2017-04-15 01:15:59 +02:00
|
|
|
|
global.compose_state.message_content = function () {
|
2017-03-29 08:54:26 +02:00
|
|
|
|
return draft.content;
|
|
|
|
|
};
|
2019-12-02 17:53:55 +01:00
|
|
|
|
global.compose_state.private_message_recipient = function () {
|
2017-03-29 08:54:26 +02:00
|
|
|
|
return draft.private_message_recipient;
|
|
|
|
|
};
|
2017-04-15 01:15:59 +02:00
|
|
|
|
global.compose_state.stream_name = function () {
|
2017-03-29 08:54:26 +02:00
|
|
|
|
return draft.stream;
|
|
|
|
|
};
|
2018-11-04 17:04:17 +01:00
|
|
|
|
global.compose_state.topic = function () {
|
2018-12-16 17:36:41 +01:00
|
|
|
|
return draft.topic;
|
2017-03-29 08:54:26 +02:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stub_draft(draft_1);
|
|
|
|
|
assert.deepEqual(drafts.snapshot_message(), draft_1);
|
|
|
|
|
|
|
|
|
|
stub_draft(draft_2);
|
|
|
|
|
assert.deepEqual(drafts.snapshot_message(), draft_2);
|
|
|
|
|
|
2018-08-21 23:04:30 +02:00
|
|
|
|
stub_draft(short_msg);
|
|
|
|
|
assert.deepEqual(drafts.snapshot_message(), undefined);
|
|
|
|
|
|
2017-03-29 08:54:26 +02:00
|
|
|
|
stub_draft({});
|
|
|
|
|
assert.equal(drafts.snapshot_message(), undefined);
|
2018-05-15 12:40:07 +02:00
|
|
|
|
});
|
2017-06-02 23:12:15 +02:00
|
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
|
run_test('initialize', () => {
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const message_content = $("#compose-textarea");
|
2017-06-02 23:12:15 +02:00
|
|
|
|
message_content.focusout = function (f) {
|
|
|
|
|
assert.equal(f, drafts.update_draft);
|
|
|
|
|
f();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
global.window.addEventListener = function (event_name, f) {
|
|
|
|
|
assert.equal(event_name, "beforeunload");
|
2019-11-02 00:06:25 +01:00
|
|
|
|
let called = false;
|
2017-06-02 23:12:15 +02:00
|
|
|
|
drafts.update_draft = function () { called = true; };
|
|
|
|
|
f();
|
|
|
|
|
assert(called);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
drafts.initialize();
|
2018-05-15 12:40:07 +02:00
|
|
|
|
});
|
2018-02-15 17:38:31 +01:00
|
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
|
run_test('remove_old_drafts', () => {
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_3 = {
|
2018-02-15 17:38:31 +01:00
|
|
|
|
stream: "stream",
|
|
|
|
|
subject: "topic",
|
|
|
|
|
type: "stream",
|
|
|
|
|
content: "Test Stream Message",
|
|
|
|
|
updatedAt: Date.now(),
|
|
|
|
|
};
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_4 = {
|
2018-02-15 17:38:31 +01:00
|
|
|
|
private_message_recipient: "aaron@zulip.com",
|
|
|
|
|
reply_to: "aaron@zulip.com",
|
|
|
|
|
type: "private",
|
|
|
|
|
content: "Test Private Message",
|
|
|
|
|
updatedAt: new Date().setDate(-30),
|
|
|
|
|
};
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_model = drafts.draft_model;
|
|
|
|
|
const ls = localstorage();
|
2018-02-15 17:38:31 +01:00
|
|
|
|
localStorage.clear();
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const data = {id3: draft_3, id4: draft_4};
|
2018-02-15 17:38:31 +01:00
|
|
|
|
ls.set("drafts", data);
|
|
|
|
|
assert.deepEqual(draft_model.get(), data);
|
|
|
|
|
|
|
|
|
|
drafts.remove_old_drafts();
|
|
|
|
|
assert.deepEqual(draft_model.get(), {id3: draft_3});
|
2018-05-15 12:40:07 +02:00
|
|
|
|
});
|
2018-03-11 22:03:42 +01:00
|
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
|
run_test('format_drafts', () => {
|
2019-02-20 15:45:17 +01:00
|
|
|
|
drafts.remove_old_drafts = noop;
|
|
|
|
|
|
2018-03-11 22:03:42 +01:00
|
|
|
|
draft_1.updatedAt = new Date(1549958107000).getTime(); // 2/12/2019 07:55:07 AM (UTC+0)
|
|
|
|
|
draft_2.updatedAt = new Date(1549958107000).setDate(-1);
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_3 = {
|
2018-03-11 22:03:42 +01:00
|
|
|
|
stream: "stream 2",
|
|
|
|
|
subject: "topic",
|
|
|
|
|
type: "stream",
|
|
|
|
|
content: "Test Stream Message 2",
|
|
|
|
|
updatedAt: new Date(1549958107000).setDate(-10),
|
|
|
|
|
};
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_4 = {
|
2018-03-11 22:03:42 +01:00
|
|
|
|
private_message_recipient: "aaron@zulip.com",
|
|
|
|
|
reply_to: "iago@zulip.com",
|
|
|
|
|
type: "private",
|
|
|
|
|
content: "Test Private Message 2",
|
|
|
|
|
updatedAt: new Date(1549958107000).setDate(-5),
|
|
|
|
|
};
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_5 = {
|
2018-03-11 22:03:42 +01:00
|
|
|
|
private_message_recipient: "aaron@zulip.com",
|
|
|
|
|
reply_to: "zoe@zulip.com",
|
|
|
|
|
type: "private",
|
|
|
|
|
content: "Test Private Message 3",
|
|
|
|
|
updatedAt: new Date(1549958107000).setDate(-2),
|
|
|
|
|
};
|
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const expected = [
|
2018-12-16 21:15:32 +01:00
|
|
|
|
{
|
2018-12-16 22:56:35 +01:00
|
|
|
|
draft_id: 'id1',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
is_stream: true,
|
2018-12-16 22:56:35 +01:00
|
|
|
|
stream: 'stream',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
stream_color: '#FFFFFF',
|
2019-02-14 16:47:27 +01:00
|
|
|
|
dark_background: '',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
topic: 'topic',
|
2018-12-16 22:56:35 +01:00
|
|
|
|
raw_content: 'Test Stream Message',
|
|
|
|
|
time_stamp: '7:55 AM',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
},
|
2018-12-16 21:15:32 +01:00
|
|
|
|
{
|
2018-12-16 22:56:35 +01:00
|
|
|
|
draft_id: 'id2',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
is_stream: false,
|
|
|
|
|
recipients: 'aaron',
|
2018-12-16 22:56:35 +01:00
|
|
|
|
raw_content: 'Test Private Message',
|
|
|
|
|
time_stamp: 'Jan 30',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
},
|
2018-12-16 21:15:32 +01:00
|
|
|
|
{
|
2018-03-11 22:03:42 +01:00
|
|
|
|
draft_id: 'id5',
|
|
|
|
|
is_stream: false,
|
|
|
|
|
recipients: 'aaron',
|
|
|
|
|
raw_content: 'Test Private Message 3',
|
|
|
|
|
time_stamp: 'Jan 29',
|
|
|
|
|
},
|
2018-12-16 21:15:32 +01:00
|
|
|
|
{
|
2018-12-16 22:56:35 +01:00
|
|
|
|
draft_id: 'id4',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
is_stream: false,
|
|
|
|
|
recipients: 'aaron',
|
2018-12-16 22:56:35 +01:00
|
|
|
|
raw_content: 'Test Private Message 2',
|
|
|
|
|
time_stamp: 'Jan 26',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
},
|
2018-12-16 21:15:32 +01:00
|
|
|
|
{
|
2018-12-16 22:56:35 +01:00
|
|
|
|
draft_id: 'id3',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
is_stream: true,
|
2018-12-16 22:56:35 +01:00
|
|
|
|
stream: 'stream 2',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
stream_color: '#FFFFFF',
|
2019-02-14 16:47:27 +01:00
|
|
|
|
dark_background: '',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
topic: 'topic',
|
2018-12-16 22:56:35 +01:00
|
|
|
|
raw_content: 'Test Stream Message 2',
|
|
|
|
|
time_stamp: 'Jan 21',
|
2018-03-11 22:03:42 +01:00
|
|
|
|
},
|
2018-12-16 21:15:32 +01:00
|
|
|
|
];
|
2018-03-11 22:03:42 +01:00
|
|
|
|
|
|
|
|
|
$('#drafts_table').append = noop;
|
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const draft_model = drafts.draft_model;
|
|
|
|
|
const ls = localstorage();
|
2018-03-11 22:03:42 +01:00
|
|
|
|
localStorage.clear();
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const data = { id1: draft_1, id2: draft_2, id3: draft_3, id4: draft_4, id5: draft_5 };
|
2018-03-11 22:03:42 +01:00
|
|
|
|
ls.set("drafts", data);
|
|
|
|
|
assert.deepEqual(draft_model.get(), data);
|
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
|
const stub_render_now = timerender.render_now;
|
2018-03-11 22:03:42 +01:00
|
|
|
|
timerender.render_now = function (time) {
|
|
|
|
|
return stub_render_now(time, new XDate(1549958107000));
|
|
|
|
|
};
|
|
|
|
|
|
2019-07-11 05:06:20 +02:00
|
|
|
|
global.stub_templates(function (template_name, data) {
|
2018-03-11 22:03:42 +01:00
|
|
|
|
assert.equal(template_name, 'draft_table_body');
|
|
|
|
|
// Tests formatting and sorting of drafts
|
|
|
|
|
assert.deepEqual(data.drafts, expected);
|
|
|
|
|
return '<draft table stub>';
|
2019-07-11 05:06:20 +02:00
|
|
|
|
});
|
2018-03-11 22:03:42 +01:00
|
|
|
|
|
2018-12-16 21:10:20 +01:00
|
|
|
|
drafts.open_modal = noop;
|
|
|
|
|
drafts.set_initial_element = noop;
|
2019-04-18 21:11:30 +02:00
|
|
|
|
$("#drafts_table .draft-row").length = 0;
|
|
|
|
|
|
2018-12-16 21:10:20 +01:00
|
|
|
|
drafts.launch();
|
2018-03-11 22:03:42 +01:00
|
|
|
|
timerender.render_now = stub_render_now;
|
2018-05-15 12:40:07 +02:00
|
|
|
|
});
|