Fix report card (#1845)

* fix: report card

Fix and simplify calculation of the number of assignments a user solved.
Rename `UserTracker` to `UserProgress`
Rename `LessonTracker` to `LessonProgress`
Rename tables in database
This commit is contained in:
Nanne Baars
2024-07-09 20:07:09 +02:00
committed by GitHub
parent 1531987da5
commit a0b6decf34
27 changed files with 237 additions and 248 deletions

View File

@ -32,8 +32,8 @@ import org.owasp.webgoat.container.i18n.Messages;
import org.owasp.webgoat.container.i18n.PluginMessages;
import org.owasp.webgoat.container.session.UserSessionData;
import org.owasp.webgoat.container.session.WebSession;
import org.owasp.webgoat.container.users.UserTracker;
import org.owasp.webgoat.container.users.UserTrackerRepository;
import org.owasp.webgoat.container.users.UserProgress;
import org.owasp.webgoat.container.users.UserProgressRepository;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.web.servlet.i18n.FixedLocaleResolver;
@ -41,8 +41,8 @@ import org.springframework.web.servlet.i18n.FixedLocaleResolver;
// Do not remove is the base class for all assignments tests
public class AssignmentEndpointTest {
@Mock protected UserTracker userTracker;
@Mock protected UserTrackerRepository userTrackerRepository;
@Mock protected UserProgress userTracker;
@Mock protected UserProgressRepository userTrackerRepository;
@Mock protected WebSession webSession;
@Mock protected UserSessionData userSessionData;

View File

@ -1,4 +1,4 @@
package org.owasp.webgoat.container.service;
package org.owasp.webgoat.container.report;
import static org.hamcrest.CoreMatchers.is;
import static org.mockito.ArgumentMatchers.any;
@ -18,22 +18,23 @@ import org.owasp.webgoat.container.i18n.PluginMessages;
import org.owasp.webgoat.container.lessons.Lesson;
import org.owasp.webgoat.container.session.Course;
import org.owasp.webgoat.container.session.WebSession;
import org.owasp.webgoat.container.users.LessonTracker;
import org.owasp.webgoat.container.users.UserTracker;
import org.owasp.webgoat.container.users.UserTrackerRepository;
import org.owasp.webgoat.container.users.LessonProgress;
import org.owasp.webgoat.container.users.UserProgress;
import org.owasp.webgoat.container.users.UserProgressRepository;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@ExtendWith(MockitoExtension.class)
public class ReportCardServiceTest {
// TODO: Rewrite this as end-to-end test this mocks too many classes
public class ReportCardControllerTest {
private MockMvc mockMvc;
@Mock private Course course;
@Mock private UserTracker userTracker;
@Mock private UserProgress userTracker;
@Mock private Lesson lesson;
@Mock private LessonTracker lessonTracker;
@Mock private UserTrackerRepository userTrackerRepository;
@Mock private LessonProgress lessonTracker;
@Mock private UserProgressRepository userTrackerRepository;
@Mock private WebSession websession;
@Mock private PluginMessages pluginMessages;
@ -41,7 +42,7 @@ public class ReportCardServiceTest {
void setup() {
this.mockMvc =
standaloneSetup(
new ReportCardService(websession, userTrackerRepository, course, pluginMessages))
new ReportCardController(websession, userTrackerRepository, course, pluginMessages))
.build();
when(pluginMessages.getMessage(anyString())).thenReturn("Test");
}
@ -54,12 +55,11 @@ public class ReportCardServiceTest {
when(course.getTotalOfAssignments()).thenReturn(10);
when(course.getLessons()).thenAnswer(x -> List.of(lesson));
when(userTrackerRepository.findByUser(any())).thenReturn(userTracker);
when(userTracker.getLessonTracker(any(Lesson.class))).thenReturn(lessonTracker);
when(userTracker.getLessonProgress(any(Lesson.class))).thenReturn(lessonTracker);
mockMvc
.perform(MockMvcRequestBuilders.get("/service/reportcard.mvc"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.totalNumberOfLessons", is(1)))
.andExpect(jsonPath("$.solvedLessons", is(0)))
.andExpect(jsonPath("$.numberOfAssignmentsSolved", is(0)))
.andExpect(jsonPath("$.totalNumberOfAssignments", is(10)))
.andExpect(jsonPath("$.lessonStatistics[0].name", is("Test")))

View File

@ -41,9 +41,9 @@ import org.owasp.webgoat.container.lessons.Category;
import org.owasp.webgoat.container.lessons.Lesson;
import org.owasp.webgoat.container.session.Course;
import org.owasp.webgoat.container.session.WebSession;
import org.owasp.webgoat.container.users.LessonTracker;
import org.owasp.webgoat.container.users.UserTracker;
import org.owasp.webgoat.container.users.UserTrackerRepository;
import org.owasp.webgoat.container.users.LessonProgress;
import org.owasp.webgoat.container.users.UserProgress;
import org.owasp.webgoat.container.users.UserProgressRepository;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@ -51,11 +51,11 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
public class LessonMenuServiceTest {
@Mock(lenient = true)
private LessonTracker lessonTracker;
private LessonProgress lessonTracker;
@Mock private Course course;
@Mock private UserTracker userTracker;
@Mock private UserTrackerRepository userTrackerRepository;
@Mock private UserProgress userTracker;
@Mock private UserProgressRepository userTrackerRepository;
@Mock private WebSession webSession;
private MockMvc mockMvc;
@ -81,7 +81,7 @@ public class LessonMenuServiceTest {
when(lessonTracker.isLessonSolved()).thenReturn(false);
when(course.getLessons(any())).thenReturn(Lists.newArrayList(l1, l2));
when(course.getCategories()).thenReturn(Lists.newArrayList(Category.A1));
when(userTracker.getLessonTracker(any(Lesson.class))).thenReturn(lessonTracker);
when(userTracker.getLessonProgress(any(Lesson.class))).thenReturn(lessonTracker);
when(userTrackerRepository.findByUser(any())).thenReturn(userTracker);
mockMvc
@ -98,7 +98,7 @@ public class LessonMenuServiceTest {
when(lessonTracker.isLessonSolved()).thenReturn(true);
when(course.getLessons(any())).thenReturn(Lists.newArrayList(l1));
when(course.getCategories()).thenReturn(Lists.newArrayList(Category.A1));
when(userTracker.getLessonTracker(any(Lesson.class))).thenReturn(lessonTracker);
when(userTracker.getLessonProgress(any(Lesson.class))).thenReturn(lessonTracker);
when(userTrackerRepository.findByUser(any())).thenReturn(userTracker);
mockMvc

View File

@ -16,9 +16,9 @@ import org.mockito.junit.jupiter.MockitoExtension;
import org.owasp.webgoat.container.lessons.Assignment;
import org.owasp.webgoat.container.lessons.Lesson;
import org.owasp.webgoat.container.session.WebSession;
import org.owasp.webgoat.container.users.LessonTracker;
import org.owasp.webgoat.container.users.UserTracker;
import org.owasp.webgoat.container.users.UserTrackerRepository;
import org.owasp.webgoat.container.users.LessonProgress;
import org.owasp.webgoat.container.users.UserProgress;
import org.owasp.webgoat.container.users.UserProgressRepository;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@ -60,16 +60,16 @@ class LessonProgressServiceTest {
private MockMvc mockMvc;
@Mock private Lesson lesson;
@Mock private UserTracker userTracker;
@Mock private LessonTracker lessonTracker;
@Mock private UserTrackerRepository userTrackerRepository;
@Mock private UserProgress userTracker;
@Mock private LessonProgress lessonTracker;
@Mock private UserProgressRepository userTrackerRepository;
@Mock private WebSession websession;
@BeforeEach
void setup() {
Assignment assignment = new Assignment("test", "test", List.of());
when(userTrackerRepository.findByUser(any())).thenReturn(userTracker);
when(userTracker.getLessonTracker(any(Lesson.class))).thenReturn(lessonTracker);
when(userTracker.getLessonProgress(any(Lesson.class))).thenReturn(lessonTracker);
when(websession.getCurrentLesson()).thenReturn(lesson);
when(lessonTracker.getLessonOverview()).thenReturn(Maps.newHashMap(assignment, true));
this.mockMvc =

View File

@ -10,7 +10,7 @@ import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.owasp.webgoat.container.lessons.Assignment;
import org.owasp.webgoat.container.lessons.Lesson;
import org.owasp.webgoat.container.users.LessonTracker;
import org.owasp.webgoat.container.users.LessonProgress;
/**
* ************************************************************************************************
@ -49,7 +49,7 @@ class LessonTrackerTest {
Lesson lesson = mock(Lesson.class);
when(lesson.getAssignments())
.thenReturn(List.of(new Assignment("assignment", "assignment", List.of(""))));
LessonTracker lessonTracker = new LessonTracker(lesson);
LessonProgress lessonTracker = new LessonProgress(lesson);
lessonTracker.assignmentSolved("assignment");
Assertions.assertThat(lessonTracker.isLessonSolved()).isTrue();
@ -62,7 +62,7 @@ class LessonTrackerTest {
Assignment a2 = new Assignment("a2");
List<Assignment> assignments = List.of(a1, a2);
when(lesson.getAssignments()).thenReturn(assignments);
LessonTracker lessonTracker = new LessonTracker(lesson);
LessonProgress lessonTracker = new LessonProgress(lesson);
lessonTracker.assignmentSolved("a1");
Map<Assignment, Boolean> lessonOverview = lessonTracker.getLessonOverview();
@ -76,7 +76,7 @@ class LessonTrackerTest {
Assignment a1 = new Assignment("a1");
List<Assignment> assignments = List.of(a1);
when(lesson.getAssignments()).thenReturn(assignments);
LessonTracker lessonTracker = new LessonTracker(lesson);
LessonProgress lessonTracker = new LessonProgress(lesson);
lessonTracker.assignmentSolved("a1");
lessonTracker.assignmentSolved("a1");

View File

@ -18,7 +18,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
class UserServiceTest {
@Mock private UserRepository userRepository;
@Mock private UserTrackerRepository userTrackerRepository;
@Mock private UserProgressRepository userTrackerRepository;
@Mock private JdbcTemplate jdbcTemplate;
@Mock private Function<String, Flyway> flywayLessons;

View File

@ -34,23 +34,23 @@ class UserTrackerRepositoryTest {
}
}
@Autowired private UserTrackerRepository userTrackerRepository;
@Autowired private UserProgressRepository userTrackerRepository;
@Test
void saveUserTracker() {
UserTracker userTracker = new UserTracker("test");
UserProgress userTracker = new UserProgress("test");
userTrackerRepository.save(userTracker);
userTracker = userTrackerRepository.findByUser("test");
Assertions.assertThat(userTracker.getLessonTracker("test")).isNotNull();
Assertions.assertThat(userTracker.getLessonProgress("test")).isNotNull();
}
@Test
void solvedAssignmentsShouldBeSaved() {
UserTracker userTracker = new UserTracker("test");
UserProgress userTracker = new UserProgress("test");
TestLesson lesson = new TestLesson();
userTracker.getLessonTracker(lesson);
userTracker.getLessonProgress(lesson);
userTracker.assignmentFailed(lesson);
userTracker.assignmentFailed(lesson);
userTracker.assignmentSolved(lesson, "test");
@ -63,9 +63,9 @@ class UserTrackerRepositoryTest {
@Test
void saveAndLoadShouldHaveCorrectNumberOfAttempts() {
UserTracker userTracker = new UserTracker("test");
UserProgress userTracker = new UserProgress("test");
TestLesson lesson = new TestLesson();
userTracker.getLessonTracker(lesson);
userTracker.getLessonProgress(lesson);
userTracker.assignmentFailed(lesson);
userTracker.assignmentFailed(lesson);
userTrackerRepository.saveAndFlush(userTracker);
@ -75,6 +75,6 @@ class UserTrackerRepositoryTest {
userTracker.assignmentFailed(lesson);
userTrackerRepository.saveAndFlush(userTracker);
Assertions.assertThat(userTracker.getLessonTracker(lesson).getNumberOfAttempts()).isEqualTo(4);
Assertions.assertThat(userTracker.getLessonProgress(lesson).getNumberOfAttempts()).isEqualTo(4);
}
}