@@ -87,6 +87,8 @@ describe('AdminService', () => {
8787 getHandlesByUserIds : jest . Mock ;
8888 } ;
8989 let topcoderChallengesService : {
90+ findChallengeByProjectAndTitle : jest . Mock ;
91+ findChallengeIdFromProjectPhases : jest . Mock ;
9092 getChallengeById : jest . Mock ;
9193 getProjectById : jest . Mock ;
9294 } ;
@@ -136,6 +138,8 @@ describe('AdminService', () => {
136138 } ) ,
137139 } ;
138140 topcoderChallengesService = {
141+ findChallengeByProjectAndTitle : jest . fn ( ) . mockResolvedValue ( undefined ) ,
142+ findChallengeIdFromProjectPhases : jest . fn ( ) . mockResolvedValue ( undefined ) ,
139143 getChallengeById : jest . fn ( ) . mockResolvedValue ( undefined ) ,
140144 getProjectById : jest . fn ( ) . mockResolvedValue ( undefined ) ,
141145 } ;
@@ -151,30 +155,119 @@ describe('AdminService', () => {
151155 ) ;
152156 } ) ;
153157
154- it ( 'returns engagement budgetApproverHandle from winnings attributes challengeId ' , async ( ) => {
158+ it ( 'returns engagement budgetApproverHandle from challenge approvalApprovedBy ' , async ( ) => {
155159 prisma . winnings . findFirst . mockResolvedValue ( {
156160 winning_id : 'winning-1' ,
157161 category : 'ENGAGEMENT_PAYMENT' ,
158162 created_by : '654321' ,
159163 external_id : 'assignment-1' ,
160- attributes : {
161- challengeId : 'challenge-uuid-1' ,
162- } ,
164+ attributes : { } ,
163165 } ) ;
164166 topcoderEngagementsService . getAssignmentContextById . mockResolvedValue ( {
165167 assignmentId : 'assignment-1' ,
168+ challengeId : 'da8b0e8b-f56a-419b-9e4e-b8afe06375e2' ,
166169 engagementId : 'engagement-1' ,
167- engagementTitle : 'May 19 pvt eng ' ,
170+ engagementTitle : 'Software Developer I ' ,
168171 projectId : '100575' ,
169172 projectName : 'Ai Reviewer Wf testing' ,
170- ratePerHour : '2.99' ,
171- standardHoursPerWeek : 11 ,
172- startDate : '2026-05-23T12:00:00.000Z' ,
173- durationMonths : 2 ,
173+ ratePerHour : '15.5' ,
174+ standardHoursPerWeek : 12 ,
175+ startDate : '2026-04-30T12:00:00.000Z' ,
176+ durationMonths : 1 ,
177+ } ) ;
178+ topcoderChallengesService . getChallengeById . mockResolvedValue ( {
179+ id : 'da8b0e8b-f56a-419b-9e4e-b8afe06375e2' ,
180+ name : 'Software Developer I' ,
181+ projectId : 100575 ,
182+ approvalApprovedBy : 'kartik' ,
183+ } ) ;
184+
185+ const result = await service . getWinningPaymentDetails (
186+ 'winning-1' ,
187+ '123456' ,
188+ [ 'Payment Admin' ] ,
189+ ) ;
190+
191+ expect ( topcoderChallengesService . getChallengeById ) . toHaveBeenCalledWith (
192+ 'da8b0e8b-f56a-419b-9e4e-b8afe06375e2' ,
193+ ) ;
194+ expect (
195+ topcoderChallengesService . findChallengeIdFromProjectPhases ,
196+ ) . not . toHaveBeenCalled ( ) ;
197+ expect ( result . data ?. engagementDetails ?. budgetApproverHandle ) . toBe ( 'kartik' ) ;
198+ } ) ;
199+
200+ it ( 'returns engagement budgetApproverHandle via project phase challengeGuid' , async ( ) => {
201+ prisma . winnings . findFirst . mockResolvedValue ( {
202+ winning_id : 'winning-1' ,
203+ category : 'ENGAGEMENT_PAYMENT' ,
204+ created_by : '654321' ,
205+ external_id : 'assignment-1' ,
206+ attributes : { } ,
207+ } ) ;
208+ topcoderEngagementsService . getAssignmentContextById . mockResolvedValue ( {
209+ assignmentId : 'assignment-1' ,
210+ engagementId : 'engagement-1' ,
211+ engagementTitle : 'Software Developer I' ,
212+ projectId : '100575' ,
213+ ratePerHour : '15.5' ,
214+ standardHoursPerWeek : 12 ,
215+ startDate : '2026-04-30T12:00:00.000Z' ,
216+ durationMonths : 1 ,
217+ } ) ;
218+ topcoderChallengesService . findChallengeIdFromProjectPhases . mockResolvedValue (
219+ 'da8b0e8b-f56a-419b-9e4e-b8afe06375e2' ,
220+ ) ;
221+ topcoderChallengesService . getChallengeById . mockResolvedValue ( {
222+ id : 'da8b0e8b-f56a-419b-9e4e-b8afe06375e2' ,
223+ name : 'Software Developer I' ,
224+ projectId : 100575 ,
225+ approvalApprovedBy : 'kartik' ,
226+ } ) ;
227+
228+ const result = await service . getWinningPaymentDetails (
229+ 'winning-1' ,
230+ '123456' ,
231+ [ 'Payment Admin' ] ,
232+ ) ;
233+
234+ expect (
235+ topcoderChallengesService . findChallengeIdFromProjectPhases ,
236+ ) . toHaveBeenCalledWith ( '100575' , 'Software Developer I' ) ;
237+ expect ( topcoderChallengesService . getChallengeById ) . toHaveBeenCalledWith (
238+ 'da8b0e8b-f56a-419b-9e4e-b8afe06375e2' ,
239+ ) ;
240+ expect ( result . data ?. engagementDetails ?. budgetApproverHandle ) . toBe ( 'kartik' ) ;
241+ } ) ;
242+
243+ it ( 'returns engagement budgetApproverHandle via project and title search' , async ( ) => {
244+ prisma . winnings . findFirst . mockResolvedValue ( {
245+ winning_id : 'winning-1' ,
246+ category : 'ENGAGEMENT_PAYMENT' ,
247+ created_by : '654321' ,
248+ external_id : 'assignment-1' ,
249+ attributes : { } ,
250+ } ) ;
251+ topcoderEngagementsService . getAssignmentContextById . mockResolvedValue ( {
252+ assignmentId : 'assignment-1' ,
253+ engagementId : 'engagement-1' ,
254+ engagementTitle : 'Software Developer I' ,
255+ projectId : '100575' ,
256+ projectName : 'Ai Reviewer Wf testing' ,
257+ ratePerHour : '15.5' ,
258+ standardHoursPerWeek : 12 ,
259+ startDate : '2026-04-30T12:00:00.000Z' ,
260+ durationMonths : 1 ,
261+ } ) ;
262+ topcoderChallengesService . findChallengeByProjectAndTitle . mockResolvedValue ( {
263+ id : 'challenge-uuid-1' ,
264+ name : 'Software Developer I' ,
265+ projectId : 100575 ,
266+ approvalApprovedBy : 'kartik' ,
174267 } ) ;
175268 topcoderChallengesService . getChallengeById . mockResolvedValue ( {
176269 id : 'challenge-uuid-1' ,
177- name : 'Engagement challenge ' ,
270+ name : 'Software Developer I ' ,
178271 projectId : 100575 ,
179272 approvalApprovedBy : 'kartik' ,
180273 } ) ;
@@ -185,40 +278,52 @@ describe('AdminService', () => {
185278 [ 'Payment Admin' ] ,
186279 ) ;
187280
281+ expect (
282+ topcoderChallengesService . findChallengeByProjectAndTitle ,
283+ ) . toHaveBeenCalledWith ( '100575' , 'Software Developer I' ) ;
188284 expect ( topcoderChallengesService . getChallengeById ) . toHaveBeenCalledWith (
189285 'challenge-uuid-1' ,
190286 ) ;
191287 expect ( result . data ?. engagementDetails ?. budgetApproverHandle ) . toBe ( 'kartik' ) ;
192288 } ) ;
193289
194- it ( 'returns engagement budgetApproverHandle from winnings attributes directly ' , async ( ) => {
290+ it ( 'returns engagement budgetApproverHandle from winnings attributes challengeId ' , async ( ) => {
195291 prisma . winnings . findFirst . mockResolvedValue ( {
196292 winning_id : 'winning-1' ,
197293 category : 'ENGAGEMENT_PAYMENT' ,
198294 created_by : '654321' ,
199295 external_id : 'assignment-1' ,
200296 attributes : {
201- budgetApproverHandle : 'kartik ' ,
297+ challengeId : 'challenge-uuid-1 ' ,
202298 } ,
203299 } ) ;
204300 topcoderEngagementsService . getAssignmentContextById . mockResolvedValue ( {
205301 assignmentId : 'assignment-1' ,
206302 engagementId : 'engagement-1' ,
207303 engagementTitle : 'May 19 pvt eng' ,
208304 projectId : '100575' ,
305+ projectName : 'Ai Reviewer Wf testing' ,
209306 ratePerHour : '2.99' ,
210307 standardHoursPerWeek : 11 ,
211308 startDate : '2026-05-23T12:00:00.000Z' ,
212309 durationMonths : 2 ,
213310 } ) ;
311+ topcoderChallengesService . getChallengeById . mockResolvedValue ( {
312+ id : 'challenge-uuid-1' ,
313+ name : 'Engagement challenge' ,
314+ projectId : 100575 ,
315+ approvalApprovedBy : 'kartik' ,
316+ } ) ;
214317
215318 const result = await service . getWinningPaymentDetails (
216319 'winning-1' ,
217320 '123456' ,
218321 [ 'Payment Admin' ] ,
219322 ) ;
220323
221- expect ( topcoderChallengesService . getChallengeById ) . not . toHaveBeenCalled ( ) ;
324+ expect ( topcoderChallengesService . getChallengeById ) . toHaveBeenCalledWith (
325+ 'challenge-uuid-1' ,
326+ ) ;
222327 expect ( result . data ?. engagementDetails ?. budgetApproverHandle ) . toBe ( 'kartik' ) ;
223328 } ) ;
224329
0 commit comments