mirror of
				https://github.com/zulip/zulip.git
				synced 2025-10-31 12:03:46 +00:00 
			
		
		
		
	Prior to this commit, we'd put up the green "Enable desktop notifications" bar on page load AND the first time a desktop notification worthy message was received, it would attempt to notify, automatically triggering a browser permission popup (the same one as clicking the green bar results in). Now, desktop notifications are not attempted at all until the green bar is clicked. Additionally Firefox and Webkit browser-specific checks are made more uniform and done at the same point. Tested written by YashRE42. Fixes #11504.
		
			
				
	
	
		
			260 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			260 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Dependencies
 | |
| set_global('$', global.make_zjquery({
 | |
|     silent: true,
 | |
| }));
 | |
| set_global('blueslip', global.make_zblueslip());
 | |
| set_global('document', {
 | |
|     hasFocus: function () {
 | |
|         return true;
 | |
|     },
 | |
| });
 | |
| set_global('page_params', {
 | |
|     is_admin: false,
 | |
|     realm_users: [],
 | |
| });
 | |
| const _navigator = {
 | |
|     userAgent: 'Mozilla/5.0 AppleWebKit/537.36 Chrome/64.0.3282.167 Safari/537.36',
 | |
| };
 | |
| set_global('navigator', _navigator);
 | |
| 
 | |
| zrequire('muting');
 | |
| zrequire('stream_data');
 | |
| zrequire('people');
 | |
| zrequire('ui');
 | |
| zrequire('util');
 | |
| 
 | |
| zrequire('notifications');
 | |
| 
 | |
| // Not muted streams
 | |
| var general = {
 | |
|     subscribed: true,
 | |
|     name: 'general',
 | |
|     stream_id: 10,
 | |
|     is_muted: false,
 | |
| };
 | |
| 
 | |
| // Muted streams
 | |
| var muted = {
 | |
|     subscribed: true,
 | |
|     name: 'muted',
 | |
|     stream_id: 20,
 | |
|     is_muted: true,
 | |
| };
 | |
| 
 | |
| stream_data.add_sub('general', general);
 | |
| stream_data.add_sub('muted', muted);
 | |
| 
 | |
| muting.add_muted_topic(general.stream_id, 'muted topic');
 | |
| 
 | |
| run_test('message_is_notifiable', () => {
 | |
|     // Case 1: If the message was sent by this user,
 | |
|     //  DO NOT notify the user
 | |
|     // In this test, all other circumstances should trigger notification
 | |
|     // EXCEPT sent_by_me, which should trump them
 | |
|     assert.equal(notifications.message_is_notifiable({
 | |
|         id: muted.stream_id,
 | |
|         content: 'message number 1',
 | |
|         sent_by_me: true,
 | |
|         notification_sent: false,
 | |
|         mentioned_me_directly: true,
 | |
|         type: 'stream',
 | |
|         stream: 'general',
 | |
|         stream_id: general.stream_id,
 | |
|         topic: 'whatever',
 | |
|     }), false);
 | |
| 
 | |
|     // Case 2: If the user has already been sent a notificaton about this message,
 | |
|     //  DO NOT notify the user
 | |
|     // In this test, all other circumstances should trigger notification
 | |
|     // EXCEPT notification_sent, which should trump them
 | |
|     // (ie: it mentions user, it's not muted, etc)
 | |
|     assert.equal(notifications.message_is_notifiable({
 | |
|         id: general.stream_id,
 | |
|         content: 'message number 2',
 | |
|         sent_by_me: false,
 | |
|         notification_sent: true,
 | |
|         mentioned_me_directly: true,
 | |
|         type: 'stream',
 | |
|         stream: 'general',
 | |
|         stream_id: general.stream_id,
 | |
|         topic: 'whatever',
 | |
|     }), false);
 | |
| 
 | |
|     // Case 3: If a message mentions the user directly,
 | |
|     //  DO notify the user
 | |
|     // Mentioning trumps muting
 | |
|     assert.equal(notifications.message_is_notifiable({
 | |
|         id: 30,
 | |
|         content: 'message number 3',
 | |
|         sent_by_me: false,
 | |
|         notification_sent: false,
 | |
|         mentioned_me_directly: true,
 | |
|         type: 'stream',
 | |
|         stream: 'muted',
 | |
|         stream_id: muted.stream_id,
 | |
|         topic: 'topic_three',
 | |
|     }), true);
 | |
| 
 | |
|     // Case 4:
 | |
|     // Mentioning should trigger notification in unmuted topic
 | |
|     assert.equal(notifications.message_is_notifiable({
 | |
|         id: 40,
 | |
|         content: 'message number 4',
 | |
|         sent_by_me: false,
 | |
|         notification_sent: false,
 | |
|         mentioned_me_directly: true,
 | |
|         type: 'stream',
 | |
|         stream: 'general',
 | |
|         stream_id: general.stream_id,
 | |
|         topic: 'vanilla',
 | |
|     }), true);
 | |
| 
 | |
|     // Case 5: If a message is in a muted stream
 | |
|     //  and does not mention the user DIRECTLY,
 | |
|     //  DO NOT notify the user
 | |
|     assert.equal(notifications.message_is_notifiable({
 | |
|         id: 50,
 | |
|         content: 'message number 5',
 | |
|         sent_by_me: false,
 | |
|         notification_sent: false,
 | |
|         mentioned_me_directly: false,
 | |
|         type: 'stream',
 | |
|         stream: 'muted',
 | |
|         stream_id: muted.stream_id,
 | |
|         topic: 'whatever',
 | |
|     }), false);
 | |
| 
 | |
|     // Case 6: If a message is in a muted topic
 | |
|     //  and does not mention the user DIRECTLY,
 | |
|     //  DO NOT notify the user
 | |
|     assert.equal(notifications.message_is_notifiable({
 | |
|         id: 50,
 | |
|         content: 'message number 6',
 | |
|         sent_by_me: false,
 | |
|         notification_sent: false,
 | |
|         mentioned_me_directly: false,
 | |
|         type: 'stream',
 | |
|         stream: 'general',
 | |
|         stream_id: general.stream_id,
 | |
|         topic: 'muted topic',
 | |
|     }), false);
 | |
| 
 | |
|     // Case 7
 | |
|     // If none of the above cases apply
 | |
|     // (ie: topic is not muted, message does not mention user,
 | |
|     //  no notification sent before, message not sent by user),
 | |
|     // return true to pass it to notifications settings
 | |
|     assert.equal(notifications.message_is_notifiable({
 | |
|         id: 60,
 | |
|         content: 'message number 7',
 | |
|         sent_by_me: false,
 | |
|         notification_sent: false,
 | |
|         mentioned_me_directly: false,
 | |
|         type: 'stream',
 | |
|         stream: 'general',
 | |
|         stream_id: general.stream_id,
 | |
|         topic: 'whatever',
 | |
|     }), true);
 | |
| });
 | |
| 
 | |
| 
 | |
| run_test('basic_notifications', () => {
 | |
| 
 | |
|     var n; // Object for storing all notification data for assertions.
 | |
|     var last_closed_message_id = null;
 | |
|     var last_shown_message_id = null;
 | |
| 
 | |
|     // Notifications API stub
 | |
|     notifications.set_notification_api({
 | |
|         createNotification: function createNotification(icon, title, content, tag) {
 | |
|             var notification_object = {icon: icon, body: content, tag: tag};
 | |
|             // properties for testing.
 | |
|             notification_object.tests = {
 | |
|                 shown: false,
 | |
|             };
 | |
|             notification_object.show = function () {
 | |
|                 last_shown_message_id = this.tag;
 | |
|             };
 | |
|             notification_object.close = function () {
 | |
|                 last_closed_message_id = this.tag;
 | |
|             };
 | |
|             notification_object.cancel = function () { notification_object.close(); };
 | |
|             return notification_object;
 | |
|         },
 | |
|     });
 | |
| 
 | |
|     var message_1 = {
 | |
|         id: 1000,
 | |
|         content: '@-mentions the user',
 | |
|         avatar_url: 'url',
 | |
|         sent_by_me: false,
 | |
|         sender_full_name: 'Jesse Pinkman',
 | |
|         notification_sent: false,
 | |
|         mentioned_me_directly: true,
 | |
|         type: 'stream',
 | |
|         stream: 'general',
 | |
|         stream_id: muted.stream_id,
 | |
|         topic: 'whatever',
 | |
|     };
 | |
| 
 | |
|     var message_2 = {
 | |
|         id: 1500,
 | |
|         avatar_url: 'url',
 | |
|         content: '@-mentions the user',
 | |
|         sent_by_me: false,
 | |
|         sender_full_name: 'Gus Fring',
 | |
|         notification_sent: false,
 | |
|         mentioned_me_directly: true,
 | |
|         type: 'stream',
 | |
|         stream: 'general',
 | |
|         stream_id: muted.stream_id,
 | |
|         topic: 'lunch',
 | |
|     };
 | |
| 
 | |
|     // Send notification.
 | |
|     notifications.process_notification({message: message_1, desktop_notify: true});
 | |
|     n = notifications.get_notifications();
 | |
|     assert.equal('Jesse Pinkman to general > whatever' in n, true);
 | |
|     assert.equal(Object.keys(n).length, 1);
 | |
|     assert.equal(last_shown_message_id, message_1.id);
 | |
| 
 | |
|     // Remove notification.
 | |
|     notifications.close_notification(message_1);
 | |
|     n = notifications.get_notifications();
 | |
|     assert.equal('Jesse Pinkman to general > whatever' in n, false);
 | |
|     assert.equal(Object.keys(n).length, 0);
 | |
|     assert.equal(last_closed_message_id, message_1.id);
 | |
| 
 | |
|     // Send notification.
 | |
|     message_1.id = 1001;
 | |
|     notifications.process_notification({message: message_1, desktop_notify: true});
 | |
|     n = notifications.get_notifications();
 | |
|     assert.equal('Jesse Pinkman to general > whatever' in n, true);
 | |
|     assert.equal(Object.keys(n).length, 1);
 | |
|     assert.equal(last_shown_message_id, message_1.id);
 | |
| 
 | |
|     // Process same message again. Notification count shouldn't increase.
 | |
|     message_1.id = 1002;
 | |
|     notifications.process_notification({message: message_1, desktop_notify: true});
 | |
|     n = notifications.get_notifications();
 | |
|     assert.equal('Jesse Pinkman to general > whatever' in n, true);
 | |
|     assert.equal(Object.keys(n).length, 1);
 | |
|     assert.equal(last_shown_message_id, message_1.id);
 | |
| 
 | |
|     // Send another message. Notification count should increase.
 | |
|     notifications.process_notification({message: message_2, desktop_notify: true});
 | |
|     n = notifications.get_notifications();
 | |
|     assert.equal('Gus Fring to general > lunch' in n, true);
 | |
|     assert.equal('Jesse Pinkman to general > whatever' in n, true);
 | |
|     assert.equal(Object.keys(n).length, 2);
 | |
|     assert.equal(last_shown_message_id, message_2.id);
 | |
| 
 | |
|     // Remove notifications.
 | |
|     notifications.close_notification(message_1);
 | |
|     notifications.close_notification(message_2);
 | |
|     n = notifications.get_notifications();
 | |
|     assert.equal('Jesse Pinkman to general > whatever' in n, false);
 | |
|     assert.equal(Object.keys(n).length, 0);
 | |
|     assert.equal(last_closed_message_id, message_2.id);
 | |
| });
 |