diff --git a/services/web/test/frontend/features/editor-navigation-toolbar/components/chat-toggle-button.test.js b/services/web/test/frontend/features/editor-navigation-toolbar/components/chat-toggle-button.test.js
new file mode 100644
index 0000000000..28b23f2023
--- /dev/null
+++ b/services/web/test/frontend/features/editor-navigation-toolbar/components/chat-toggle-button.test.js
@@ -0,0 +1,27 @@
+import { expect } from 'chai'
+import React from 'react'
+import { render, screen } from '@testing-library/react'
+
+import ChatToggleButton from '../../../../../frontend/js/features/editor-navigation-toolbar/components/chat-toggle-button'
+
+describe('', function () {
+ const defaultProps = {
+ chatIsOpen: false,
+ unreadMessageCount: 0,
+ onClick: () => {},
+ }
+
+ it('displays the number of unread messages', function () {
+ const props = {
+ ...defaultProps,
+ unreadMessageCount: 113,
+ }
+ render()
+ screen.getByText('113')
+ })
+
+ it("doesn't display the unread messages badge when the number of unread messages is zero", function () {
+ render()
+ expect(screen.queryByText('0')).to.not.exist
+ })
+})
diff --git a/services/web/test/frontend/features/editor-navigation-toolbar/components/project-name-editable-label.test.js b/services/web/test/frontend/features/editor-navigation-toolbar/components/project-name-editable-label.test.js
new file mode 100644
index 0000000000..114fee777e
--- /dev/null
+++ b/services/web/test/frontend/features/editor-navigation-toolbar/components/project-name-editable-label.test.js
@@ -0,0 +1,63 @@
+import { expect } from 'chai'
+import sinon from 'sinon'
+import React from 'react'
+import { fireEvent, render, screen } from '@testing-library/react'
+
+import ProjectNameEditableLabel from '../../../../../frontend/js/features/editor-navigation-toolbar/components/project-name-editable-label'
+
+describe('', function () {
+ const defaultProps = { projectName: 'test-project', onChange: () => {} }
+
+ it('displays the project name', function () {
+ render()
+ screen.getByText('test-project')
+ })
+
+ describe('when the name is editable', function () {
+ const editableProps = { ...defaultProps, userIsAdmin: true }
+
+ it('displays an editable input when the edit button is clicked', function () {
+ render()
+ fireEvent.click(screen.getByRole('button'))
+ screen.getByRole('textbox')
+ })
+
+ it('displays an editable input when the project name is double clicked', function () {
+ render()
+ fireEvent.doubleClick(screen.getByText('test-project'))
+ screen.getByRole('textbox')
+ })
+
+ it('calls "onChange" when the project name is updated', function () {
+ const props = {
+ ...editableProps,
+ onChange: sinon.stub(),
+ }
+ render()
+
+ fireEvent.doubleClick(screen.getByText('test-project'))
+ const input = screen.getByRole('textbox')
+
+ fireEvent.change(input, { target: { value: 'new project name' } })
+ fireEvent.keyDown(input, { key: 'Enter' })
+
+ expect(props.onChange).to.be.calledWith('new project name')
+ })
+
+ it('cancels renaming when the input loses focus', function () {
+ render()
+ fireEvent.doubleClick(screen.getByText('test-project'))
+ fireEvent.blur(screen.getByRole('textbox'))
+ expect(screen.queryByRole('textbox')).to.not.exist
+ })
+ })
+
+ describe('when the name is not editable', function () {
+ const nonEditableProps = { userIsAdmin: false, ...defaultProps }
+
+ it('the edit button is not displayed', function () {
+ render()
+ expect(screen.queryByRole('button')).to.not.exist
+ })
+ })
+})