From 7474c4d483551c3bf4b5076db4f9be0e2bab5bda Mon Sep 17 00:00:00 2001 From: Lukas Freimonas Date: Thu, 9 Apr 2026 11:08:06 +0300 Subject: [PATCH 01/12] feat: enhance SaveArticleButton and useUASButton: add title prop, implement handleSaveArticle, update tests --- .../SaveArticleButton/index.test.tsx | 38 +++++++ .../components/SaveArticleButton/index.tsx | 22 ++-- src/app/hooks/useUASButton/index.test.tsx | 100 +++++++++++++++++- src/app/hooks/useUASButton/index.ts | 34 ++++-- .../useUASFetchSaveStatus/index.test.tsx | 4 +- src/app/hooks/useUASFetchSaveStatus/index.ts | 17 +-- src/app/lib/uasApi/uasUtility.ts | 45 ++++++-- src/app/pages/ArticlePage/ArticlePage.tsx | 3 + 8 files changed, 227 insertions(+), 36 deletions(-) diff --git a/src/app/components/SaveArticleButton/index.test.tsx b/src/app/components/SaveArticleButton/index.test.tsx index 709b17cd8e7..763ba1d37af 100644 --- a/src/app/components/SaveArticleButton/index.test.tsx +++ b/src/app/components/SaveArticleButton/index.test.tsx @@ -10,8 +10,11 @@ describe('SaveArticleButton', () => { const defaultProps = { articleId: '123', service: 'hindi', + title: 'Test Article Title', }; + const mockHandleSaveArticle = jest.fn(); + afterEach(() => { jest.clearAllMocks(); }); @@ -21,6 +24,7 @@ describe('SaveArticleButton', () => { showButton: false, isSaved: false, isLoading: false, + handleSaveArticle: mockHandleSaveArticle, }); const { container } = render(); @@ -32,6 +36,7 @@ describe('SaveArticleButton', () => { showButton: true, isSaved: false, isLoading: false, + handleSaveArticle: mockHandleSaveArticle, }); render(); @@ -43,6 +48,7 @@ describe('SaveArticleButton', () => { showButton: true, isSaved: true, isLoading: false, + handleSaveArticle: mockHandleSaveArticle, }); render(); @@ -54,6 +60,7 @@ describe('SaveArticleButton', () => { showButton: true, isSaved: false, isLoading: true, + handleSaveArticle: mockHandleSaveArticle, }); render(); @@ -62,4 +69,35 @@ describe('SaveArticleButton', () => { expect(button).toHaveTextContent('Loading...'); expect(button).toBeDisabled(); }); + + test('calls handleSaveArticle when button is clicked', async () => { + mockedUseUASButton.mockReturnValue({ + showButton: true, + isSaved: false, + isLoading: false, + handleSaveArticle: mockHandleSaveArticle, + }); + + render(); + screen.getByRole('button').click(); + + expect(mockHandleSaveArticle).toHaveBeenCalledTimes(1); + }); + + test('passes title to useUASButton hook', () => { + mockedUseUASButton.mockReturnValue({ + showButton: true, + isSaved: false, + isLoading: false, + handleSaveArticle: mockHandleSaveArticle, + }); + + render(); + + expect(mockedUseUASButton).toHaveBeenCalledWith({ + articleId: '123', + service: 'hindi', + title: 'Test Article Title', + }); + }); }); diff --git a/src/app/components/SaveArticleButton/index.tsx b/src/app/components/SaveArticleButton/index.tsx index 2587917a198..17e1174909d 100644 --- a/src/app/components/SaveArticleButton/index.tsx +++ b/src/app/components/SaveArticleButton/index.tsx @@ -4,17 +4,20 @@ import styles from './index.styles'; interface SaveArticleButtonProps { articleId: string; service: string; + title: string; } -/** A button component that allows users to save an article for later reading, - * showing the button based on user sign in status and feature toggles, - * and displaying the saved status, loading state, and handling errors from the UAS API. - * FUTURE TODO : Implement button click handler to toggle saved state */ -const SaveArticleButton = ({ articleId, service }: SaveArticleButtonProps) => { - const { showButton, isSaved, isLoading, error } = useUASButton({ - articleId, - service, - }); +const SaveArticleButton = ({ + articleId, + service, + title, +}: SaveArticleButtonProps) => { + const { showButton, isSaved, isLoading, error, handleSaveArticle } = + useUASButton({ + articleId, + service, + title, + }); if (!showButton) { return null; @@ -43,6 +46,7 @@ const SaveArticleButton = ({ articleId, service }: SaveArticleButtonProps) => {