fix: correct number of solved assignments in report card (#2065)

* fix: correct number of solved assignments in report card

Filter the list of assignments to accurately count the number of solved assignments.

Closes: gh-2063

* chore: remove scoreboard code

This is added when we run a CTF challenge during OWASP AppSecEU in 2017. We can remove this code.

Closes: gh-2064
This commit is contained in:
Nanne Baars
2025-03-11 22:57:49 +01:00
committed by GitHub
parent 2c5e4c4491
commit 23d6fe6f36
16 changed files with 106 additions and 441 deletions

View File

@ -0,0 +1,89 @@
/*
* SPDX-FileCopyrightText: Copyright © 2017 WebGoat authors
* SPDX-License-Identifier: GPL-2.0-or-later
*/
package org.owasp.webgoat.container.users;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
import org.owasp.webgoat.container.lessons.Assignment;
import org.owasp.webgoat.container.lessons.Category;
import org.owasp.webgoat.container.lessons.Lesson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.ActiveProfiles;
@DataJpaTest
@ActiveProfiles("webgoat-test")
class UserProgressRepositoryTest {
private static class TestLesson extends Lesson {
@Override
public Category getDefaultCategory() {
return Category.CLIENT_SIDE;
}
@Override
public String getTitle() {
return "test";
}
@Override
public List<Assignment> getAssignments() {
var assignment1 = new Assignment("test1", "test1", Lists.newArrayList());
var assignment2 = new Assignment("test2", "test2", Lists.newArrayList());
return List.of(assignment1, assignment2);
}
}
private static final String USER = "user";
@Autowired private UserProgressRepository userProgressRepository;
@Test
void saveUserTracker() {
var userProgress = new UserProgress(USER);
userProgressRepository.save(userProgress);
userProgress = userProgressRepository.findByUser(USER);
assertThat(userProgress.getLessonProgress(new TestLesson())).isNotNull();
}
@Test
void solvedAssignmentsShouldBeSaved() {
var userProgress = new UserProgress(USER);
var lesson = new TestLesson();
userProgress.getLessonProgress(lesson);
userProgress.assignmentFailed(lesson);
userProgress.assignmentFailed(lesson);
userProgress.assignmentSolved(lesson, "test1");
userProgress.assignmentSolved(lesson, "test2");
userProgressRepository.saveAndFlush(userProgress);
userProgress = userProgressRepository.findByUser(USER);
assertThat(userProgress.numberOfAssignmentsSolved()).isEqualTo(2);
}
@Test
void saveAndLoadShouldHaveCorrectNumberOfAttempts() {
UserProgress userProgress = new UserProgress(USER);
TestLesson lesson = new TestLesson();
userProgress.getLessonProgress(lesson);
userProgress.assignmentFailed(lesson);
userProgress.assignmentFailed(lesson);
userProgressRepository.saveAndFlush(userProgress);
userProgress = userProgressRepository.findByUser(USER);
userProgress.assignmentFailed(lesson);
userProgress.assignmentFailed(lesson);
userProgressRepository.saveAndFlush(userProgress);
assertThat(userProgress.getLessonProgress(lesson).getNumberOfAttempts()).isEqualTo(4);
}
}

View File

@ -1,84 +0,0 @@
/*
* SPDX-FileCopyrightText: Copyright © 2017 WebGoat authors
* SPDX-License-Identifier: GPL-2.0-or-later
*/
package org.owasp.webgoat.container.users;
import java.util.List;
import org.assertj.core.api.Assertions;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
import org.owasp.webgoat.container.lessons.Assignment;
import org.owasp.webgoat.container.lessons.Category;
import org.owasp.webgoat.container.lessons.Lesson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.ActiveProfiles;
@DataJpaTest
@ActiveProfiles("webgoat-test")
class UserTrackerRepositoryTest {
private class TestLesson extends Lesson {
@Override
public Category getDefaultCategory() {
return Category.CLIENT_SIDE;
}
@Override
public String getTitle() {
return "test";
}
@Override
public List<Assignment> getAssignments() {
Assignment assignment = new Assignment("test", "test", Lists.newArrayList());
return Lists.newArrayList(assignment);
}
}
@Autowired private UserProgressRepository userTrackerRepository;
@Test
void saveUserTracker() {
UserProgress userTracker = new UserProgress("test");
userTrackerRepository.save(userTracker);
userTracker = userTrackerRepository.findByUser("test");
Assertions.assertThat(userTracker.getLessonProgress("test")).isNotNull();
}
@Test
void solvedAssignmentsShouldBeSaved() {
UserProgress userTracker = new UserProgress("test");
TestLesson lesson = new TestLesson();
userTracker.getLessonProgress(lesson);
userTracker.assignmentFailed(lesson);
userTracker.assignmentFailed(lesson);
userTracker.assignmentSolved(lesson, "test");
userTrackerRepository.saveAndFlush(userTracker);
userTracker = userTrackerRepository.findByUser("test");
Assertions.assertThat(userTracker.numberOfAssignmentsSolved()).isEqualTo(1);
}
@Test
void saveAndLoadShouldHaveCorrectNumberOfAttempts() {
UserProgress userTracker = new UserProgress("test");
TestLesson lesson = new TestLesson();
userTracker.getLessonProgress(lesson);
userTracker.assignmentFailed(lesson);
userTracker.assignmentFailed(lesson);
userTrackerRepository.saveAndFlush(userTracker);
userTracker = userTrackerRepository.findByUser("test");
userTracker.assignmentFailed(lesson);
userTracker.assignmentFailed(lesson);
userTrackerRepository.saveAndFlush(userTracker);
Assertions.assertThat(userTracker.getLessonProgress(lesson).getNumberOfAttempts()).isEqualTo(4);
}
}