Save assessment

This commit is contained in:
Andreas Svanberg 2025-01-17 15:18:31 +01:00
parent 54e6e5d787
commit fd01796121
4 changed files with 47 additions and 60 deletions

@ -434,9 +434,15 @@ public class CoreConfig {
public FinalSeminarOppositionServiceImpl finalSeminarOppositionService( public FinalSeminarOppositionServiceImpl finalSeminarOppositionService(
Provider<EntityManager> em, Provider<EntityManager> em,
FinalSeminarOppositionGrading finalSeminarOppositionGrading, FinalSeminarOppositionGrading finalSeminarOppositionGrading,
EventBus eventBus EventBus eventBus,
FinalSeminarOppositionRepo finalSeminarOppositionRepository
) { ) {
return new FinalSeminarOppositionServiceImpl(em, finalSeminarOppositionGrading, eventBus); return new FinalSeminarOppositionServiceImpl(
em,
finalSeminarOppositionGrading,
eventBus,
finalSeminarOppositionRepository
);
} }
@Bean @Bean

@ -1,6 +1,5 @@
package se.su.dsv.scipro.finalseminar; package se.su.dsv.scipro.finalseminar;
import java.util.List;
import se.su.dsv.scipro.system.GenericService; import se.su.dsv.scipro.system.GenericService;
public interface FinalSeminarOppositionService extends GenericService<FinalSeminarOpposition, Long> { public interface FinalSeminarOppositionService extends GenericService<FinalSeminarOpposition, Long> {
@ -9,5 +8,6 @@ public interface FinalSeminarOppositionService extends GenericService<FinalSemin
OppositionCriteria getCriteriaForOpposition(FinalSeminarOpposition opposition); OppositionCriteria getCriteriaForOpposition(FinalSeminarOpposition opposition);
void gradeOpponent(FinalSeminarOpposition opposition, int points, String feedback) throws PointNotValidException; FinalSeminarOpposition gradeOpponent(FinalSeminarOpposition opposition, int points, String feedback)
throws PointNotValidException;
} }

@ -4,6 +4,7 @@ import com.google.common.eventbus.EventBus;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.inject.Provider; import jakarta.inject.Provider;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;
import java.util.List; import java.util.List;
import se.su.dsv.scipro.system.AbstractServiceImpl; import se.su.dsv.scipro.system.AbstractServiceImpl;
@ -13,16 +14,19 @@ public class FinalSeminarOppositionServiceImpl
private final FinalSeminarOppositionGrading finalSeminarOppositionGrading; private final FinalSeminarOppositionGrading finalSeminarOppositionGrading;
private final EventBus eventBus; private final EventBus eventBus;
private final FinalSeminarOppositionRepo finalSeminarOppositionRepository;
@Inject @Inject
public FinalSeminarOppositionServiceImpl( public FinalSeminarOppositionServiceImpl(
Provider<EntityManager> em, Provider<EntityManager> em,
FinalSeminarOppositionGrading finalSeminarOppositionGrading, FinalSeminarOppositionGrading finalSeminarOppositionGrading,
EventBus eventBus EventBus eventBus,
FinalSeminarOppositionRepo finalSeminarOppositionRepository
) { ) {
super(em, FinalSeminarOpposition.class, QFinalSeminarOpposition.finalSeminarOpposition); super(em, FinalSeminarOpposition.class, QFinalSeminarOpposition.finalSeminarOpposition);
this.finalSeminarOppositionGrading = finalSeminarOppositionGrading; this.finalSeminarOppositionGrading = finalSeminarOppositionGrading;
this.eventBus = eventBus; this.eventBus = eventBus;
this.finalSeminarOppositionRepository = finalSeminarOppositionRepository;
} }
@Override @Override
@ -31,7 +35,8 @@ public class FinalSeminarOppositionServiceImpl
} }
@Override @Override
public void gradeOpponent(FinalSeminarOpposition opposition, int points, String feedback) @Transactional
public FinalSeminarOpposition gradeOpponent(FinalSeminarOpposition opposition, int points, String feedback)
throws PointNotValidException { throws PointNotValidException {
OppositionCriteria criteriaForOpposition = getCriteriaForOpposition(opposition); OppositionCriteria criteriaForOpposition = getCriteriaForOpposition(opposition);
boolean validPoints = criteriaForOpposition boolean validPoints = criteriaForOpposition
@ -42,13 +47,16 @@ public class FinalSeminarOppositionServiceImpl
throw new PointNotValidException(points, List.of(0, 1)); throw new PointNotValidException(points, List.of(0, 1));
} }
opposition.setPoints(points);
opposition.setFeedback(feedback);
FinalSeminarOpposition assessedOpposition = finalSeminarOppositionRepository.save(opposition);
if (criteriaForOpposition.pointsToPass() > points) { if (criteriaForOpposition.pointsToPass() > points) {
eventBus.post(new OppositionFailedEvent(opposition)); eventBus.post(new OppositionFailedEvent(assessedOpposition));
} else { } else {
eventBus.post(new OppositionApprovedEvent(opposition)); eventBus.post(new OppositionApprovedEvent(assessedOpposition));
} }
// TODO:
// * save assessment return assessedOpposition;
// * post events
} }
} }

@ -57,21 +57,7 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
@Test @Test
public void opposition_criteria_are_taken_from_the_grading_report_template() { public void opposition_criteria_are_taken_from_the_grading_report_template() {
FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser()); FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
GradingReportTemplate gradingReportTemplate = createGradingReportTemplate(); createSimpleGradingReportTemplateWithPassFail();
GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate();
failingCriterion.setPoint(0);
GradingCriterionPointTemplate passingCriterion = new GradingCriterionPointTemplate();
passingCriterion.setPoint(1);
gradingReportTemplate.addIndividualCriterion(
"Criterion 1",
"Criterion 1",
1,
List.of(failingCriterion, passingCriterion),
AbstractGradingCriterion.Flag.OPPOSITION
);
save(gradingReportTemplate);
assertEquals(2, finalSeminarOppositionService.getCriteriaForOpposition(opposition).pointsAvailable().size()); assertEquals(2, finalSeminarOppositionService.getCriteriaForOpposition(opposition).pointsAvailable().size());
} }
@ -79,21 +65,7 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
@Test @Test
public void can_not_grade_outside_criterion() { public void can_not_grade_outside_criterion() {
FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser()); FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
GradingReportTemplate gradingReportTemplate = createGradingReportTemplate(); createSimpleGradingReportTemplateWithPassFail();
GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate();
failingCriterion.setPoint(0);
GradingCriterionPointTemplate passingCriterion = new GradingCriterionPointTemplate();
passingCriterion.setPoint(1);
gradingReportTemplate.addIndividualCriterion(
"Criterion 1",
"Criterion 1",
1,
List.of(failingCriterion, passingCriterion),
AbstractGradingCriterion.Flag.OPPOSITION
);
save(gradingReportTemplate);
PointNotValidException exception = assertThrows(PointNotValidException.class, () -> PointNotValidException exception = assertThrows(PointNotValidException.class, () ->
finalSeminarOppositionService.gradeOpponent(opposition, 2, "Feedback") finalSeminarOppositionService.gradeOpponent(opposition, 2, "Feedback")
@ -106,21 +78,7 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
@Test @Test
public void publishes_failed_event_when_grading_with_failing_criterion() throws Exception { public void publishes_failed_event_when_grading_with_failing_criterion() throws Exception {
FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser()); FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
GradingReportTemplate gradingReportTemplate = createGradingReportTemplate(); createSimpleGradingReportTemplateWithPassFail();
GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate();
failingCriterion.setPoint(0);
GradingCriterionPointTemplate passingCriterion = new GradingCriterionPointTemplate();
passingCriterion.setPoint(1);
gradingReportTemplate.addIndividualCriterion(
"Criterion 1",
"Criterion 1",
1,
List.of(failingCriterion, passingCriterion),
AbstractGradingCriterion.Flag.OPPOSITION
);
save(gradingReportTemplate);
finalSeminarOppositionService.gradeOpponent(opposition, 0, "Feedback"); finalSeminarOppositionService.gradeOpponent(opposition, 0, "Feedback");
@ -130,6 +88,25 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
@Test @Test
public void publishes_approved_event_when_grading_with_passing_criterion() throws Exception { public void publishes_approved_event_when_grading_with_passing_criterion() throws Exception {
FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser()); FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
createSimpleGradingReportTemplateWithPassFail();
finalSeminarOppositionService.gradeOpponent(opposition, 1, "Feedback");
assertThat(getPublishedEvents(), hasItem(new OppositionApprovedEvent(opposition)));
}
@Test
public void stores_assessment() throws Exception {
FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
createSimpleGradingReportTemplateWithPassFail();
FinalSeminarOpposition graded = finalSeminarOppositionService.gradeOpponent(opposition, 1, "Feedback");
assertEquals(1, graded.getPoints());
assertEquals("Feedback", graded.getFeedback());
}
private void createSimpleGradingReportTemplateWithPassFail() {
GradingReportTemplate gradingReportTemplate = createGradingReportTemplate(); GradingReportTemplate gradingReportTemplate = createGradingReportTemplate();
GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate(); GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate();
@ -145,10 +122,6 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
AbstractGradingCriterion.Flag.OPPOSITION AbstractGradingCriterion.Flag.OPPOSITION
); );
save(gradingReportTemplate); save(gradingReportTemplate);
finalSeminarOppositionService.gradeOpponent(opposition, 1, "Feedback");
assertThat(getPublishedEvents(), hasItem(new OppositionApprovedEvent(opposition)));
} }
private void createOppositionReport(FinalSeminarOpposition opposition) { private void createOppositionReport(FinalSeminarOpposition opposition) {