mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	Previously, we had implemented:
    <span class="timestamp" data-timestamp="unix time">Original text</span>
The new syntax is:
    <time timestamp="ISO 8601 string">Original text</time>
    <span class="timestamp-error">Invalid time format: Original text</span>
Since python and JS interpretations of the ISO format are very
slightly different, we force both of them to drop milliseconds
and use 'Z' instead of '+00:00' to represent that the string is
in UTC. The resultant strings look like: 2011-04-11T10:20:30Z.
Fixes #15431.
		
	
		
			
				
	
	
		
			228 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const rm = zrequire('rendered_markdown');
 | 
						|
set_global('moment', zrequire('moment', 'moment-timezone'));
 | 
						|
zrequire('people');
 | 
						|
zrequire('user_groups');
 | 
						|
zrequire('stream_data');
 | 
						|
zrequire('timerender');
 | 
						|
set_global('$', global.make_zjquery());
 | 
						|
 | 
						|
set_global('rtl', {
 | 
						|
    get_direction: () => 'ltr',
 | 
						|
});
 | 
						|
 | 
						|
const iago = {
 | 
						|
    email: 'iago@zulip.com',
 | 
						|
    user_id: 30,
 | 
						|
    full_name: 'Iago',
 | 
						|
};
 | 
						|
 | 
						|
const cordelia = {
 | 
						|
    email: 'cordelia@zulup.com',
 | 
						|
    user_id: 31,
 | 
						|
    full_name: 'Cordelia',
 | 
						|
};
 | 
						|
people.init();
 | 
						|
people.add_active_user(iago);
 | 
						|
people.add_active_user(cordelia);
 | 
						|
people.initialize_current_user(iago.user_id);
 | 
						|
 | 
						|
const group_me = {
 | 
						|
    name: 'my user group',
 | 
						|
    id: 1,
 | 
						|
    members: [iago.user_id, cordelia.user_id],
 | 
						|
};
 | 
						|
const group_other = {
 | 
						|
    name: 'other user group',
 | 
						|
    id: 2,
 | 
						|
    members: [cordelia.user_id],
 | 
						|
};
 | 
						|
user_groups.initialize({
 | 
						|
    realm_user_groups: [group_me, group_other],
 | 
						|
});
 | 
						|
 | 
						|
const stream = {
 | 
						|
    subscribed: true,
 | 
						|
    color: 'yellow',
 | 
						|
    name: 'test',
 | 
						|
    stream_id: 3,
 | 
						|
    is_muted: true,
 | 
						|
    invite_only: false,
 | 
						|
};
 | 
						|
stream_data.add_sub(stream);
 | 
						|
 | 
						|
const $array = (array) => {
 | 
						|
    const each = (func) => {
 | 
						|
        array.forEach(e => {
 | 
						|
            func.call(e);
 | 
						|
        });
 | 
						|
    };
 | 
						|
    return {each};
 | 
						|
};
 | 
						|
 | 
						|
set_global('page_params', { emojiset: 'apple' });
 | 
						|
 | 
						|
const get_content_element = () => {
 | 
						|
    $.clear_all_elements();
 | 
						|
    const $content = $.create('.rendered_markdown');
 | 
						|
    $content.set_find_results('.user-mention', $array([]));
 | 
						|
    $content.set_find_results('.user-group-mention', $array([]));
 | 
						|
    $content.set_find_results('a.stream', $array([]));
 | 
						|
    $content.set_find_results('a.stream-topic', $array([]));
 | 
						|
    $content.set_find_results('time', $array([]));
 | 
						|
    $content.set_find_results('.emoji', $array([]));
 | 
						|
    $content.set_find_results('div.spoiler-header', $array([]));
 | 
						|
    return $content;
 | 
						|
};
 | 
						|
 | 
						|
run_test('misc_helpers', () => {
 | 
						|
    const elem = $.create('.user-mention');
 | 
						|
    rm.set_name_in_mention_element(elem, 'Aaron');
 | 
						|
    assert.equal(elem.text(), '@Aaron');
 | 
						|
    elem.addClass('silent');
 | 
						|
    rm.set_name_in_mention_element(elem, 'Aaron, but silent');
 | 
						|
    assert.equal(elem.text(), 'Aaron, but silent');
 | 
						|
});
 | 
						|
 | 
						|
run_test('user-mention', () => {
 | 
						|
    // Setup
 | 
						|
    const $content = get_content_element();
 | 
						|
    const $iago = $.create('.user-mention(iago)');
 | 
						|
    $iago.set_find_results('.highlight', false);
 | 
						|
    $iago.attr('data-user-id', iago.user_id);
 | 
						|
    const $cordelia = $.create('.user-mention(cordelia)');
 | 
						|
    $cordelia.set_find_results('.highlight', false);
 | 
						|
    $cordelia.attr('data-user-id', cordelia.user_id);
 | 
						|
    $content.set_find_results('.user-mention', $array([$iago, $cordelia]));
 | 
						|
 | 
						|
    // Initial asserts
 | 
						|
    assert(!$iago.hasClass('user-mention-me'));
 | 
						|
    assert.equal($iago.text(), 'never-been-set');
 | 
						|
    assert.equal($cordelia.text(), 'never-been-set');
 | 
						|
 | 
						|
    rm.update_elements($content);
 | 
						|
 | 
						|
    // Final asserts
 | 
						|
    assert($iago.hasClass('user-mention-me'));
 | 
						|
    assert.equal($iago.text(), `@${iago.full_name}`);
 | 
						|
    assert.equal($cordelia.text(), `@${cordelia.full_name}`);
 | 
						|
});
 | 
						|
 | 
						|
 | 
						|
run_test('user-group-mention', () => {
 | 
						|
    // Setup
 | 
						|
    const $content = get_content_element();
 | 
						|
    const $group_me = $.create('.user-group-mention(me)');
 | 
						|
    $group_me.set_find_results('.highlight', false);
 | 
						|
    $group_me.attr('data-user-group-id', group_me.id);
 | 
						|
    const $group_other = $.create('.user-group-mention(other)');
 | 
						|
    $group_other.set_find_results('.highlight', false);
 | 
						|
    $group_other.attr('data-user-group-id', group_other.id);
 | 
						|
    $content.set_find_results('.user-group-mention', $array([$group_me, $group_other]));
 | 
						|
 | 
						|
    // Initial asserts
 | 
						|
    assert(!$group_me.hasClass('user-mention-me'));
 | 
						|
    assert.equal($group_me.text(), 'never-been-set');
 | 
						|
    assert.equal($group_other.text(), 'never-been-set');
 | 
						|
 | 
						|
    rm.update_elements($content);
 | 
						|
 | 
						|
    // Final asserts
 | 
						|
    assert($group_me.hasClass('user-mention-me'));
 | 
						|
    assert.equal($group_me.text(), `@${group_me.name}`);
 | 
						|
    assert.equal($group_other.text(), `@${group_other.name}`);
 | 
						|
});
 | 
						|
 | 
						|
run_test('stream-links', () => {
 | 
						|
    // Setup
 | 
						|
    const $content = get_content_element();
 | 
						|
    const $stream = $.create('a.stream');
 | 
						|
    $stream.set_find_results('.highlight', false);
 | 
						|
    $stream.attr('data-stream-id', stream.stream_id);
 | 
						|
    const $stream_topic = $.create('a.stream-topic');
 | 
						|
    $stream_topic.set_find_results('.highlight', false);
 | 
						|
    $stream_topic.attr('data-stream-id', stream.stream_id);
 | 
						|
    $stream_topic.text('#random>topic name');
 | 
						|
    $content.set_find_results('a.stream', $array([$stream]));
 | 
						|
    $content.set_find_results('a.stream-topic', $array([$stream_topic]));
 | 
						|
 | 
						|
    // Initial asserts
 | 
						|
    assert.equal($stream.text(), 'never-been-set');
 | 
						|
    assert.equal($stream_topic.text(), '#random>topic name');
 | 
						|
 | 
						|
    rm.update_elements($content);
 | 
						|
 | 
						|
    // Final asserts
 | 
						|
    assert.equal($stream.text(), `#${stream.name}`);
 | 
						|
    assert.equal($stream_topic.text(), `#${stream.name} > topic name`);
 | 
						|
});
 | 
						|
 | 
						|
run_test('timestamp', () => {
 | 
						|
    // Setup
 | 
						|
    const $content = get_content_element();
 | 
						|
    const $timestamp = $.create('timestamp(valid)');
 | 
						|
    $timestamp.attr('datetime', '1970-01-01T00:00:01Z');
 | 
						|
    const $timestamp_invalid = $.create('timestamp(invalid)');
 | 
						|
    $timestamp_invalid.attr('datetime', 'invalid');
 | 
						|
    $content.set_find_results('time', $array([$timestamp, $timestamp_invalid]));
 | 
						|
 | 
						|
    // Initial asserts
 | 
						|
    assert.equal($timestamp.text(), 'never-been-set');
 | 
						|
    assert.equal($timestamp_invalid.text(), 'never-been-set');
 | 
						|
 | 
						|
    rm.update_elements($content);
 | 
						|
 | 
						|
    // Final asserts
 | 
						|
    assert.equal($timestamp.text(), 'Thu, Jan 1 1970, 12:00 AM');
 | 
						|
    assert.equal($timestamp.attr('title'), "This time is in your timezone. Original text was 'never-been-set'.");
 | 
						|
    assert.equal($timestamp_invalid.text(), 'translated: Could not parse timestamp.');
 | 
						|
});
 | 
						|
 | 
						|
run_test('emoji', () => {
 | 
						|
    // Setup
 | 
						|
    const $content = get_content_element();
 | 
						|
    const $emoji = $.create('.emoji');
 | 
						|
    $emoji.attr('title', 'tada');
 | 
						|
    let called = false;
 | 
						|
    $emoji.replaceWith = (f) => {
 | 
						|
        const text = f.call($emoji);
 | 
						|
        assert.equal(':tada:', text);
 | 
						|
        called = true;
 | 
						|
    };
 | 
						|
    $content.set_find_results('.emoji', $emoji);
 | 
						|
    page_params.emojiset = 'text';
 | 
						|
 | 
						|
    rm.update_elements($content);
 | 
						|
 | 
						|
    assert(called);
 | 
						|
 | 
						|
    // Set page paramaters back so that test run order is independent
 | 
						|
    page_params.emojiset = 'apple';
 | 
						|
});
 | 
						|
 | 
						|
run_test('spoiler-header', () => {
 | 
						|
    // Setup
 | 
						|
    const $content = get_content_element();
 | 
						|
    const $header = $.create('div.spoiler-header');
 | 
						|
    $content.set_find_results('div.spoiler-header', $array([$header]));
 | 
						|
 | 
						|
    // Test that button gets appened to a spoiler header
 | 
						|
    const label = 'My Spoiler Header';
 | 
						|
    const toggle_button_html = '<a class="spoiler-button" aria-expanded="false"><span class="spoiler-arrow"></span></a>';
 | 
						|
    $header.html(label);
 | 
						|
    rm.update_elements($content);
 | 
						|
    assert.equal(toggle_button_html + label, $header.html());
 | 
						|
});
 | 
						|
 | 
						|
run_test('spoiler-header-empty-fill', () => {
 | 
						|
    // Setup
 | 
						|
    const $content = get_content_element();
 | 
						|
    const $header = $.create('div.spoiler-header');
 | 
						|
    $content.set_find_results('div.spoiler-header', $array([$header]));
 | 
						|
 | 
						|
    // Test that an empty header gets the default text applied (through i18n filter)
 | 
						|
    const toggle_button_html = '<a class="spoiler-button" aria-expanded="false"><span class="spoiler-arrow"></span></a>';
 | 
						|
    $header.html('');
 | 
						|
    rm.update_elements($content);
 | 
						|
    assert.equal(toggle_button_html + '<p>translated: Spoiler</p>', $header.html());
 | 
						|
});
 |