11import userEvent from '@testing-library/user-event' ;
2+ import type MockAdapter from 'axios-mock-adapter' ;
23
34import {
45 initializeMocks , render as baseRender , screen , waitFor ,
6+ fireEvent ,
57} from '../../testUtils' ;
68import { LibraryProvider } from '../common/context/LibraryContext' ;
79import { mockContentLibrary , mockGetContainerChildren } from '../data/api.mocks' ;
810import { type ContainerHit , PublishStatus } from '../../search-manager' ;
911import ContainerCard from './ContainerCard' ;
12+ import { getLibraryContainerApiUrl , getLibraryContainerRestoreApiUrl } from '../data/api' ;
1013
1114const containerHitSample : ContainerHit = {
1215 id : 'lctorg1democourse-unit-display-name-123' ,
@@ -33,6 +36,8 @@ const containerHitSample: ContainerHit = {
3336 tags : { } ,
3437 publishStatus : PublishStatus . Published ,
3538} ;
39+ let axiosMock : MockAdapter ;
40+ let mockShowToast ;
3641
3742mockContentLibrary . applyMock ( ) ;
3843mockGetContainerChildren . applyMock ( ) ;
@@ -50,7 +55,7 @@ const render = (ui: React.ReactElement, showOnlyPublished: boolean = false) => b
5055
5156describe ( '<ContainerCard />' , ( ) => {
5257 beforeEach ( ( ) => {
53- initializeMocks ( ) ;
58+ ( { axiosMock , mockShowToast } = initializeMocks ( ) ) ;
5459 } ) ;
5560
5661 it ( 'should render the card with title' , ( ) => {
@@ -85,6 +90,68 @@ describe('<ContainerCard />', () => {
8590 // );
8691 } ) ;
8792
93+ it ( 'should delete the container from the menu & restore the container' , async ( ) => {
94+ axiosMock . onDelete ( getLibraryContainerApiUrl ( containerHitSample . usageKey ) ) . reply ( 200 ) ;
95+
96+ render ( < ContainerCard hit = { containerHitSample } /> ) ;
97+
98+ // Open menu
99+ expect ( screen . getByTestId ( 'container-card-menu-toggle' ) ) . toBeInTheDocument ( ) ;
100+ userEvent . click ( screen . getByTestId ( 'container-card-menu-toggle' ) ) ;
101+
102+ // Click on Delete Item
103+ const deleteMenuItem = screen . getByRole ( 'button' , { name : 'Delete' } ) ;
104+ expect ( deleteMenuItem ) . toBeInTheDocument ( ) ;
105+ fireEvent . click ( deleteMenuItem ) ;
106+
107+ // Confirm delete Modal is open
108+ expect ( screen . getByText ( 'Delete Unit' ) ) ;
109+ const deleteButton = screen . getByRole ( 'button' , { name : / d e l e t e / i } ) ;
110+ fireEvent . click ( deleteButton ) ;
111+
112+ await waitFor ( ( ) => {
113+ expect ( axiosMock . history . delete . length ) . toBe ( 1 ) ;
114+ } ) ;
115+ expect ( mockShowToast ) . toHaveBeenCalled ( ) ;
116+
117+ // Get restore / undo func from the toast
118+ const restoreFn = mockShowToast . mock . calls [ 0 ] [ 1 ] . onClick ;
119+
120+ const restoreUrl = getLibraryContainerRestoreApiUrl ( containerHitSample . usageKey ) ;
121+ axiosMock . onPost ( restoreUrl ) . reply ( 200 ) ;
122+ // restore collection
123+ restoreFn ( ) ;
124+ await waitFor ( ( ) => {
125+ expect ( axiosMock . history . post . length ) . toEqual ( 1 ) ;
126+ } ) ;
127+ expect ( mockShowToast ) . toHaveBeenCalledWith ( 'Undo successful' ) ;
128+ } ) ;
129+
130+ it ( 'should show error on delete the container from the menu' , async ( ) => {
131+ axiosMock . onDelete ( getLibraryContainerApiUrl ( containerHitSample . usageKey ) ) . reply ( 400 ) ;
132+
133+ render ( < ContainerCard hit = { containerHitSample } /> ) ;
134+
135+ // Open menu
136+ expect ( screen . getByTestId ( 'container-card-menu-toggle' ) ) . toBeInTheDocument ( ) ;
137+ userEvent . click ( screen . getByTestId ( 'container-card-menu-toggle' ) ) ;
138+
139+ // Click on Delete Item
140+ const deleteMenuItem = screen . getByRole ( 'button' , { name : 'Delete' } ) ;
141+ expect ( deleteMenuItem ) . toBeInTheDocument ( ) ;
142+ fireEvent . click ( deleteMenuItem ) ;
143+
144+ // Confirm delete Modal is open
145+ expect ( screen . getByText ( 'Delete Unit' ) ) ;
146+ const deleteButton = screen . getByRole ( 'button' , { name : / d e l e t e / i } ) ;
147+ fireEvent . click ( deleteButton ) ;
148+
149+ await waitFor ( ( ) => {
150+ expect ( axiosMock . history . delete . length ) . toBe ( 1 ) ;
151+ } ) ;
152+ expect ( mockShowToast ) . toHaveBeenCalledWith ( 'Failed to delete unit' ) ;
153+ } ) ;
154+
88155 it ( 'should render no child blocks in card preview' , async ( ) => {
89156 render ( < ContainerCard hit = { containerHitSample } /> ) ;
90157
0 commit comments