Skip to content

Commit 4a3b22d

Browse files
committed
feat: some more user context tests
1 parent aa5f475 commit 4a3b22d

File tree

2 files changed

+219
-6
lines changed

2 files changed

+219
-6
lines changed

src/context/UserContext.spec.tsx

+214-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import vscode from '../__mocks__/vscode';
99
import { RecoilRoot, useRecoilValue } from 'recoil';
1010
import { AccountSettingProvider } from './UserContext';
1111
import {
12-
AnalyzeState,
1312
ApplicationWebviewState,
1413
EventDataType,
1514
FixSuggestionsPayload,
@@ -28,6 +27,7 @@ export const RecoilObserver = ({ node, onChange }) => {
2827
describe('AccountSettingProvider', () => {
2928
afterEach(() => {
3029
jest.clearAllMocks();
30+
jest.resetModules();
3131
});
3232

3333
it('should recieve Get_INIT_DATA event when the component renders', () => {
@@ -753,4 +753,217 @@ describe('AccountSettingProvider', () => {
753753

754754
expect(mockCurrentWorkSpaceProjectStateHandler).toHaveBeenCalledWith(undefined);
755755
});
756+
757+
it('should update Recoil state correctly on INIT_DATA event with valid payload', () => {
758+
const mockMessageEvent = (event: MessageEvent<MessageType>) => {
759+
window.dispatchEvent(event);
760+
};
761+
const mockApplicationStateHandler = jest.fn();
762+
const mockHasOpenTextDocumentsStateHandler = jest.fn();
763+
const mockHasWorkSpaceFoldersStateHandler = jest.fn();
764+
const mockIdentifiedProblemsStateHandler = jest.fn();
765+
const mockCurrentWorkSpaceProjectStateHandler = jest.fn();
766+
const mockCurrentEditorStateHandler = jest.fn();
767+
768+
render(
769+
<RecoilRoot>
770+
<AccountSettingProvider>
771+
<RecoilObserver node={State.applicationState} onChange={mockApplicationStateHandler} />
772+
<RecoilObserver
773+
node={State.hasOpenTextDocuments}
774+
onChange={mockHasOpenTextDocumentsStateHandler}
775+
/>
776+
<RecoilObserver
777+
node={State.hasWorkSpaceFolders}
778+
onChange={mockHasWorkSpaceFoldersStateHandler}
779+
/>
780+
<RecoilObserver
781+
node={State.identifiedProblems}
782+
onChange={mockIdentifiedProblemsStateHandler}
783+
/>
784+
<RecoilObserver
785+
node={State.currentWorkSpaceProject}
786+
onChange={mockCurrentWorkSpaceProjectStateHandler}
787+
/>
788+
<RecoilObserver node={State.currentEditor} onChange={mockCurrentEditorStateHandler} />
789+
</AccountSettingProvider>
790+
</RecoilRoot>,
791+
);
792+
793+
act(() => {
794+
const payload = {
795+
hasOpenTextDocuments: true,
796+
hasWorkSpaceFolders: true,
797+
initData: {
798+
...IdentifiedProblems,
799+
},
800+
currentWorkSpaceFolder: 'exampleProject',
801+
currentFile: { fileName: 'exampleFileName.git' },
802+
};
803+
const messageEvent = new MessageEvent<MessageType>('message', {
804+
data: {
805+
type: EventDataType.INIT_DATA,
806+
data: payload,
807+
},
808+
});
809+
mockMessageEvent(messageEvent);
810+
});
811+
812+
expect(mockApplicationStateHandler).toHaveBeenCalledWith(ApplicationWebviewState.ANALYZE_MODE);
813+
expect(mockHasOpenTextDocumentsStateHandler).toHaveBeenCalledWith(true);
814+
expect(mockHasWorkSpaceFoldersStateHandler).toHaveBeenCalledWith(true);
815+
expect(mockIdentifiedProblemsStateHandler).toHaveBeenCalledWith(IdentifiedProblems);
816+
expect(mockCurrentWorkSpaceProjectStateHandler).toHaveBeenCalledWith('exampleProject');
817+
expect(mockCurrentEditorStateHandler).toHaveBeenCalledWith('exampleFileName');
818+
});
819+
820+
it('should update Recoil state correctly on INIT_DATA event with valid payload with an edge case', () => {
821+
const mockMessageEvent = (event: MessageEvent<MessageType>) => {
822+
window.dispatchEvent(event);
823+
};
824+
const mockApplicationStateHandler = jest.fn();
825+
const mockHasOpenTextDocumentsStateHandler = jest.fn();
826+
const mockHasWorkSpaceFoldersStateHandler = jest.fn();
827+
const mockIdentifiedProblemsStateHandler = jest.fn();
828+
const mockCurrentWorkSpaceProjectStateHandler = jest.fn();
829+
const mockCurrentEditorStateHandler = jest.fn();
830+
831+
render(
832+
<RecoilRoot>
833+
<AccountSettingProvider>
834+
<RecoilObserver node={State.applicationState} onChange={mockApplicationStateHandler} />
835+
<RecoilObserver
836+
node={State.hasOpenTextDocuments}
837+
onChange={mockHasOpenTextDocumentsStateHandler}
838+
/>
839+
<RecoilObserver
840+
node={State.hasWorkSpaceFolders}
841+
onChange={mockHasWorkSpaceFoldersStateHandler}
842+
/>
843+
<RecoilObserver
844+
node={State.identifiedProblems}
845+
onChange={mockIdentifiedProblemsStateHandler}
846+
/>
847+
<RecoilObserver
848+
node={State.currentWorkSpaceProject}
849+
onChange={mockCurrentWorkSpaceProjectStateHandler}
850+
/>
851+
<RecoilObserver node={State.currentEditor} onChange={mockCurrentEditorStateHandler} />
852+
</AccountSettingProvider>
853+
</RecoilRoot>,
854+
);
855+
856+
act(() => {
857+
const payload = {
858+
hasOpenTextDocuments: true,
859+
hasWorkSpaceFolders: true,
860+
initData: {
861+
...IdentifiedProblems,
862+
},
863+
currentWorkSpaceFolder: 'exampleProject',
864+
currentFile: {},
865+
};
866+
const messageEvent = new MessageEvent<MessageType>('message', {
867+
data: {
868+
type: EventDataType.INIT_DATA,
869+
data: payload,
870+
},
871+
});
872+
mockMessageEvent(messageEvent);
873+
});
874+
875+
expect(mockApplicationStateHandler).toHaveBeenCalledWith(ApplicationWebviewState.ANALYZE_MODE);
876+
expect(mockHasOpenTextDocumentsStateHandler).toHaveBeenCalledWith(true);
877+
expect(mockHasWorkSpaceFoldersStateHandler).toHaveBeenCalledWith(true);
878+
expect(mockIdentifiedProblemsStateHandler).toHaveBeenCalledWith(IdentifiedProblems);
879+
expect(mockCurrentWorkSpaceProjectStateHandler).toHaveBeenCalledWith('exampleProject');
880+
expect(mockCurrentEditorStateHandler).toHaveBeenCalledWith(undefined);
881+
});
882+
883+
it('should update Recoil state correctly on GENERATE_CLICKED_RESPONSE event with valid payload', () => {
884+
const mockIdentifiedRecommendationStateHandler = jest.fn();
885+
const mockIsRecommendationLoadingStateHandler = jest.fn();
886+
const mockMessageEvent = (event: MessageEvent<MessageType>) => {
887+
window.dispatchEvent(event);
888+
};
889+
render(
890+
<RecoilRoot>
891+
<AccountSettingProvider>
892+
<RecoilObserver
893+
node={State.identifiedRecommendation}
894+
onChange={mockIdentifiedRecommendationStateHandler}
895+
/>
896+
<RecoilObserver
897+
node={State.isRecommendationLoading}
898+
onChange={mockIsRecommendationLoadingStateHandler}
899+
/>
900+
</AccountSettingProvider>
901+
</RecoilRoot>,
902+
);
903+
904+
act(() => {
905+
const payload = {
906+
recommendation: 'Some recommendation',
907+
problemId: 'problem1',
908+
};
909+
const messageEvent = new MessageEvent<MessageType>('message', {
910+
data: {
911+
type: EventDataType.GENERATE_CLICKED_RESPONSE,
912+
data: payload,
913+
},
914+
});
915+
mockMessageEvent(messageEvent);
916+
});
917+
918+
expect(mockIdentifiedRecommendationStateHandler).toHaveBeenCalledWith({
919+
problem1: [{ recommendation: 'Some recommendation' }],
920+
});
921+
expect(mockIsRecommendationLoadingStateHandler).toHaveBeenCalledWith(false);
922+
});
923+
924+
it('should not update Recoil state on GENERATE_CLICKED_RESPONSE event with empty recommendation', () => {
925+
const mockIdentifiedRecommendationStateHandler = jest.fn();
926+
const mockIsRecommendationLoadingStateHandler = jest.fn();
927+
const mockMessageEvent = (event: MessageEvent<MessageType>) => {
928+
window.dispatchEvent(event);
929+
};
930+
render(
931+
<RecoilRoot
932+
initializeState={({ set }) => {
933+
set(State.identifiedRecommendation, undefined);
934+
}}
935+
>
936+
<AccountSettingProvider>
937+
<RecoilObserver
938+
node={State.identifiedRecommendation}
939+
onChange={mockIdentifiedRecommendationStateHandler}
940+
/>
941+
<RecoilObserver
942+
node={State.isRecommendationLoading}
943+
onChange={mockIsRecommendationLoadingStateHandler}
944+
/>
945+
</AccountSettingProvider>
946+
</RecoilRoot>,
947+
);
948+
949+
act(() => {
950+
const payload = {
951+
recommendation: '', // Empty recommendation
952+
problemId: 'problem2',
953+
};
954+
const messageEvent = new MessageEvent<MessageType>('message', {
955+
data: {
956+
type: EventDataType.GENERATE_CLICKED_RESPONSE,
957+
data: payload,
958+
},
959+
});
960+
mockMessageEvent(messageEvent);
961+
});
962+
963+
// Ensure Recoil state remains unchanged
964+
expect(mockIdentifiedRecommendationStateHandler).toHaveBeenCalledWith({
965+
problem1: [{ recommendation: 'Some recommendation' }],
966+
});
967+
expect(mockIsRecommendationLoadingStateHandler).toHaveBeenCalledWith(false);
968+
});
756969
});

src/context/UserContext.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ const AccountSettingProvider = ({ children }: Props): JSX.Element => {
107107
}
108108

109109
if (currentFile) {
110-
const filename: string | undefined = currentFile.fileName
111-
.split('/')
112-
.pop()
110+
const filename: string | undefined = currentFile?.fileName
111+
?.split('/')
112+
?.pop()
113113
?.replace('.git', '');
114114

115115
if (!filename) {
@@ -123,7 +123,7 @@ const AccountSettingProvider = ({ children }: Props): JSX.Element => {
123123
case EventDataType.GENERATE_CLICKED_GPT_RESPONSE: {
124124
const { recommendation: recomendation_from_gpt, problemId } = payload;
125125

126-
if (recomendation_from_gpt !== '') {
126+
if (recomendation_from_gpt && recomendation_from_gpt.length > 0 && problemId) {
127127
setIdentifiedRecommendation(prev => {
128128
const prevRecommendation = prev?.[problemId] || [];
129129
const newRecomendation = [
@@ -185,7 +185,7 @@ const AccountSettingProvider = ({ children }: Props): JSX.Element => {
185185
}
186186
break;
187187
case EventDataType.CURRENT_FILE:
188-
const filename: string | undefined = payload.fileName
188+
const filename: string | undefined = payload?.fileName
189189
?.split('/')
190190
?.pop()
191191
?.replace('.git', '');

0 commit comments

Comments
 (0)