@@ -3,6 +3,7 @@ import VueRouter from 'vue-router';
33import { ref } from 'vue' ;
44import store from 'kolibri/store' ;
55import makeStore from '../../../../__tests__/utils/makeStore' ;
6+ import classSummaryModule from '../../../../modules/classSummary' ;
67// eslint-disable-next-line import/named
78import { useAttendance , useAttendanceMock } from '../../../../composables/useAttendance' ;
89import AttendanceBlock from '../AttendanceBlock.vue' ;
@@ -69,7 +70,17 @@ const STUBS = {
6970 KLabeledIcon : { name : 'KLabeledIcon' , template : '<span><slot /></span>' } ,
7071} ;
7172
72- function makeWrapper ( { sessions = [ ] , pendingFetch = false , rejectWith = null } = { } ) {
73+ const MOCK_LEARNERS = [
74+ { id : 'learner-1' , name : 'Learner One' , username : 'learner1' } ,
75+ { id : 'learner-2' , name : 'Learner Two' , username : 'learner2' } ,
76+ ] ;
77+
78+ function makeWrapper ( {
79+ sessions = [ ] ,
80+ learners = MOCK_LEARNERS ,
81+ pendingFetch = false ,
82+ rejectWith = null ,
83+ } = { } ) {
7384 const recentSessions = ref ( sessions ) ;
7485 let fetchRecentSessions ;
7586 if ( rejectWith ) {
@@ -88,6 +99,19 @@ function makeWrapper({ sessions = [], pendingFetch = false, rejectWith = null }
8899
89100 const testStore = makeStore ( ) ;
90101
102+ // Populate learnerMap so the component's learners computed property works
103+ const learnerMap = { } ;
104+ learners . forEach ( l => {
105+ learnerMap [ l . id ] = l ;
106+ } ) ;
107+ testStore . state . classSummary . learnerMap = learnerMap ;
108+
109+ // Ensure the classSummary module is registered on the singleton store
110+ // so that store.getters['classSummary/learners'] is available
111+ if ( ! store . hasModule ( 'classSummary' ) ) {
112+ store . registerModule ( 'classSummary' , classSummaryModule ) ;
113+ }
114+
91115 // Point the kolibri/store singleton state at the test store state
92116 store . replaceState ( testStore . state ) ;
93117
@@ -122,10 +146,18 @@ describe('AttendanceBlock', () => {
122146 expect ( wrapper . find ( '[data-test="loader"]' ) . exists ( ) ) . toBe ( true ) ;
123147 } ) ;
124148
125- it ( 'renders empty state when no sessions exist' , async ( ) => {
126- const { wrapper } = makeWrapper ( { sessions : [ ] } ) ;
149+ it ( 'renders empty state when no sessions exist but learners are enrolled' , async ( ) => {
150+ const { wrapper } = makeWrapper ( { sessions : [ ] , learners : MOCK_LEARNERS } ) ;
151+ await global . flushPromises ( ) ;
152+ expect ( wrapper . text ( ) ) . toContain ( 'No attendance sessions yet' ) ;
153+ expect ( wrapper . text ( ) ) . not . toContain ( 'Enroll learners' ) ;
154+ } ) ;
155+
156+ it ( 'renders enroll message when no sessions and no learners are enrolled' , async ( ) => {
157+ const { wrapper } = makeWrapper ( { sessions : [ ] , learners : [ ] } ) ;
127158 await global . flushPromises ( ) ;
128159 expect ( wrapper . text ( ) ) . toContain ( 'No attendance sessions yet' ) ;
160+ expect ( wrapper . text ( ) ) . toContain ( 'Enroll learners to mark attendance' ) ;
129161 } ) ;
130162
131163 it ( 'renders sessions with present and absent counts' , async ( ) => {
0 commit comments