Skip to content

Commit 6343e53

Browse files
authored
Merge branch 'master' into Migrate-CI/CD
2 parents 775cdbc + 791be3b commit 6343e53

File tree

9 files changed

+1051
-22
lines changed

9 files changed

+1051
-22
lines changed

frontend/tests/controllers-test/analyticsCtrl.test.js

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,4 +311,119 @@ describe('Unit tests for analytics controller', function() {
311311
expect($rootScope.isAuth).toBeFalsy();
312312
});
313313
});
314+
315+
describe('Unit tests for downloadChallengeParticipantTeams', function () {
316+
var $rootScope, $controller, $scope, utilities, vm;
317+
318+
beforeEach(inject(function (_$controller_, _$rootScope_, _utilities_) {
319+
$controller = _$controller_;
320+
$rootScope = _$rootScope_;
321+
utilities = _utilities_;
322+
$scope = $rootScope.$new();
323+
vm = $controller('AnalyticsCtrl', { $scope: $scope });
324+
vm.challengeId = 123;
325+
spyOn(utilities, 'sendRequest');
326+
}));
327+
328+
it('should send GET request and trigger download on success', function () {
329+
330+
var anchorMock = [{ click: jasmine.createSpy('click') }];
331+
anchorMock.attr = function () { return anchorMock; };
332+
spyOn(window.angular, 'element').and.returnValue(anchorMock);
333+
334+
utilities.sendRequest.and.callFake(function (params) {
335+
336+
params.callback.onSuccess({ data: "csvdata" });
337+
});
338+
339+
vm.downloadChallengeParticipantTeams();
340+
341+
expect(utilities.sendRequest).toHaveBeenCalled();
342+
var params = utilities.sendRequest.calls.mostRecent().args[0];
343+
expect(params.url).toBe("analytics/challenges/123/download_all_participants/");
344+
expect(params.method).toBe("GET");
345+
346+
expect(window.angular.element).toHaveBeenCalled();
347+
expect(anchorMock[0].click).toHaveBeenCalled();
348+
});
349+
350+
it('should notify error on error callback', function () {
351+
spyOn($rootScope, 'notify');
352+
utilities.sendRequest.and.callFake(function (params) {
353+
params.callback.onError({ data: { error: "Download failed" } });
354+
});
355+
356+
vm.downloadChallengeParticipantTeams();
357+
358+
expect(utilities.sendRequest).toHaveBeenCalled();
359+
expect($rootScope.notify).toHaveBeenCalledWith('error', "Download failed");
360+
});
361+
});
362+
363+
describe('Unit tests for lastSubmissionTime update logic', function () {
364+
var $controller, $rootScope, $scope, utilities, vm;
365+
366+
beforeEach(inject(function (_$controller_, _$rootScope_, _utilities_) {
367+
$controller = _$controller_;
368+
$rootScope = _$rootScope_;
369+
utilities = _utilities_;
370+
$scope = $rootScope.$new();
371+
vm = $controller('AnalyticsCtrl', { $scope: $scope });
372+
}));
373+
374+
it('should update lastSubmissionTime for matching challenge phase via real controller code', function () {
375+
376+
vm.lastSubmissionTime = {};
377+
vm.challengeId = 42;
378+
vm.challengeList = [{id: 42}];
379+
380+
var matchingPhase = 20;
381+
var timestamp = "2024-06-01T12:00:00Z";
382+
383+
var callCount = 0;
384+
spyOn(utilities, 'sendRequest').and.callFake(function(params) {
385+
callCount++;
386+
if (callCount === 1) {
387+
388+
params.callback.onSuccess({
389+
status: 200,
390+
data: {
391+
results: [{id: matchingPhase}]
392+
}
393+
});
394+
} else if (callCount === 2) {
395+
396+
params.callback.onSuccess({
397+
status: 200,
398+
data: {participant_team_count: 1}
399+
});
400+
} else if (callCount === 3) {
401+
402+
params.callback.onSuccess({
403+
status: 200,
404+
data: {
405+
challenge_phase: matchingPhase,
406+
total_submissions: 0,
407+
participant_team_count: 0
408+
}
409+
});
410+
} else if (callCount === 4) {
411+
412+
params.callback.onSuccess({
413+
status: 200,
414+
data: {
415+
challenge_phase: matchingPhase,
416+
last_submission_timestamp_in_challenge_phase: timestamp
417+
}
418+
});
419+
}
420+
});
421+
422+
423+
vm.showChallengeAnalysis();
424+
425+
426+
expect(vm.lastSubmissionTime[matchingPhase]).toBe(timestamp);
427+
});
428+
});
314429
});

frontend/tests/controllers-test/featuredChallengeCtrl.test.js

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,4 +213,186 @@ describe('Unit tests for featured challenge controller', function () {
213213
expect(vm.stopLoader).toHaveBeenCalled();
214214
});
215215
});
216+
217+
describe('Unit tests for leaderboard submission__submitted_at formatting', function () {
218+
var $controller, $rootScope, $scope, utilities, vm, moment;
219+
220+
beforeEach(inject(function (_$controller_, _$rootScope_, _utilities_, _moment_) {
221+
$controller = _$controller_;
222+
$rootScope = _$rootScope_;
223+
utilities = _utilities_;
224+
moment = _moment_;
225+
$scope = $rootScope.$new();
226+
vm = $controller('FeaturedChallengeCtrl', { $scope: $scope });
227+
spyOn(vm, 'startLoader');
228+
spyOn(vm, 'stopLoader');
229+
spyOn(angular, 'element');
230+
}));
231+
232+
function leaderboardWithSubmissionAt(date) {
233+
return {
234+
results: {
235+
results: [
236+
{ id: 1, submission__submitted_at: date }
237+
]
238+
}
239+
};
240+
}
241+
242+
it('should set timeSpan to "months" for 1 year ago', function () {
243+
var oneYearAgo = moment().subtract(1, 'years').toDate();
244+
var response = leaderboardWithSubmissionAt(oneYearAgo);
245+
246+
utilities.sendRequest = function (parameters) {
247+
parameters.callback.onSuccess({ data: response.results });
248+
};
249+
250+
vm.getLeaderboard(1);
251+
252+
expect(vm.leaderboard[0].timeSpan).toBe('months');
253+
});
254+
255+
it('should set timeSpan to "years" for 2 years ago', function () {
256+
var twoYearsAgo = moment().subtract(2, 'years').toDate();
257+
var response = leaderboardWithSubmissionAt(twoYearsAgo);
258+
259+
utilities.sendRequest = function (parameters) {
260+
parameters.callback.onSuccess({ data: response.results });
261+
};
262+
263+
vm.getLeaderboard(1);
264+
265+
expect(vm.leaderboard[0].timeSpan).toBe('years');
266+
});
267+
268+
it('should set timeSpan to "days" for 1 month ago', function () {
269+
var oneMonthAgo = moment().subtract(1, 'months').toDate();
270+
var response = leaderboardWithSubmissionAt(oneMonthAgo);
271+
272+
utilities.sendRequest = function (parameters) {
273+
parameters.callback.onSuccess({ data: response.results });
274+
};
275+
276+
vm.getLeaderboard(1);
277+
278+
expect(vm.leaderboard[0].timeSpan).toBe('days');
279+
});
280+
281+
it('should set timeSpan to "months" for 3 months ago', function () {
282+
var threeMonthsAgo = moment().subtract(3, 'months').toDate();
283+
var response = leaderboardWithSubmissionAt(threeMonthsAgo);
284+
285+
utilities.sendRequest = function (parameters) {
286+
parameters.callback.onSuccess({ data: response.results });
287+
};
288+
289+
vm.getLeaderboard(1);
290+
291+
expect(vm.leaderboard[0].timeSpan).toBe('months');
292+
});
293+
294+
it('should set timeSpan to "day" for 1 day ago', function () {
295+
var oneDayAgo = moment().subtract(1, 'days').toDate();
296+
var response = leaderboardWithSubmissionAt(oneDayAgo);
297+
298+
utilities.sendRequest = function (parameters) {
299+
parameters.callback.onSuccess({ data: response.results });
300+
};
301+
302+
vm.getLeaderboard(1);
303+
304+
expect(vm.leaderboard[0].timeSpan).toBe('day');
305+
});
306+
307+
it('should set timeSpan to "days" for 5 days ago', function () {
308+
var fiveDaysAgo = moment().subtract(5, 'days').toDate();
309+
var response = leaderboardWithSubmissionAt(fiveDaysAgo);
310+
311+
utilities.sendRequest = function (parameters) {
312+
parameters.callback.onSuccess({ data: response.results });
313+
};
314+
315+
vm.getLeaderboard(1);
316+
317+
expect(vm.leaderboard[0].timeSpan).toBe('days');
318+
});
319+
320+
it('should set timeSpan to "hour" for 1 hour ago', function () {
321+
var oneHourAgo = moment().subtract(1, 'hours').toDate();
322+
var response = leaderboardWithSubmissionAt(oneHourAgo);
323+
324+
utilities.sendRequest = function (parameters) {
325+
parameters.callback.onSuccess({ data: response.results });
326+
};
327+
328+
vm.getLeaderboard(1);
329+
330+
expect(vm.leaderboard[0].timeSpan).toBe('hour');
331+
});
332+
333+
it('should set timeSpan to "hours" for 10 hours ago', function () {
334+
var tenHoursAgo = moment().subtract(10, 'hours').toDate();
335+
var response = leaderboardWithSubmissionAt(tenHoursAgo);
336+
337+
utilities.sendRequest = function (parameters) {
338+
parameters.callback.onSuccess({ data: response.results });
339+
};
340+
341+
vm.getLeaderboard(1);
342+
343+
expect(vm.leaderboard[0].timeSpan).toBe('hours');
344+
});
345+
346+
it('should set timeSpan to "minute" for 1 minute ago', function () {
347+
var oneMinuteAgo = moment().subtract(1, 'minutes').toDate();
348+
var response = leaderboardWithSubmissionAt(oneMinuteAgo);
349+
350+
utilities.sendRequest = function (parameters) {
351+
parameters.callback.onSuccess({ data: response.results });
352+
};
353+
354+
vm.getLeaderboard(1);
355+
356+
expect(vm.leaderboard[0].timeSpan).toBe('minute');
357+
});
358+
359+
it('should set timeSpan to "minutes" for 30 minutes ago', function () {
360+
var thirtyMinutesAgo = moment().subtract(30, 'minutes').toDate();
361+
var response = leaderboardWithSubmissionAt(thirtyMinutesAgo);
362+
363+
utilities.sendRequest = function (parameters) {
364+
parameters.callback.onSuccess({ data: response.results });
365+
};
366+
367+
vm.getLeaderboard(1);
368+
369+
expect(vm.leaderboard[0].timeSpan).toBe('minutes');
370+
});
371+
372+
it('should set timeSpan to "second" for 1 second ago', function () {
373+
var oneSecondAgo = moment().subtract(1, 'seconds').toDate();
374+
var response = leaderboardWithSubmissionAt(oneSecondAgo);
375+
376+
utilities.sendRequest = function (parameters) {
377+
parameters.callback.onSuccess({ data: response.results });
378+
};
379+
380+
vm.getLeaderboard(1);
381+
382+
expect(vm.leaderboard[0].timeSpan).toBe('second');
383+
});
384+
385+
it('should set timeSpan to "seconds" for 45 seconds ago', function () {
386+
var fortyFiveSecondsAgo = moment().subtract(45, 'seconds').toDate();
387+
var response = leaderboardWithSubmissionAt(fortyFiveSecondsAgo);
388+
389+
utilities.sendRequest = function (parameters) {
390+
parameters.callback.onSuccess({ data: response.results });
391+
};
392+
393+
vm.getLeaderboard(1);
394+
395+
expect(vm.leaderboard[0].timeSpan).toBe('seconds');
396+
});
397+
});
216398
});

0 commit comments

Comments
 (0)