11import { LocationFixture } from 'sentry-fixture/locationFixture' ;
22import { RouterFixture } from 'sentry-fixture/routerFixture' ;
33
4- import { render , screen , userEvent } from 'sentry-test/reactTestingLibrary' ;
4+ import { render , screen , userEvent , waitFor } from 'sentry-test/reactTestingLibrary' ;
55
6+ import { addErrorMessage } from 'sentry/actionCreators/indicator' ;
67import { useNavigate } from 'sentry/utils/useNavigate' ;
78import WidgetTemplatesList from 'sentry/views/dashboards/widgetBuilder/components/widgetTemplatesList' ;
89import { WidgetBuilderProvider } from 'sentry/views/dashboards/widgetBuilder/contexts/widgetBuilderContext' ;
@@ -30,10 +31,21 @@ const router = RouterFixture({
3031 location : LocationFixture ( { query : { } } ) ,
3132} ) ;
3233
34+ jest . mock ( 'sentry/actionCreators/indicator' ) ;
35+
3336describe ( 'WidgetTemplatesList' , ( ) => {
37+ const onSave = jest . fn ( ) ;
38+
3439 beforeEach ( ( ) => {
3540 const mockNavigate = jest . fn ( ) ;
3641 mockUseNavigate . mockReturnValue ( mockNavigate ) ;
42+
43+ MockApiClient . addMockResponse ( {
44+ url : '/organizations/org-slug/dashboards/widgets/' ,
45+ method : 'POST' ,
46+ body : { } ,
47+ statusCode : 400 ,
48+ } ) ;
3749 } ) ;
3850
3951 afterEach ( ( ) => {
@@ -43,7 +55,7 @@ describe('WidgetTemplatesList', () => {
4355 it ( 'should render the widget templates list' , async ( ) => {
4456 render (
4557 < WidgetBuilderProvider >
46- < WidgetTemplatesList />
58+ < WidgetTemplatesList onSave = { onSave } />
4759 </ WidgetBuilderProvider >
4860 ) ;
4961
@@ -54,7 +66,7 @@ describe('WidgetTemplatesList', () => {
5466 it ( 'should render buttons when the user clicks on a widget template' , async ( ) => {
5567 render (
5668 < WidgetBuilderProvider >
57- < WidgetTemplatesList />
69+ < WidgetTemplatesList onSave = { onSave } />
5870 </ WidgetBuilderProvider >
5971 ) ;
6072
@@ -71,7 +83,7 @@ describe('WidgetTemplatesList', () => {
7183
7284 render (
7385 < WidgetBuilderProvider >
74- < WidgetTemplatesList />
86+ < WidgetTemplatesList onSave = { onSave } />
7587 </ WidgetBuilderProvider > ,
7688 { router}
7789 ) ;
@@ -91,4 +103,24 @@ describe('WidgetTemplatesList', () => {
91103 } )
92104 ) ;
93105 } ) ;
106+
107+ it ( 'should show error message when the widget fails to save' , async ( ) => {
108+ render (
109+ < WidgetBuilderProvider >
110+ < WidgetTemplatesList onSave = { onSave } />
111+ </ WidgetBuilderProvider >
112+ ) ;
113+
114+ const widgetTemplate = await screen . findByText ( 'Duration Distribution' ) ;
115+ await userEvent . click ( widgetTemplate ) ;
116+
117+ await userEvent . click ( await screen . findByText ( 'Add to dashboard' ) ) ;
118+
119+ await waitFor ( ( ) => {
120+ expect ( addErrorMessage ) . toHaveBeenCalledWith ( 'Unable to add widget' ) ;
121+ } ) ;
122+
123+ // show we're still on the widget templates list
124+ expect ( await screen . findByText ( 'Add to dashboard' ) ) . toBeInTheDocument ( ) ;
125+ } ) ;
94126} ) ;
0 commit comments