Quellcode durchsuchen

test: increase coverage for get-server-auth-session

Nicolas Meienberger vor 2 Jahren
Ursprung
Commit
75f13c8b1d

+ 36 - 22
src/client/modules/Settings/containers/SettingsContainer/SettingsContainer.test.tsx

@@ -3,6 +3,7 @@ import React from 'react';
 import { render, screen, waitFor, act, fireEvent, renderHook } from '../../../../../../tests/test-utils';
 import { getTRPCMockError } from '../../../../mocks/getTrpcMock';
 import { server } from '../../../../mocks/server';
+import { useSystemStore } from '../../../../state/systemStore';
 import { useToastStore } from '../../../../state/toastStore';
 import { SettingsContainer } from './SettingsContainer';
 
@@ -41,34 +42,40 @@ describe('Test: SettingsContainer', () => {
     });
   });
 
-  describe('Update', () => {
+  describe('Restart', () => {
     it('should remove token from local storage on success', async () => {
-      const current = '0.0.1';
-      const latest = faker.system.semver();
+      const { result, unmount } = renderHook(() => useSystemStore());
+      const current = faker.system.semver();
       const removeItem = jest.spyOn(localStorage, 'removeItem');
-      render(<SettingsContainer data={{ current, latest }} />);
 
-      const updateButton = screen.getByText('Update');
+      render(<SettingsContainer data={{ current, latest: current }} />);
+      expect(result.current.pollStatus).toBe(false);
+
+      const restartButton = screen.getByTestId('settings-modal-restart-button');
+
       act(() => {
-        fireEvent.click(updateButton);
+        fireEvent.click(restartButton);
       });
 
       await waitFor(() => {
         expect(removeItem).toBeCalledWith('token');
+        expect(result.current.pollStatus).toBe(true);
       });
+
+      removeItem.mockRestore();
+      unmount();
     });
 
     it('should display error toast on error', async () => {
       const { result, unmount } = renderHook(() => useToastStore());
-      const current = '0.0.1';
-      const latest = faker.system.semver();
+      const current = faker.system.semver();
       const error = faker.lorem.sentence();
-      server.use(getTRPCMockError({ path: ['system', 'update'], type: 'mutation', message: error }));
-      render(<SettingsContainer data={{ current, latest }} />);
+      server.use(getTRPCMockError({ path: ['system', 'restart'], type: 'mutation', message: error }));
+      render(<SettingsContainer data={{ current }} />);
 
-      const updateButton = screen.getByText('Update');
+      const restartButton = screen.getByTestId('settings-modal-restart-button');
       act(() => {
-        fireEvent.click(updateButton);
+        fireEvent.click(restartButton);
       });
 
       await waitFor(() => {
@@ -79,32 +86,39 @@ describe('Test: SettingsContainer', () => {
     });
   });
 
-  describe('Restart', () => {
+  describe('Update', () => {
     it('should remove token from local storage on success', async () => {
-      const current = faker.system.semver();
+      const { result, unmount } = renderHook(() => useSystemStore());
+      const current = '0.0.1';
+      const latest = faker.system.semver();
       const removeItem = jest.spyOn(localStorage, 'removeItem');
 
-      render(<SettingsContainer data={{ current }} />);
-      const restartButton = screen.getByTestId('settings-modal-restart-button');
+      render(<SettingsContainer data={{ current, latest }} />);
+
+      const updateButton = screen.getByText('Update');
       act(() => {
-        fireEvent.click(restartButton);
+        fireEvent.click(updateButton);
       });
 
       await waitFor(() => {
         expect(removeItem).toBeCalledWith('token');
+        expect(result.current.pollStatus).toBe(true);
       });
+
+      unmount();
     });
 
     it('should display error toast on error', async () => {
       const { result, unmount } = renderHook(() => useToastStore());
-      const current = faker.system.semver();
+      const current = '0.0.1';
+      const latest = faker.system.semver();
       const error = faker.lorem.sentence();
-      server.use(getTRPCMockError({ path: ['system', 'restart'], type: 'mutation', message: error }));
-      render(<SettingsContainer data={{ current }} />);
+      server.use(getTRPCMockError({ path: ['system', 'update'], type: 'mutation', message: error }));
+      render(<SettingsContainer data={{ current, latest }} />);
 
-      const restartButton = screen.getByTestId('settings-modal-restart-button');
+      const updateButton = screen.getByText('Update');
       act(() => {
-        fireEvent.click(restartButton);
+        fireEvent.click(updateButton);
       });
 
       await waitFor(() => {

+ 6 - 4
src/client/modules/Settings/containers/SettingsContainer/SettingsContainer.tsx

@@ -27,15 +27,16 @@ export const SettingsContainer: React.FC<IProps> = ({ data }) => {
       setLoading(true);
     },
     onSuccess: async () => {
-      setLoading(false);
       setPollStatus(true);
       localStorage.removeItem('token');
     },
     onError: (error) => {
-      setLoading(false);
       updateDisclosure.close();
       addToast({ title: 'Error', description: error.message, status: 'error' });
     },
+    onSettled: () => {
+      setLoading(false);
+    },
   });
 
   const restart = trpc.system.restart.useMutation({
@@ -43,15 +44,16 @@ export const SettingsContainer: React.FC<IProps> = ({ data }) => {
       setLoading(true);
     },
     onSuccess: async () => {
-      setLoading(false);
       setPollStatus(true);
       localStorage.removeItem('token');
     },
     onError: (error) => {
-      setLoading(false);
       restartDisclosure.close();
       addToast({ title: 'Error', description: error.message, status: 'error' });
     },
+    onSettled: () => {
+      setLoading(false);
+    },
   });
 
   const renderUpdate = () => {

+ 35 - 0
src/server/common/__tests__/get-server-auth-session.test.ts

@@ -0,0 +1,35 @@
+import jwt from 'jsonwebtoken';
+import TipiCache from '../../core/TipiCache';
+import { getConfig } from '../../core/TipiConfig';
+import { getServerAuthSession } from '../get-server-auth-session';
+
+jest.mock('redis');
+
+describe('getServerAuthSession', () => {
+  it('should return null if no token is provided', async () => {
+    // @ts-expect-error - wrong res
+    const result = await getServerAuthSession({ req: { headers: { authorization: null } }, res: {} });
+    expect(result).toBeNull();
+  });
+
+  it('should return null if an invalid token is provided', async () => {
+    // @ts-expect-error - wrong res
+    const result = await getServerAuthSession({ req: { headers: { authorization: 'Bearer invalid_token' } }, res: {} });
+    expect(result).toBeNull();
+  });
+
+  it('should return null if there is no session id in the cache', async () => {
+    const validToken = jwt.sign('12', getConfig().jwtSecret);
+    // @ts-expect-error - wrong res
+    const result = await getServerAuthSession({ req: { headers: { authorization: `Bearer ${validToken}` } }, res: {} });
+    expect(result).toBeNull();
+  });
+
+  it('should return the user id and session id if a valid token is provided', async () => {
+    const validToken = jwt.sign({ id: 12, session: 'session_id' }, getConfig().jwtSecret);
+    TipiCache.set('session_id', '12');
+    // @ts-expect-error - wrong res
+    const result = await getServerAuthSession({ req: { headers: { authorization: `Bearer ${validToken}` } }, res: {} });
+    expect(result).toEqual({ userId: 12, id: 'session_id' });
+  });
+});