forked from mattermost/mattermost
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add test notification tool (mattermost#28334)
* Add test notification tool * Add frontend styles * Remove option from admin view * Refactor create post and add translations * Fix several CI errors * Fix API and frontend snapshots * Refactor trailing and leading icon on buttons * Add different button states * i18n-extract * Fix wrong text * Add tests * Fix wrong string * Fix test * feat: E2E send test notifications (mattermost#28371) * Refactor send desktop notification * Address rest of the feedback * Fix tests * Add correct link * Fix test --------- Co-authored-by: Mattermost Build <[email protected]> Co-authored-by: yasserfaraazkhan <[email protected]>
- Loading branch information
1 parent
30a6ddc
commit 118d034
Showing
31 changed files
with
1,170 additions
and
56 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
128 changes: 128 additions & 0 deletions
128
...cypress/tests/integration/channels/test_notification/trigger_browser_notification_spec.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | ||
// See LICENSE.txt for license information. | ||
|
||
// *************************************************************** | ||
// - [#] indicates a test step (e.g. # Go to a page) | ||
// - [*] indicates an assertion (e.g. * Check the title) | ||
// - Use element ID when selecting an element. Create one if none. | ||
// *************************************************************** | ||
|
||
// Stage: @prod | ||
// Group: @channels @notification | ||
|
||
describe('Verify users can receive notification on browser', () => { | ||
let offTopic: string; | ||
const notificationMessage = 'If you received this test notification, it worked!'; | ||
before(() => { | ||
cy.apiInitSetup({userPrefix: 'other', loginAfter: true}).then(({offTopicUrl}) => { | ||
offTopic = offTopicUrl; | ||
}); | ||
}); | ||
|
||
it('MM-T5631_1 should be able to receive notification when notifications are enabled on the browser', () => { | ||
cy.visit(offTopic); | ||
cy.stubNotificationPermission('granted'); | ||
cy.get('#CustomizeYourExperienceTour > button').click(); | ||
triggertestNotification(); | ||
cy.get('@notificationStub').should('be.called'); | ||
cy.get('@notificationStub').should((stub) => { | ||
expect(stub).to.have.been.calledWithMatch( | ||
'Direct Message', | ||
Cypress.sinon.match({ | ||
body: '@@system-bot: If you received this test notification, it worked!', | ||
tag: '@@system-bot: If you received this test notification, it worked!', | ||
requireInteraction: false, | ||
silent: false, | ||
}), | ||
); | ||
}); | ||
cy.get('#accountSettingsHeader button.close').click(); | ||
|
||
// * Verify user still recieves a message from system bot | ||
cy.verifySystemBotMessageRecieved(notificationMessage); | ||
}); | ||
|
||
it('MM-T5631_2 should not be able to receive notification when notifications are denied on the browser', () => { | ||
cy.visit(offTopic); | ||
cy.stubNotificationPermission('denied'); | ||
cy.get('#CustomizeYourExperienceTour > button').click(); | ||
triggertestNotification(); | ||
|
||
// * Assert that the Notification constructor was not called | ||
cy.get('@notificationStub').should('not.be.called'); | ||
cy.get('#accountSettingsHeader button.close').click(); | ||
|
||
// * Verify user still recieves a message from system bot | ||
cy.verifySystemBotMessageRecieved(notificationMessage); | ||
}); | ||
|
||
it('MM-T5631_3 should not trigger notification when permission is default (no decision made)', () => { | ||
cy.visit(offTopic); | ||
cy.stubNotificationPermission('default'); | ||
cy.get('#CustomizeYourExperienceTour > button').click(); | ||
triggertestNotification(); | ||
|
||
// * Assert that the Notification constructor was not called | ||
cy.get('@notificationStub').should('not.be.called'); | ||
cy.get('#accountSettingsHeader button.close').click(); | ||
|
||
// * Verify user still recieves a message from system bot | ||
cy.verifySystemBotMessageRecieved(notificationMessage); | ||
}); | ||
|
||
// Simulating macOS Focus Mode by suppressing the Notification constructor entirely | ||
it('MM-T5631_4 should not show notification when Focus Mode is enabled (simulating no notification pop-up)', () => { | ||
cy.visit(offTopic); | ||
cy.stubNotificationPermission('granted'); | ||
|
||
cy.window().then((win) => { | ||
win.Notification = function() { | ||
// Do nothing to simulate Focus Mode | ||
}; | ||
|
||
cy.stub(win, 'Notification').as('notificationStub').callsFake(() => { | ||
return null; // Prevent the notification from being created | ||
}); | ||
}); | ||
cy.get('#CustomizeYourExperienceTour > button').click(); | ||
triggertestNotification(); | ||
|
||
// * Assert that the Notification constructor was not called in Focus Mode | ||
cy.get('@notificationStub').should('not.be.called'); | ||
cy.get('#accountSettingsHeader button.close').click(); | ||
|
||
// * Verify user still recieves a message from system bot | ||
cy.verifySystemBotMessageRecieved(notificationMessage); | ||
}); | ||
|
||
it('should still recieve a test notification when user has set Global and Channel Notification preference to Nothing', () => { | ||
cy.visit(offTopic); | ||
cy.stubNotificationPermission('default'); | ||
|
||
// # Mute Channel | ||
cy.get('#channelHeaderTitle > span').click(); | ||
cy.get('#channelToggleMuteChannel').should('have.text', 'Mute Channel').click(); | ||
cy.get('#toggleMute').should('be.visible'); | ||
|
||
// # Set Desktop Notification preference to Nothing | ||
cy.get('#CustomizeYourExperienceTour > button').click(); | ||
cy.get('#desktopAndMobileTitle').click(); | ||
cy.get('#sendDesktopNotificationsSection input[type=radio]').last().check(); | ||
cy.get('#saveSetting').click(); | ||
cy.wait(500); | ||
triggertestNotification(); | ||
|
||
// * Assert that the Notification constructor was not called | ||
cy.get('@notificationStub').should('not.be.called'); | ||
cy.get('#accountSettingsHeader button.close').click(); | ||
|
||
// * Verify user still recieves a message from system bot | ||
cy.verifySystemBotMessageRecieved(notificationMessage); | ||
}); | ||
}); | ||
|
||
function triggertestNotification() { | ||
cy.get('.sectionNoticeContent').scrollIntoView().should('be.visible'); | ||
cy.get('.btn-tertiary').should('be.visible').should('have.text', 'Troubleshooting docs'); | ||
cy.get('.btn-primary').should('be.visible').should('have.text', 'Send a test notification').click(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | ||
// See LICENSE.txt for license information. | ||
|
||
import * as TIMEOUTS from '../fixtures/timeouts'; | ||
|
||
/** | ||
* permission can be 'granted', 'denied', or 'default' | ||
*/ | ||
function stubNotificationPermission(permission: string) { | ||
cy.window().then((win) => { | ||
cy.stub(win.Notification, 'permission').value(permission); | ||
cy.stub(win.Notification, 'requestPermission').resolves(permission); | ||
cy.stub(win, 'Notification').as('notificationStub').callsFake(() => { | ||
return { | ||
onclick: cy.stub().as('notificationOnClick'), | ||
onerror: cy.stub().as('notificationOnError'), | ||
}; | ||
}); | ||
}); | ||
} | ||
|
||
/** | ||
* Verify the system bot message was received | ||
*/ | ||
function notificationMessage(notificationMessage: string) { | ||
// * Assert the unread count is correct | ||
cy.get('.SidebarLink:contains(system-bot)').find('#unreadMentions').as('unreadCount').should('be.visible').should('have.text', '1'); | ||
cy.get('.SidebarLink:contains(system-bot)').find('.Avatar').should('exist').click().wait(TIMEOUTS.HALF_SEC); | ||
cy.get('@unreadCount').should('not.exist'); | ||
|
||
// * Assert the notification message | ||
cy.getLastPostId().then((postId) => { | ||
cy.get(`#postMessageText_${postId}`).scrollIntoView().should('be.visible').should('have.text', notificationMessage); | ||
}); | ||
} | ||
|
||
Cypress.Commands.add('stubNotificationPermission', stubNotificationPermission); | ||
Cypress.Commands.add('verifySystemBotMessageRecieved', notificationMessage); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1103,6 +1103,39 @@ func TestSendPushNotifications(t *testing.T) { | |
}) | ||
} | ||
|
||
func TestShouldSendPushNotifications(t *testing.T) { | ||
th := Setup(t).InitBasic() | ||
defer th.TearDown() | ||
t.Run("should return true if forced", func(t *testing.T) { | ||
user := &model.User{Id: model.NewId(), Email: "[email protected]", NotifyProps: make(map[string]string)} | ||
user.NotifyProps[model.PushNotifyProp] = model.UserNotifyNone | ||
|
||
post := &model.Post{UserId: user.Id, ChannelId: model.NewId()} | ||
post.AddProp(model.PostPropsForceNotification, model.NewId()) | ||
|
||
channelNotifyProps := map[string]string{model.PushNotifyProp: model.ChannelNotifyNone, model.MarkUnreadNotifyProp: model.ChannelMarkUnreadMention} | ||
|
||
status := &model.Status{UserId: user.Id, Status: model.StatusOnline, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: post.ChannelId} | ||
|
||
result := th.App.ShouldSendPushNotification(user, channelNotifyProps, false, status, post, false) | ||
assert.True(t, result) | ||
}) | ||
|
||
t.Run("should return false if force undefined", func(t *testing.T) { | ||
user := &model.User{Id: model.NewId(), Email: "[email protected]", NotifyProps: make(map[string]string)} | ||
user.NotifyProps[model.PushNotifyProp] = model.UserNotifyNone | ||
|
||
post := &model.Post{UserId: user.Id, ChannelId: model.NewId()} | ||
|
||
channelNotifyProps := map[string]string{model.PushNotifyProp: model.ChannelNotifyNone, model.MarkUnreadNotifyProp: model.ChannelMarkUnreadMention} | ||
|
||
status := &model.Status{UserId: user.Id, Status: model.StatusOnline, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: post.ChannelId} | ||
|
||
result := th.App.ShouldSendPushNotification(user, channelNotifyProps, false, status, post, false) | ||
assert.False(t, result) | ||
}) | ||
} | ||
|
||
// testPushNotificationHandler is an HTTP handler to record push notifications | ||
// being sent from the client. | ||
// It records the number of requests sent to it, and stores all the requests | ||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.