Skip to content
Snippets Groups Projects
Commit 0eb891c0 authored by Dominik Pilár's avatar Dominik Pilár
Browse files

Merge branch...

Merge branch '76-fix-process-of-import-training-definition-after-adding-the-access-level' into 'master'

Fix import training definition. Added new test class that tests this functionality.

Closes #76

See merge request !77
parents 1e6374ed 91cbd36d
No related branches found
No related tags found
1 merge request!77Fix import training definition. Added new test class that tests this functionality.
Pipeline #132834 passed with stages
in 2 minutes and 47 seconds
......@@ -2,6 +2,7 @@ package cz.muni.ics.kypo.training.adaptive.dto.imports.phases;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.access.AccessPhaseImportDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.info.InfoPhaseImportDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.questionnaire.QuestionnairePhaseImportDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.training.TaskImportDTO;
......@@ -32,7 +33,8 @@ import java.util.Objects;
@JsonSubTypes({
@JsonSubTypes.Type(value = TrainingPhaseImportDTO.class, name = "TRAINING"),
@JsonSubTypes.Type(value = QuestionnairePhaseImportDTO.class, name = "QUESTIONNAIRE"),
@JsonSubTypes.Type(value = InfoPhaseImportDTO.class, name = "INFO")})
@JsonSubTypes.Type(value = InfoPhaseImportDTO.class, name = "INFO"),
@JsonSubTypes.Type(value = AccessPhaseImportDTO.class, name = "ACCESS")})
public abstract class AbstractPhaseImportDTO {
@ApiModelProperty(value = "Short textual description of the phase.", example = "Training phase description")
......
package cz.muni.ics.kypo.training.adaptive.dto.imports.phases.access;
import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.AbstractPhaseArchiveDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.AbstractPhaseImportDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -15,9 +16,9 @@ import java.util.Objects;
@ApiModel(
value = "AccessPhaseImportDTO",
description = "Imported access phase.",
parent = AbstractPhaseArchiveDTO.class
parent = AbstractPhaseImportDTO.class
)
public class AccessPhaseImportDTO extends AbstractPhaseArchiveDTO {
public class AccessPhaseImportDTO extends AbstractPhaseImportDTO {
@ApiModelProperty(value = "Keyword used for access next level.", example = "secretAnswer")
@Size(max = 50, message = "{accessPhase.passkey.Size.message}")
......
......@@ -27,6 +27,7 @@ import cz.muni.ics.kypo.training.adaptive.dto.export.phases.AbstractPhaseExportD
import cz.muni.ics.kypo.training.adaptive.dto.export.training.TrainingDefinitionWithPhasesExportDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.ImportTrainingDefinitionDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.AbstractPhaseImportDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.access.AccessPhaseImportDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.info.InfoPhaseImportDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.questionnaire.QuestionnairePhaseImportDTO;
import cz.muni.ics.kypo.training.adaptive.dto.imports.phases.training.TrainingPhaseImportDTO;
......@@ -183,6 +184,8 @@ public class ExportImportFacade {
exportImportService.createTrainingPhase(phaseMapper.mapToEntity((TrainingPhaseImportDTO) phase), newTrainingDefinition);
} else if (phase.getPhaseType().equals(PhaseType.INFO)) {
exportImportService.createInfoPhase(phaseMapper.mapToEntity((InfoPhaseImportDTO) phase), newTrainingDefinition);
} else if (phase.getPhaseType().equals(PhaseType.ACCESS)) {
exportImportService.createAccessPhase(phaseMapper.mapToEntity((AccessPhaseImportDTO) phase), newTrainingDefinition);
}
});
phases.forEach(phase -> {
......
package cz.muni.ics.kypo.training.adaptive.service;
import cz.muni.ics.kypo.training.adaptive.domain.phase.AbstractPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.InfoPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.QuestionnairePhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.TrainingPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.*;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.QuestionAnswer;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.QuestionPhaseRelation;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingDefinition;
......@@ -119,6 +116,11 @@ public class ExportImportService {
return abstractPhaseRepository.save(phase);
}
public AccessPhase createAccessPhase(AccessPhase phase, TrainingDefinition definition) {
phase.setTrainingDefinition(definition);
return abstractPhaseRepository.save(phase);
}
/**
* Finds training instance with given id.
*
......
package cz.muni.ics.kypo.training.adaptive.integration;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import cz.muni.ics.kypo.training.adaptive.controller.ExportImportRestController;
import cz.muni.ics.kypo.training.adaptive.domain.User;
import cz.muni.ics.kypo.training.adaptive.domain.phase.*;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.Question;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.QuestionPhaseRelation;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingDefinition;
import cz.muni.ics.kypo.training.adaptive.dto.UserRefDTO;
import cz.muni.ics.kypo.training.adaptive.handler.CustomRestExceptionHandler;
import cz.muni.ics.kypo.training.adaptive.repository.UserRefRepository;
import cz.muni.ics.kypo.training.adaptive.repository.phases.AccessPhaseRepository;
import cz.muni.ics.kypo.training.adaptive.repository.phases.InfoPhaseRepository;
import cz.muni.ics.kypo.training.adaptive.repository.phases.QuestionnairePhaseRepository;
import cz.muni.ics.kypo.training.adaptive.repository.phases.TrainingPhaseRepository;
import cz.muni.ics.kypo.training.adaptive.repository.training.TrainingDefinitionRepository;
import cz.muni.ics.kypo.training.adaptive.service.api.UserManagementServiceApi;
import cz.muni.ics.kypo.training.adaptive.util.TestDataFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.data.querydsl.SimpleEntityPathResolver;
import org.springframework.data.querydsl.binding.QuerydslBindingsFactory;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.data.web.querydsl.QuerydslPredicateArgumentResolver;
import org.springframework.http.MediaType;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest(classes = {
ExportImportRestController.class,
IntegrationTestApplication.class,
TestDataFactory.class
})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY)
@Transactional
public class ExportImportControllerIT {
@Autowired
private TestDataFactory testDataFactory;
@Autowired
private ObjectMapper mapper;
@Autowired
private ExportImportRestController exportImportRestController;
@Autowired
private TrainingDefinitionRepository trainingDefinitionRepository;
@Autowired
private InfoPhaseRepository infoPhaseRepository;
@Autowired
private AccessPhaseRepository accessPhaseRepository;
@Autowired
private TrainingPhaseRepository trainingPhaseRepository;
@Autowired
private QuestionnairePhaseRepository questionnairePhaseRepository;
@Autowired
private UserRefRepository userRefRepository;
@MockBean
private UserManagementServiceApi userManagementServiceApi;
private MockMvc mvc;
private TrainingDefinition trainingDefinition;
private InfoPhase infoPhase;
private AccessPhase accessPhase;
private QuestionnairePhase questionnairePhaseAdaptive, questionnairePhaseGeneral;
private TrainingPhase trainingPhase1, trainingPhase2;
private User user;
private UserRefDTO userRefDTO;
@BeforeEach
public void init(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategies.SnakeCaseStrategy());
objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
this.mvc = MockMvcBuilders.standaloneSetup(exportImportRestController)
.setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver(),
new QuerydslPredicateArgumentResolver(
new QuerydslBindingsFactory(SimpleEntityPathResolver.INSTANCE), Optional.empty()))
.setMessageConverters(new MappingJackson2HttpMessageConverter(mapper), new ByteArrayHttpMessageConverter())
.setControllerAdvice(new CustomRestExceptionHandler())
.build();
trainingDefinition = testDataFactory.getReleasedDefinition();
infoPhase = testDataFactory.getInfoPhase1();
infoPhase.setTrainingDefinition(trainingDefinition);
infoPhase.setOrder(0);
accessPhase = testDataFactory.getAccessPhase();
accessPhase.setTrainingDefinition(trainingDefinition);
accessPhase.setOrder(1);
questionnairePhaseAdaptive = testDataFactory.getAdaptive();
questionnairePhaseAdaptive.setOrder(2);
questionnairePhaseAdaptive.setTrainingDefinition(trainingDefinition);
Question mcq = testDataFactory.getMultipleChoiceQuestion();
mcq.setOrder(0);
mcq.setQuestionnairePhase(questionnairePhaseAdaptive);
mcq.setChoices(List.of(testDataFactory.getCorrectQuestionChoice(), testDataFactory.getIncorrectQuestionChoice()));
Question ffq = testDataFactory.getFreeFormQuestion();
ffq.setOrder(1);
ffq.setQuestionnairePhase(questionnairePhaseAdaptive);
ffq.setChoices(List.of(testDataFactory.getAnotherCorrectQuestionChoice()));
Question rfq = testDataFactory.getRatingFormQuestion();
rfq.setOrder(2);
rfq.setQuestionnairePhase(questionnairePhaseAdaptive);
rfq.setChoices(List.of(testDataFactory.getCorrectQuestionChoice(), testDataFactory.getIncorrectQuestionChoice()));
questionnairePhaseAdaptive.setQuestions(new ArrayList<>(List.of(mcq, ffq, rfq)));
trainingPhase1 = testDataFactory.getTrainingPhase1();
trainingPhase1.setTrainingDefinition(trainingDefinition);
trainingPhase1.setOrder(3);
DecisionMatrixRow decisionMatrixRow1 = new DecisionMatrixRow();
decisionMatrixRow1.setOrder(0);
decisionMatrixRow1.setTrainingPhase(trainingPhase1);
trainingPhase1.setDecisionMatrix(List.of(decisionMatrixRow1));
trainingPhase2 = testDataFactory.getTrainingPhase2();
trainingPhase2.setTrainingDefinition(trainingDefinition);
trainingPhase2.setOrder(4);
DecisionMatrixRow decisionMatrixRow2 = new DecisionMatrixRow();
decisionMatrixRow2.setOrder(0);
decisionMatrixRow2.setTrainingPhase(trainingPhase2);
DecisionMatrixRow decisionMatrixRow3 = new DecisionMatrixRow();
decisionMatrixRow3.setOrder(1);
decisionMatrixRow3.setTrainingPhase(trainingPhase2);
trainingPhase2.setDecisionMatrix(List.of(decisionMatrixRow2, decisionMatrixRow3));
trainingDefinitionRepository.save(trainingDefinition);
infoPhaseRepository.save(infoPhase);
trainingPhaseRepository.save(trainingPhase1);
trainingPhaseRepository.save(trainingPhase2);
accessPhaseRepository.save(accessPhase);
QuestionPhaseRelation qprTrainingPhase1 = new QuestionPhaseRelation();
qprTrainingPhase1.setQuestions(Set.of(rfq, mcq));
qprTrainingPhase1.setRelatedTrainingPhase(trainingPhase1);
qprTrainingPhase1.setOrder(0);
qprTrainingPhase1.setQuestionnairePhase(questionnairePhaseAdaptive);
qprTrainingPhase1.setSuccessRate(20);
QuestionPhaseRelation qprTrainingPhase2 = new QuestionPhaseRelation();
qprTrainingPhase2.setQuestions(Set.of(rfq, mcq));
qprTrainingPhase2.setRelatedTrainingPhase(trainingPhase2);
qprTrainingPhase2.setOrder(1);
qprTrainingPhase2.setQuestionnairePhase(questionnairePhaseAdaptive);
qprTrainingPhase2.setSuccessRate(46);
questionnairePhaseAdaptive.setQuestionPhaseRelations(List.of(qprTrainingPhase1, qprTrainingPhase2));
questionnairePhaseRepository.save(questionnairePhaseAdaptive);
user = testDataFactory.getUser1();
userRefRepository.save(user);
userRefDTO = testDataFactory.getUserRefDTO1();
}
@Test
public void exportAndImportTrainingDefinition() throws Exception{
when(userManagementServiceApi.getLoggedInUserRefId()).thenReturn(userRefDTO.getUserRefId());
when(userManagementServiceApi.getUserRefDTO()).thenReturn(userRefDTO);
MockHttpServletResponse response = mvc.perform(get("/exports/training-definitions/{id}", trainingDefinition.getId()))
.andExpect(content().contentType(MediaType.APPLICATION_OCTET_STREAM))
.andExpect(status().isOk())
.andReturn().getResponse();
mvc.perform(post("/imports/training-definitions")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(response.getContentAsString()))
.andExpect(status().isOk());
assertEquals(2, questionnairePhaseRepository.findAll().size());
assertEquals(2, accessPhaseRepository.findAll().size());
assertEquals(2, infoPhaseRepository.findAll().size());
assertEquals(4, trainingPhaseRepository.findAll().size());
assertEquals(2, trainingDefinitionRepository.findAll().size());
}
}
......@@ -10,10 +10,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import cz.muni.ics.kypo.training.adaptive.converter.LocalDateTimeUTCSerializer;
import cz.muni.ics.kypo.training.adaptive.domain.AccessToken;
import cz.muni.ics.kypo.training.adaptive.domain.User;
import cz.muni.ics.kypo.training.adaptive.domain.phase.InfoPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.QuestionnairePhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.Task;
import cz.muni.ics.kypo.training.adaptive.domain.phase.TrainingPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.*;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.Question;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.QuestionChoice;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingDefinition;
......@@ -118,6 +115,9 @@ public class TestDataFactory {
private InfoPhaseUpdateDTO infoPhaseUpdateDTO = generateInfoPhaseUpdateDTO("Updated info phase title", "Updated info phase content");
private AccessPhase accessPhase = generateAccessPhase("Access phase", 10, "Cloud content.",
"Local content. Command: ${USER_ID} ${ACCESS_PHASE} ${CENTRAL_SYSLOG_IP}", "start-training");
private BasicPhaseInfoDTO basicTrainingPhaseInfoDTO = generateBasicPhaseInfoDTO("Basic Game phase info", PhaseType.TRAINING);
private BasicPhaseInfoDTO basicInfoPhaseInfoDTO = generateBasicPhaseInfoDTO("Basic Info phase info", PhaseType.INFO);
......@@ -319,6 +319,10 @@ public class TestDataFactory {
return clone(infoPhaseUpdateDTO, InfoPhaseUpdateDTO.class);
}
public AccessPhase getAccessPhase(){
return clone(accessPhase , AccessPhase.class);
}
public AccessToken getAccessToken1(){
return clone(accessToken1, AccessToken.class);
}
......@@ -485,6 +489,16 @@ public class TestDataFactory {
return newInfoPhase;
}
private AccessPhase generateAccessPhase(String title, int order, String cloudContent, String localContent, String passkey){
AccessPhase newAccessPhase = new AccessPhase();
newAccessPhase.setTitle(title);
newAccessPhase.setOrder(order);
newAccessPhase.setCloudContent(cloudContent);
newAccessPhase.setLocalContent(localContent);
newAccessPhase.setPasskey(passkey);
return newAccessPhase;
}
private InfoPhaseUpdateDTO generateInfoPhaseUpdateDTO(String title, String content) {
InfoPhaseUpdateDTO infoPhaseUpdateDTO = new InfoPhaseUpdateDTO();
infoPhaseUpdateDTO.setPhaseType(PhaseType.INFO);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment