diff --git a/src/__mocks__/notifications-mocks.ts b/src/__mocks__/notifications-mocks.ts index a4a359f10..438ab37b0 100644 --- a/src/__mocks__/notifications-mocks.ts +++ b/src/__mocks__/notifications-mocks.ts @@ -2,23 +2,26 @@ import type { AccountNotifications } from '../types'; import { mockEnterpriseNotifications, mockGitHubNotifications, - mockSingleNotification, } from '../utils/api/__mocks__/response-mocks'; +import { + mockGitHubCloudAccount, + mockGitHubEnterpriseServerAccount, +} from './state-mocks'; export const mockAccountNotifications: AccountNotifications[] = [ { - hostname: 'github.com', + account: mockGitHubCloudAccount, notifications: mockGitHubNotifications, }, { - hostname: 'github.gitify.io', + account: mockGitHubEnterpriseServerAccount, notifications: mockEnterpriseNotifications, }, ]; export const mockSingleAccountNotifications: AccountNotifications[] = [ { - hostname: 'github.com', - notifications: [mockSingleNotification], + account: mockGitHubCloudAccount, + notifications: [mockGitHubNotifications[0]], }, ]; diff --git a/src/__mocks__/partial-mocks.ts b/src/__mocks__/partial-mocks.ts index f0d2c0ef6..aefbbe9be 100644 --- a/src/__mocks__/partial-mocks.ts +++ b/src/__mocks__/partial-mocks.ts @@ -1,11 +1,18 @@ import type { Notification, Subject, User } from '../typesGitHub'; import Constants from '../utils/constants'; +import { mockGitifyUser, mockToken } from './state-mocks'; export function partialMockNotification( subject: Partial, ): Notification { const mockNotification: Partial = { - hostname: Constants.GITHUB_API_BASE_URL, + account: { + method: 'Personal Access Token', + platform: 'GitHub Cloud', + hostname: Constants.GITHUB_API_BASE_URL, + token: mockToken, + user: mockGitifyUser, + }, subject: subject as Subject, }; diff --git a/src/__mocks__/state-mocks.ts b/src/__mocks__/state-mocks.ts index 90bf49f23..118e11bbe 100644 --- a/src/__mocks__/state-mocks.ts +++ b/src/__mocks__/state-mocks.ts @@ -1,10 +1,12 @@ import { + type Account, type AuthState, type GitifyUser, type SettingsState, Theme, } from '../types'; import type { EnterpriseAccount } from '../utils/auth/types'; +import Constants from '../utils/constants'; export const mockEnterpriseAccounts: EnterpriseAccount[] = [ { @@ -13,18 +15,50 @@ export const mockEnterpriseAccounts: EnterpriseAccount[] = [ }, ]; -export const mockUser: GitifyUser = { +export const mockGitifyUser: GitifyUser = { login: 'octocat', name: 'Mona Lisa Octocat', id: 123456789, }; -export const mockAuth: AuthState = { +export const mockPersonalAccessTokenAccount: Account = { + platform: 'GitHub Cloud', + method: 'Personal Access Token', + token: 'token-123-456', + hostname: Constants.DEFAULT_AUTH_OPTIONS.hostname, + user: mockGitifyUser, +}; + +export const mockOAuthAccount: Account = { + platform: 'GitHub Enterprise Server', + method: 'OAuth App', + token: '1234568790', + hostname: 'github.gitify.io', + user: mockGitifyUser, +}; + +export const mockGitHubCloudAccount: Account = { + platform: 'GitHub Cloud', + method: 'Personal Access Token', token: 'token-123-456', - enterpriseAccounts: mockEnterpriseAccounts, - user: mockUser, + hostname: Constants.DEFAULT_AUTH_OPTIONS.hostname, + user: mockGitifyUser, }; +export const mockGitHubEnterpriseServerAccount: Account = { + platform: 'GitHub Enterprise Server', + method: 'Personal Access Token', + token: '1234568790', + hostname: 'github.gitify.io', + user: mockGitifyUser, +}; + +export const mockAuth: AuthState = { + accounts: [mockGitHubCloudAccount, mockGitHubEnterpriseServerAccount], +}; + +export const mockToken = 'token-123-456'; + export const mockSettings: SettingsState = { participating: false, playSound: true, diff --git a/src/components/NotificationRow.tsx b/src/components/NotificationRow.tsx index b322f0fe2..a57c08556 100644 --- a/src/components/NotificationRow.tsx +++ b/src/components/NotificationRow.tsx @@ -36,8 +36,8 @@ interface IProps { export const NotificationRow: FC = ({ notification, hostname }) => { const { - settings, auth, + settings, removeNotificationFromState, markNotificationRead, markNotificationDone, @@ -46,7 +46,7 @@ export const NotificationRow: FC = ({ notification, hostname }) => { } = useContext(AppContext); const openNotification = useCallback(() => { - openInBrowser(notification, auth); + openInBrowser(notification); if (settings.markAsDoneOnOpen) { markNotificationDone(notification.id, hostname); diff --git a/src/context/App.test.tsx b/src/context/App.test.tsx index 25a6201d8..71dc830d9 100644 --- a/src/context/App.test.tsx +++ b/src/context/App.test.tsx @@ -1,6 +1,5 @@ import { act, fireEvent, render, waitFor } from '@testing-library/react'; import { useContext } from 'react'; - import { mockAuth, mockSettings } from '../__mocks__/state-mocks'; import { useNotifications } from '../hooks/useNotifications'; import type { AuthState, SettingsState } from '../types'; @@ -133,6 +132,7 @@ describe('context/App.tsx', () => { expect(markNotificationReadMock).toHaveBeenCalledTimes(1); expect(markNotificationReadMock).toHaveBeenCalledWith( { + accounts: [], enterpriseAccounts: [], token: null, user: null, @@ -165,7 +165,7 @@ describe('context/App.tsx', () => { expect(markNotificationDoneMock).toHaveBeenCalledTimes(1); expect(markNotificationDoneMock).toHaveBeenCalledWith( - { enterpriseAccounts: [], token: null, user: null }, + { accounts: [], enterpriseAccounts: [], token: null, user: null }, mockSettings, '123-456', 'github.com', @@ -194,7 +194,7 @@ describe('context/App.tsx', () => { expect(unsubscribeNotificationMock).toHaveBeenCalledTimes(1); expect(unsubscribeNotificationMock).toHaveBeenCalledWith( - { enterpriseAccounts: [], token: null, user: null }, + { accounts: [], enterpriseAccounts: [], token: null, user: null }, mockSettings, '123-456', 'github.com', @@ -228,7 +228,7 @@ describe('context/App.tsx', () => { expect(markRepoNotificationsMock).toHaveBeenCalledTimes(1); expect(markRepoNotificationsMock).toHaveBeenCalledWith( - { enterpriseAccounts: [], token: null, user: null }, + { accounts: [], enterpriseAccounts: [], token: null, user: null }, mockSettings, 'gitify-app/notifications-test', 'github.com', @@ -262,13 +262,14 @@ describe('context/App.tsx', () => { expect(markRepoNotificationsDoneMock).toHaveBeenCalledTimes(1); expect(markRepoNotificationsDoneMock).toHaveBeenCalledWith( - { enterpriseAccounts: [], token: null, user: null }, + { accounts: [], enterpriseAccounts: [], token: null, user: null }, mockSettings, 'gitify-app/notifications-test', 'github.com', ); }); }); + describe('authentication methods', () => { const apiRequestAuthMock = jest.spyOn(apiRequests, 'apiRequestAuth'); const fetchNotificationsMock = jest.fn(); @@ -370,7 +371,7 @@ describe('context/App.tsx', () => { }); expect(saveStateMock).toHaveBeenCalledWith({ - auth: { enterpriseAccounts: [], token: null, user: null }, + auth: { accounts: [], enterpriseAccounts: [], token: null, user: null }, settings: { participating: true, playSound: true, @@ -415,7 +416,7 @@ describe('context/App.tsx', () => { expect(setAutoLaunchMock).toHaveBeenCalledWith(true); expect(saveStateMock).toHaveBeenCalledWith({ - auth: { enterpriseAccounts: [], token: null, user: null }, + auth: { accounts: [], enterpriseAccounts: [], token: null, user: null }, settings: { participating: false, playSound: true, diff --git a/src/context/App.tsx b/src/context/App.tsx index b29edebef..b84c8b3ec 100644 --- a/src/context/App.tsx +++ b/src/context/App.tsx @@ -17,6 +17,7 @@ import { Theme, } from '../types'; import { headNotifications } from '../utils/api/client'; +import { migrateAuthenticatedAccounts } from '../utils/auth/migration'; import type { LoginOAuthAppOptions, LoginPersonalAccessTokenOptions, @@ -34,6 +35,7 @@ import { clearState, loadState, saveState } from '../utils/storage'; import { setTheme } from '../utils/theme'; const defaultAuth: AuthState = { + accounts: [], token: null, enterpriseAccounts: [], user: null, @@ -116,8 +118,7 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { settings.participating, settings.showBots, settings.detailedNotifications, - auth.token, - auth.enterpriseAccounts.length, + auth.accounts.length, ]); useInterval(() => { @@ -149,7 +150,7 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { ); const isLoggedIn = useMemo(() => { - return !!auth.token || auth.enterpriseAccounts.length > 0; + return auth.accounts.length > 0; }, [auth]); const loginWithGitHubApp = useCallback(async () => { @@ -157,7 +158,7 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { const { token } = await getToken(authCode); const hostname = Constants.DEFAULT_AUTH_OPTIONS.hostname; const user = await getUserData(token, hostname); - const updatedAuth = addAccount(auth, token, hostname, user); + const updatedAuth = addAccount(auth, 'GitHub App', token, hostname, user); setAuth(updatedAuth); saveState({ auth: updatedAuth, settings }); }, [auth, settings]); @@ -166,7 +167,7 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { async (data: LoginOAuthAppOptions) => { const { authOptions, authCode } = await authGitHub(data); const { token, hostname } = await getToken(authCode, authOptions); - const updatedAuth = addAccount(auth, token, hostname); + const updatedAuth = addAccount(auth, 'OAuth App', token, hostname); setAuth(updatedAuth); saveState({ auth: updatedAuth, settings }); }, @@ -178,7 +179,13 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { await headNotifications(hostname, token); const user = await getUserData(token, hostname); - const updatedAuth = addAccount(auth, token, hostname, user); + const updatedAuth = addAccount( + auth, + 'Personal Access Token', + token, + hostname, + user, + ); setAuth(updatedAuth); saveState({ auth: updatedAuth, settings }); }, @@ -190,7 +197,9 @@ export const AppProvider = ({ children }: { children: ReactNode }) => { clearState(); }, []); - const restoreSettings = useCallback(() => { + const restoreSettings = useCallback(async () => { + await migrateAuthenticatedAccounts(); + const existing = loadState(); if (existing.auth) { diff --git a/src/hooks/useNotifications.test.ts b/src/hooks/useNotifications.test.ts index 83f332d29..7d55d3325 100644 --- a/src/hooks/useNotifications.test.ts +++ b/src/hooks/useNotifications.test.ts @@ -2,8 +2,11 @@ import { act, renderHook, waitFor } from '@testing-library/react'; import axios, { AxiosError } from 'axios'; import nock from 'nock'; -import { mockAuth, mockSettings, mockUser } from '../__mocks__/state-mocks'; -import type { AuthState } from '../types'; +import { + mockAuth, + mockGitHubCloudAccount, + mockSettings, +} from '../__mocks__/state-mocks'; import { mockNotificationUser } from '../utils/api/__mocks__/response-mocks'; import { Errors } from '../utils/constants'; import { useNotifications } from './useNotifications'; @@ -46,10 +49,12 @@ describe('hooks/useNotifications.ts', () => { expect(result.current.status).toBe('success'); }); - expect(result.current.notifications[0].hostname).toBe('api.github.com'); + expect(result.current.notifications[0].account.hostname).toBe( + 'github.com', + ); expect(result.current.notifications[0].notifications.length).toBe(2); - expect(result.current.notifications[1].hostname).toBe( + expect(result.current.notifications[1].account.hostname).toBe( 'github.gitify.io', ); expect(result.current.notifications[1].notifications.length).toBe(2); @@ -100,144 +105,8 @@ describe('hooks/useNotifications.ts', () => { }); }); - describe('enterprise', () => { - it('should fetch notifications with success - enterprise only', async () => { - const auth: AuthState = { - ...mockAuth, - token: null, - }; - - const notifications = [ - { id: 1, title: 'This is a notification.' }, - { id: 2, title: 'This is another one.' }, - ]; - - nock('https://github.gitify.io/api/v3/') - .get('/notifications?participating=false') - .reply(200, notifications); - - const { result } = renderHook(() => useNotifications()); - - act(() => { - result.current.fetchNotifications(auth, { - ...mockSettings, - detailedNotifications: false, - }); - }); - - await waitFor(() => { - expect(result.current.status).toBe('success'); - }); - - expect(result.current.notifications[0].hostname).toBe( - 'github.gitify.io', - ); - expect(result.current.notifications[0].notifications.length).toBe(2); - }); - - it('should fetch notifications with failure - enterprise only', async () => { - const auth: AuthState = { - ...mockAuth, - token: null, - }; - - nock('https://github.gitify.io/api/v3/') - .get('/notifications?participating=false') - .replyWithError({ - code: AxiosError.ERR_BAD_REQUEST, - response: { - status: 400, - data: { - message: 'Oops! Something went wrong.', - }, - }, - }); - - const { result } = renderHook(() => useNotifications()); - - act(() => { - result.current.fetchNotifications(auth, mockSettings); - }); - - await waitFor(() => { - expect(result.current.status).toBe('error'); - }); - }); - }); - - describe('github.com', () => { - it('should fetch notifications with success - github.com only', async () => { - const auth: AuthState = { - ...mockAuth, - enterpriseAccounts: [], - user: mockUser, - }; - - const notifications = [ - { id: 1, title: 'This is a notification.' }, - { id: 2, title: 'This is another one.' }, - ]; - - nock('https://api.github.com') - .get('/notifications?participating=false') - .reply(200, notifications); - - const { result } = renderHook(() => useNotifications()); - - act(() => { - result.current.fetchNotifications(auth, { - ...mockSettings, - detailedNotifications: false, - }); - }); - - await waitFor(() => { - expect(result.current.status).toBe('success'); - }); - - expect(result.current.notifications[0].hostname).toBe('api.github.com'); - expect(result.current.notifications[0].notifications.length).toBe(2); - }); - - it('should fetch notifications with failures - github.com only', async () => { - const auth: AuthState = { - ...mockAuth, - enterpriseAccounts: [], - }; - - nock('https://api.github.com/') - .get('/notifications?participating=false') - .replyWithError({ - code: AxiosError.ERR_BAD_REQUEST, - response: { - status: 400, - data: { - message: 'Oops! Something went wrong.', - }, - }, - }); - - const { result } = renderHook(() => useNotifications()); - - act(() => { - result.current.fetchNotifications(auth, mockSettings); - }); - - await waitFor(() => { - expect(result.current.status).toBe('error'); - expect(result.current.errorDetails).toBe(Errors.UNKNOWN); - }); - }); - }); - describe('with detailed notifications', () => { it('should fetch notifications with success', async () => { - const auth: AuthState = { - ...mockAuth, - enterpriseAccounts: [], - user: mockUser, - }; - const notifications = [ { id: 1, @@ -393,10 +262,15 @@ describe('hooks/useNotifications.ts', () => { const { result } = renderHook(() => useNotifications()); act(() => { - result.current.fetchNotifications(auth, { - ...mockSettings, - detailedNotifications: true, - }); + result.current.fetchNotifications( + { + accounts: [mockGitHubCloudAccount], + }, + { + ...mockSettings, + detailedNotifications: true, + }, + ); }); expect(result.current.status).toBe('loading'); @@ -405,7 +279,9 @@ describe('hooks/useNotifications.ts', () => { expect(result.current.status).toBe('success'); }); - expect(result.current.notifications[0].hostname).toBe('api.github.com'); + expect(result.current.notifications[0].account.hostname).toBe( + 'github.com', + ); expect(result.current.notifications[0].notifications.length).toBe(6); }); }); @@ -443,7 +319,7 @@ describe('hooks/useNotifications.ts', () => { result.current.removeNotificationFromState( mockSettings, result.current.notifications[0].notifications[0].id, - result.current.notifications[0].hostname, + result.current.notifications[0].account.hostname, ); }); diff --git a/src/hooks/useNotifications.ts b/src/hooks/useNotifications.ts index a048338a9..337ffc2ba 100644 --- a/src/hooks/useNotifications.ts +++ b/src/hooks/useNotifications.ts @@ -13,7 +13,7 @@ import { markRepositoryNotificationsAsRead, } from '../utils/api/client'; import { determineFailureType } from '../utils/api/errors'; -import { getTokenForHost } from '../utils/helpers'; +import { getAccountForHost } from '../utils/helpers'; import { getAllNotifications, setTrayIconColor, @@ -107,10 +107,10 @@ export const useNotifications = (): NotificationsState => { ) => { setStatus('loading'); - const token = getTokenForHost(hostname, auth); + const account = getAccountForHost(hostname, auth); try { - await markNotificationThreadAsRead(id, hostname, token); + await markNotificationThreadAsRead(id, hostname, account.token); const updatedNotifications = removeNotification( settings, @@ -138,10 +138,10 @@ export const useNotifications = (): NotificationsState => { ) => { setStatus('loading'); - const token = getTokenForHost(hostname, auth); + const account = getAccountForHost(hostname, auth); try { - await markNotificationThreadAsDone(id, hostname, token); + await markNotificationThreadAsDone(id, hostname, account.token); const updatedNotifications = removeNotification( settings, @@ -169,10 +169,10 @@ export const useNotifications = (): NotificationsState => { ) => { setStatus('loading'); - const token = getTokenForHost(hostname, auth); + const account = getAccountForHost(hostname, auth); try { - await ignoreNotificationThreadSubscription(id, hostname, token); + await ignoreNotificationThreadSubscription(id, hostname, account.token); await markNotificationRead(auth, settings, id, hostname); setStatus('success'); } catch (err) { @@ -191,10 +191,14 @@ export const useNotifications = (): NotificationsState => { ) => { setStatus('loading'); - const token = getTokenForHost(hostname, auth); + const account = getAccountForHost(hostname, auth); try { - await markRepositoryNotificationsAsRead(repoSlug, hostname, token); + await markRepositoryNotificationsAsRead( + repoSlug, + hostname, + account.token, + ); const updatedNotifications = removeNotifications( repoSlug, notifications, @@ -222,7 +226,8 @@ export const useNotifications = (): NotificationsState => { try { const accountIndex = notifications.findIndex( - (accountNotifications) => accountNotifications.hostname === hostname, + (accountNotifications) => + accountNotifications.account.hostname === hostname, ); if (accountIndex !== -1) { @@ -238,7 +243,7 @@ export const useNotifications = (): NotificationsState => { auth, settings, notification.id, - notifications[accountIndex].hostname, + notifications[accountIndex].account.hostname, ), ), ); diff --git a/src/routes/LoginWithOAuthApp.test.tsx b/src/routes/LoginWithOAuthApp.test.tsx index fe7a4b24f..cd062d6a4 100644 --- a/src/routes/LoginWithOAuthApp.test.tsx +++ b/src/routes/LoginWithOAuthApp.test.tsx @@ -1,7 +1,6 @@ import { fireEvent, render, screen } from '@testing-library/react'; -import { ipcRenderer, shell } from 'electron'; +import { shell } from 'electron'; import { MemoryRouter } from 'react-router-dom'; -import { mockEnterpriseAccounts } from '../__mocks__/state-mocks'; import { AppContext } from '../context/App'; import type { AuthState } from '../types'; import { LoginWithOAuthApp, validate } from './LoginWithOAuthApp'; @@ -16,15 +15,12 @@ describe('routes/LoginWithOAuthApp.tsx', () => { const openExternalMock = jest.spyOn(shell, 'openExternal'); const mockAuth: AuthState = { - enterpriseAccounts: [], - user: null, + accounts: [], }; beforeEach(() => { openExternalMock.mockReset(); mockNavigate.mockReset(); - - jest.spyOn(ipcRenderer, 'send'); }); it('renders correctly', () => { @@ -111,35 +107,6 @@ describe('routes/LoginWithOAuthApp.tsx', () => { }); }); - it('should receive a logged-in enterprise account', () => { - const { rerender } = render( - - - - - , - ); - - rerender( - - - - - , - ); - - expect(ipcRenderer.send).toHaveBeenCalledTimes(1); - expect(ipcRenderer.send).toHaveBeenCalledWith('reopen-window'); - expect(mockNavigate).toHaveBeenNthCalledWith(1, -1); - }); - it('should render the form with errors', () => { render( diff --git a/src/routes/LoginWithOAuthApp.tsx b/src/routes/LoginWithOAuthApp.tsx index f95ff345f..63acee451 100644 --- a/src/routes/LoginWithOAuthApp.tsx +++ b/src/routes/LoginWithOAuthApp.tsx @@ -4,8 +4,7 @@ import { PersonIcon, SignInIcon, } from '@primer/octicons-react'; -import ipcRenderer from 'electron'; -import { type FC, useCallback, useContext, useEffect } from 'react'; +import { type FC, useCallback, useContext } from 'react'; import { Form, type FormRenderProps } from 'react-final-form'; import { useNavigate } from 'react-router-dom'; import { Button } from '../components/fields/Button'; @@ -57,19 +56,9 @@ export const validate = (values: IValues): IFormErrors => { }; export const LoginWithOAuthApp: FC = () => { - const { - auth: { enterpriseAccounts }, - loginWithOAuthApp: loginEnterprise, - } = useContext(AppContext); + const { loginWithOAuthApp } = useContext(AppContext); const navigate = useNavigate(); - useEffect(() => { - if (enterpriseAccounts.length) { - ipcRenderer.ipcRenderer.send('reopen-window'); - navigate(-1); - } - }, [enterpriseAccounts]); - const renderForm = (formProps: FormRenderProps) => { const { handleSubmit, submitting, pristine, values } = formProps; @@ -129,7 +118,7 @@ export const LoginWithOAuthApp: FC = () => { const login = useCallback(async (data: IValues) => { try { - await loginEnterprise(data as LoginOAuthAppOptions); + await loginWithOAuthApp(data as LoginOAuthAppOptions); } catch (err) { // Skip } diff --git a/src/routes/Notifications.tsx b/src/routes/Notifications.tsx index b8b5f83da..626d938d8 100644 --- a/src/routes/Notifications.tsx +++ b/src/routes/Notifications.tsx @@ -33,11 +33,11 @@ export const NotificationsRoute: FC = () => { return (
- {notifications.map((account) => ( + {notifications.map((accountNotifications) => ( { await act(async () => { render( @@ -55,8 +60,8 @@ describe('routes/Settings.tsx', () => { render( @@ -76,8 +81,8 @@ describe('routes/Settings.tsx', () => { render( @@ -99,8 +104,8 @@ describe('routes/Settings.tsx', () => { render( @@ -127,8 +132,8 @@ describe('routes/Settings.tsx', () => { render( @@ -154,8 +159,8 @@ describe('routes/Settings.tsx', () => { render( @@ -179,8 +184,8 @@ describe('routes/Settings.tsx', () => { render( @@ -214,12 +219,12 @@ describe('routes/Settings.tsx', () => { render( @@ -255,12 +260,12 @@ describe('routes/Settings.tsx', () => { render( @@ -296,8 +301,8 @@ describe('routes/Settings.tsx', () => { render( @@ -321,8 +326,8 @@ describe('routes/Settings.tsx', () => { render( @@ -351,8 +356,8 @@ describe('routes/Settings.tsx', () => { render( @@ -382,8 +387,8 @@ describe('routes/Settings.tsx', () => { render( @@ -407,8 +412,8 @@ describe('routes/Settings.tsx', () => { render( @@ -432,8 +437,8 @@ describe('routes/Settings.tsx', () => { render( @@ -459,8 +464,8 @@ describe('routes/Settings.tsx', () => { render( @@ -484,8 +489,8 @@ describe('routes/Settings.tsx', () => { render( @@ -514,8 +519,8 @@ describe('routes/Settings.tsx', () => { render( @@ -537,11 +542,8 @@ describe('routes/Settings.tsx', () => { render( @@ -564,8 +566,8 @@ describe('routes/Settings.tsx', () => { render( @@ -585,8 +587,8 @@ describe('routes/Settings.tsx', () => { render( @@ -611,7 +613,10 @@ describe('routes/Settings.tsx', () => { await act(async () => { render( diff --git a/src/routes/__snapshots__/Settings.test.tsx.snap b/src/routes/__snapshots__/Settings.test.tsx.snap index c0eb68f2a..e95556fe0 100644 --- a/src/routes/__snapshots__/Settings.test.tsx.snap +++ b/src/routes/__snapshots__/Settings.test.tsx.snap @@ -549,7 +549,6 @@ exports[`routes/Settings.tsx General should render itself & its children 1`] = `