@@ -44,6 +44,11 @@ describe('actionStateMachine', () => {
4444 expect ( result ) . toEqual ( { status : Status . accepted , isValidAction : true } )
4545 } )
4646
47+ it ( 'allows organizer to waitlist' , ( ) => {
48+ const result = actionStateMachine ( Status . submitted , Action . waitlist , true )
49+ expect ( result ) . toEqual ( { status : Status . waitlisted , isValidAction : true } )
50+ } )
51+
4752 it ( 'allows organizer to reject' , ( ) => {
4853 const result = actionStateMachine ( Status . submitted , Action . reject , true )
4954 expect ( result ) . toEqual ( { status : Status . rejected , isValidAction : true } )
@@ -54,6 +59,15 @@ describe('actionStateMachine', () => {
5459 expect ( result . isValidAction ) . toBe ( false )
5560 } )
5661
62+ it ( 'prevents non-organizer from waitlisting' , ( ) => {
63+ const result = actionStateMachine (
64+ Status . submitted ,
65+ Action . waitlist ,
66+ false ,
67+ )
68+ expect ( result . isValidAction ) . toBe ( false )
69+ } )
70+
5771 it ( 'prevents non-organizer from rejecting' , ( ) => {
5872 const result = actionStateMachine ( Status . submitted , Action . reject , false )
5973 expect ( result . isValidAction ) . toBe ( false )
@@ -110,6 +124,37 @@ describe('actionStateMachine', () => {
110124 } )
111125 } )
112126
127+ describe ( 'waitlisted status' , ( ) => {
128+ it ( 'allows organizer to accept' , ( ) => {
129+ const result = actionStateMachine ( Status . waitlisted , Action . accept , true )
130+ expect ( result ) . toEqual ( { status : Status . accepted , isValidAction : true } )
131+ } )
132+
133+ it ( 'allows organizer to reject' , ( ) => {
134+ const result = actionStateMachine ( Status . waitlisted , Action . reject , true )
135+ expect ( result ) . toEqual ( { status : Status . rejected , isValidAction : true } )
136+ } )
137+
138+ it ( 'allows speaker to withdraw' , ( ) => {
139+ const result = actionStateMachine (
140+ Status . waitlisted ,
141+ Action . withdraw ,
142+ false ,
143+ )
144+ expect ( result ) . toEqual ( { status : Status . withdrawn , isValidAction : true } )
145+ } )
146+
147+ it ( 'prevents non-organizer from accepting' , ( ) => {
148+ const result = actionStateMachine ( Status . waitlisted , Action . accept , false )
149+ expect ( result . isValidAction ) . toBe ( false )
150+ } )
151+
152+ it ( 'prevents non-organizer from rejecting' , ( ) => {
153+ const result = actionStateMachine ( Status . waitlisted , Action . reject , false )
154+ expect ( result . isValidAction ) . toBe ( false )
155+ } )
156+ } )
157+
113158 describe ( 'full lifecycle: draft → submitted → accepted → confirmed' , ( ) => {
114159 it ( 'transitions through the complete happy path' , ( ) => {
115160 let { status } = actionStateMachine ( Status . draft , Action . submit , false )
@@ -119,5 +164,14 @@ describe('actionStateMachine', () => {
119164 ; ( { status } = actionStateMachine ( status , Action . confirm , false ) )
120165 expect ( status ) . toBe ( Status . confirmed )
121166 } )
167+
168+ it ( 'transitions through waitlist path: draft → submitted → waitlisted → accepted' , ( ) => {
169+ let { status } = actionStateMachine ( Status . draft , Action . submit , false )
170+ expect ( status ) . toBe ( Status . submitted )
171+ ; ( { status } = actionStateMachine ( status , Action . waitlist , true ) )
172+ expect ( status ) . toBe ( Status . waitlisted )
173+ ; ( { status } = actionStateMachine ( status , Action . accept , true ) )
174+ expect ( status ) . toBe ( Status . accepted )
175+ } )
122176 } )
123177} )
0 commit comments