1- import { render , screen , waitFor } from '@testing-library/vue' ;
1+ import { render , screen , waitFor , fireEvent } from '@testing-library/vue' ;
22import VueRouter from 'vue-router' ;
33import useUser , { useUserMock } from 'kolibri/composables/useUser' ; // eslint-disable-line import-x/named
44import useSnackbar , { useSnackbarMock } from 'kolibri/composables/useSnackbar' ; // eslint-disable-line import-x/named
@@ -7,12 +7,28 @@ import RearrangeChannelsPage from '../RearrangeChannelsPage';
77import makeStore from '../../__tests__/utils/makeStore' ;
88import { PageNames } from '../../constants' ;
99
10- const { instructions$, noChannels$ } = createTranslator (
10+ const { instructions$, noChannels$, successNotification$ } = createTranslator (
1111 RearrangeChannelsPage . name ,
1212 RearrangeChannelsPage . $trs ,
1313) ;
1414
1515jest . mock ( '../../composables/useContentTasks' ) ;
16+ jest . mock ( 'kolibri-common/composables/usePageLoading' ) ;
17+ jest . mock ( 'kolibri-common/components/sortable/DragContainer' , ( ) => ( {
18+ default : {
19+ name : 'DragContainer' ,
20+ props : [ 'items' ] ,
21+ template : `
22+ <div>
23+ <button data-testid="trigger-sort" @click="$emit('sort', { newArray: [items[1], items[0]] })">
24+ Trigger Sort
25+ </button>
26+ <slot />
27+ </div>
28+ ` ,
29+ } ,
30+ }
31+ ) ) ;
1632jest . mock ( 'kolibri/composables/useUser' ) ;
1733jest . mock ( 'kolibri/composables/useSnackbar' ) ;
1834
@@ -30,9 +46,6 @@ const MOCK_CHANNELS = [
3046 { id : '2' , name : 'Channel 2' } ,
3147] ;
3248
33- RearrangeChannelsPage . methods . postNewOrder = ( ) => Promise . resolve ( ) ;
34- RearrangeChannelsPage . methods . fetchChannels = ( ) => Promise . resolve ( MOCK_CHANNELS ) ;
35-
3649describe ( 'RearrangeChannelsPage' , ( ) => {
3750 let createSnackbar ;
3851
@@ -49,6 +62,8 @@ describe('RearrangeChannelsPage', () => {
4962
5063 beforeEach ( ( ) => {
5164 jest . clearAllMocks ( ) ;
65+ RearrangeChannelsPage . methods . fetchChannels = ( ) => Promise . resolve ( MOCK_CHANNELS ) ;
66+ RearrangeChannelsPage . methods . postNewOrder = ( ) => Promise . resolve ( ) ;
5267 } ) ;
5368
5469 it ( 'loads the data on mount' , async ( ) => {
@@ -67,10 +82,25 @@ describe('RearrangeChannelsPage', () => {
6782 } ) ;
6883
6984 it ( 'shows a message when there are no channels' , async ( ) => {
70- RearrangeChannelsPage . methods . fetchChannels = ( ) => Promise . resolve ( [ ] ) ;
71- await renderComponent ( ) ;
72- await waitFor ( ( ) => {
73- expect ( screen . getByText ( noChannels$ ( ) ) ) . toBeInTheDocument ( ) ;
85+ RearrangeChannelsPage . methods . fetchChannels = ( ) => Promise . resolve ( [ ] ) ;
86+ await renderComponent ( ) ;
87+ await waitFor ( ( ) => {
88+ expect ( screen . getByText ( noChannels$ ( ) ) ) . toBeInTheDocument ( ) ;
89+ } ) ;
90+ } ) ;
91+
92+ it ( 'handles a successful @sort event properly' , async ( ) => {
93+ await renderComponent ( ) ;
94+ await waitFor ( ( ) => screen . getByText ( MOCK_CHANNELS [ 0 ] . name ) ) ;
95+
96+ await fireEvent . click ( screen . getByTestId ( 'trigger-sort' ) ) ;
97+
98+ await waitFor ( ( ) => {
99+ expect ( createSnackbar ) . toHaveBeenCalledWith ( successNotification$ ( ) ) ;
100+ } ) ;
101+ const titles = screen
102+ . getAllByText ( new RegExp ( `^(${ MOCK_CHANNELS [ 0 ] . name } |${ MOCK_CHANNELS [ 1 ] . name } )$` ) )
103+ . map ( el => el . textContent ) ;
104+ expect ( titles ) . toEqual ( [ MOCK_CHANNELS [ 1 ] . name , MOCK_CHANNELS [ 0 ] . name ] ) ;
74105 } ) ;
75106 } ) ;
76- } ) ;
0 commit comments