diff --git a/services/web/frontend/js/features/editor-navigation-toolbar/components/pdf-toggle-button.js b/services/web/frontend/js/features/editor-navigation-toolbar/components/pdf-toggle-button.js
index 84d9e6aba3..a49582433c 100644
--- a/services/web/frontend/js/features/editor-navigation-toolbar/components/pdf-toggle-button.js
+++ b/services/web/frontend/js/features/editor-navigation-toolbar/components/pdf-toggle-button.js
@@ -22,7 +22,7 @@ function PdfToggleButton({ onClick, pdfViewIsOpen }) {
>
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid,jsx-a11y/click-events-have-key-events,jsx-a11y/interactive-supports-focus */}
-
+
)
diff --git a/services/web/test/frontend/features/editor-navigation-toolbar/components/online-users-widget.test.js b/services/web/test/frontend/features/editor-navigation-toolbar/components/online-users-widget.test.js
new file mode 100644
index 0000000000..fd22eaa2d7
--- /dev/null
+++ b/services/web/test/frontend/features/editor-navigation-toolbar/components/online-users-widget.test.js
@@ -0,0 +1,105 @@
+import { expect } from 'chai'
+import sinon from 'sinon'
+import React from 'react'
+import { fireEvent, render, screen } from '@testing-library/react'
+
+import OnlineUsersWidget from '../../../../../frontend/js/features/editor-navigation-toolbar/components/online-users-widget'
+
+describe('', function () {
+ const defaultProps = {
+ onlineUsers: [
+ {
+ user_id: 'test_user',
+ name: 'test_user',
+ },
+ {
+ user_id: 'another_test_user',
+ name: 'another_test_user',
+ },
+ ],
+ goToUser: () => {},
+ }
+
+ describe('with less than 4 users', function () {
+ it('displays user initials', function () {
+ render()
+ screen.getByText('t')
+ screen.getByText('a')
+ })
+
+ it('displays user name in a tooltip', function () {
+ render()
+ const icon = screen.getByText('t')
+ fireEvent.mouseOver(icon)
+ screen.getByRole('tooltip', { name: 'test_user' })
+ })
+
+ it('calls "goToUser" when the user initial is clicked', function () {
+ const props = {
+ ...defaultProps,
+ goToUser: sinon.stub(),
+ }
+ render()
+
+ const icon = screen.getByText('t')
+ fireEvent.click(icon)
+
+ expect(props.goToUser).to.be.calledWith({
+ name: 'test_user',
+ user_id: 'test_user',
+ })
+ })
+ })
+
+ describe('with 4 users and more', function () {
+ const props = {
+ ...defaultProps,
+ onlineUsers: defaultProps.onlineUsers.concat([
+ {
+ user_id: 'user_3',
+ name: 'user_3',
+ },
+ {
+ user_id: 'user_4',
+ name: 'user_4',
+ },
+ ]),
+ }
+
+ it('displays the count of users', function () {
+ render()
+ screen.getByText('4')
+ })
+
+ it('displays user names on hover', function () {
+ render()
+
+ const toggleButton = screen.getByRole('button')
+ fireEvent.click(toggleButton)
+
+ screen.getByText('test_user')
+ screen.getByText('another_test_user')
+ screen.getByText('user_3')
+ screen.getByText('user_4')
+ })
+
+ it('calls "goToUser" when the user name is clicked', function () {
+ const testProps = {
+ ...props,
+ goToUser: sinon.stub(),
+ }
+ render()
+
+ const toggleButton = screen.getByRole('button')
+ fireEvent.click(toggleButton)
+
+ const icon = screen.getByText('user_3')
+ fireEvent.click(icon)
+
+ expect(testProps.goToUser).to.be.calledWith({
+ name: 'user_3',
+ user_id: 'user_3',
+ })
+ })
+ })
+})
diff --git a/services/web/test/frontend/features/editor-navigation-toolbar/components/toolbar-header.test.js b/services/web/test/frontend/features/editor-navigation-toolbar/components/toolbar-header.test.js
new file mode 100644
index 0000000000..525e306c19
--- /dev/null
+++ b/services/web/test/frontend/features/editor-navigation-toolbar/components/toolbar-header.test.js
@@ -0,0 +1,105 @@
+import { expect } from 'chai'
+import React from 'react'
+import { render, screen } from '@testing-library/react'
+
+import ToolbarHeader from '../../../../../frontend/js/features/editor-navigation-toolbar/components/toolbar-header'
+
+describe('', function () {
+ const defaultProps = {
+ onShowLeftMenuClick: () => {},
+ toggleChatOpen: () => {},
+ toggleReviewPanelOpen: () => {},
+ toggleHistoryOpen: () => {},
+ unreadMessageCount: 0,
+ onlineUsers: [],
+ goToUser: () => {},
+ projectName: 'test project',
+ renameProject: () => {},
+ openShareModal: () => {},
+ togglePdfView: () => {},
+ }
+
+ describe('cobranding logo', function () {
+ it('is not displayed by default', function () {
+ render()
+ expect(screen.queryByRole('link', { name: 'variation' })).to.not.exist
+ })
+
+ it('is displayed when cobranding data is available', function () {
+ const props = {
+ ...defaultProps,
+ cobranding: {
+ brandVariationHomeUrl: 'http://cobranding',
+ brandVariationName: 'variation',
+ logoImgUrl: 'http://cobranding/logo',
+ },
+ }
+ render()
+ screen.getByRole('link', { name: 'variation' })
+ })
+ })
+
+ describe('pdf toggle button', function () {
+ it('is not displayed by default', function () {
+ render()
+ expect(screen.queryByText('PDF')).to.not.exist
+ })
+
+ it('is displayed when "pdfButtonIsVisible" prop is set to true', function () {
+ const props = {
+ ...defaultProps,
+ pdfButtonIsVisible: true,
+ }
+ render()
+ screen.getByText('PDF')
+ })
+ })
+
+ describe('track changes toggle button', function () {
+ it('is displayed by default', function () {
+ render()
+ screen.getByText('Review')
+ })
+
+ it('is not displayed when "isRestrictedTokenMember" prop is set to true', function () {
+ const props = {
+ ...defaultProps,
+ isRestrictedTokenMember: true,
+ }
+ render()
+ expect(screen.queryByText('Review')).to.not.exist
+ })
+ })
+
+ describe('History toggle button', function () {
+ it('is displayed by default', function () {
+ render()
+ screen.getByText('History')
+ })
+
+ it('is not displayed when "isRestrictedTokenMember" prop is set to true', function () {
+ const props = {
+ ...defaultProps,
+ isRestrictedTokenMember: true,
+ }
+ render()
+ expect(screen.queryByText('History')).to.not.exist
+ })
+ })
+
+ describe('Chat toggle button', function () {
+ it('is displayed by default', function () {
+ render()
+ screen.getByText('Chat')
+ })
+
+ it('is not displayed when "isRestrictedTokenMember" prop is set to true', function () {
+ const props = {
+ ...defaultProps,
+ isRestrictedTokenMember: true,
+ }
+ render()
+ expect(screen.queryByText('Chat')).to.not.exist
+ })
+ })
+})