Skip to content

Commit d8bc4fe

Browse files
fix: Fix patch for nextScheduledDate in PS [DHIS2-20042] (#22806) (#22861)
1 parent 05f34ef commit d8bc4fe

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/ProgramStageObjectBundleHook.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ public void validate(
6868
DataElement.class,
6969
programStage.getNextScheduleDate().getUid());
7070

71-
if (!programStage.getDataElements().contains(programStage.getNextScheduleDate())
71+
if (programStage.getDataElements().stream()
72+
.noneMatch(de -> de.getUid().equals(programStage.getNextScheduleDate().getUid()))
7273
|| nextScheduleDate == null
7374
|| !nextScheduleDate.getValueType().equals(ValueType.DATE)) {
7475
addReports.accept(

dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramStageControllerTest.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,28 @@
3030
import static org.hisp.dhis.web.WebClientUtils.assertStatus;
3131
import static org.junit.jupiter.api.Assertions.assertEquals;
3232

33+
import org.hisp.dhis.common.ValueType;
34+
import org.hisp.dhis.dataelement.DataElement;
35+
import org.hisp.dhis.dataelement.DataElementService;
3336
import org.hisp.dhis.feedback.ErrorCode;
37+
import org.hisp.dhis.jsontree.JsonObject;
3438
import org.hisp.dhis.jsontree.JsonResponse;
3539
import org.hisp.dhis.web.HttpStatus;
3640
import org.hisp.dhis.webapi.DhisControllerConvenienceTest;
3741
import org.hisp.dhis.webapi.json.domain.JsonTypeReport;
3842
import org.hisp.dhis.webapi.json.domain.JsonWebMessage;
3943
import org.junit.jupiter.api.Test;
44+
import org.springframework.beans.factory.annotation.Autowired;
45+
import org.springframework.transaction.annotation.Transactional;
4046

4147
/**
4248
4349
*/
50+
@Transactional
4451
class ProgramStageControllerTest extends DhisControllerConvenienceTest {
4552

53+
@Autowired private DataElementService dataElementService;
54+
4655
@Test
4756
void testCreateProgramStageWithoutProgram() {
4857
JsonWebMessage message =
@@ -70,4 +79,65 @@ void testCreateProgramStageOk() {
7079
JsonResponse program = GET("/programs/{id}", "VoZMWi7rBgj").content();
7180
assertEquals(programStageId, program.getString("programStages[0].id").string());
7281
}
82+
83+
@Test
84+
void shouldSuccessfullyPatchNextScheduledDateField() {
85+
DataElement dataElement = createDataElement('A');
86+
dataElement.setValueType(ValueType.DATE);
87+
dataElementService.addDataElement(dataElement);
88+
POST(
89+
"/programs/",
90+
"{'name':'test program', 'id':'VoZMWi7rBgj', 'shortName':'test program','programType':'WITH_REGISTRATION'}")
91+
.content(HttpStatus.CREATED);
92+
String programStageId =
93+
assertStatus(
94+
HttpStatus.CREATED,
95+
POST(
96+
"/programStages/",
97+
"{'name':'test programStage', 'program':{'id':'VoZMWi7rBgj'}, 'programStageDataElements': [{'dataElement': {'id': '"
98+
+ dataElement.getUid()
99+
+ "'}}]}"));
100+
JsonWebMessage message =
101+
PATCH(
102+
"/programStages/" + programStageId,
103+
"[{ 'op': 'replace','path': '/nextScheduleDate','value': {'id': '"
104+
+ dataElement.getUid()
105+
+ "'}}]")
106+
.content(HttpStatus.OK)
107+
.as(JsonWebMessage.class);
108+
assertEquals("OK", message.getStatus());
109+
JsonObject programStage = GET("/programStages/{id}", programStageId).content();
110+
assertEquals(
111+
dataElement.getUid(), programStage.getObject("nextScheduleDate").getString("id").string());
112+
}
113+
114+
@Test
115+
void shouldFailToPatchNextScheduledDateWhenItIsReferencingADataElementWithWrongValueType() {
116+
DataElement dataElement = createDataElement('A');
117+
dataElement.setValueType(ValueType.TEXT);
118+
dataElementService.addDataElement(dataElement);
119+
POST(
120+
"/programs/",
121+
"{'name':'test program', 'id':'VoZMWi7rBgj', 'shortName':'test program','programType':'WITH_REGISTRATION'}")
122+
.content(HttpStatus.CREATED);
123+
String programStageId =
124+
assertStatus(
125+
HttpStatus.CREATED,
126+
POST(
127+
"/programStages/",
128+
"{'name':'test programStage', 'program':{'id':'VoZMWi7rBgj'}, 'programStageDataElements': [{'dataElement': {'id': '"
129+
+ dataElement.getUid()
130+
+ "'}}]}"));
131+
JsonWebMessage message =
132+
PATCH(
133+
"/programStages/" + programStageId,
134+
"[{ 'op': 'replace','path': '/nextScheduleDate','value': {'id': '"
135+
+ dataElement.getUid()
136+
+ "'}}]")
137+
.content(HttpStatus.CONFLICT)
138+
.as(JsonWebMessage.class);
139+
JsonTypeReport response = message.get("response", JsonTypeReport.class);
140+
assertEquals(1, response.getErrorReports().size());
141+
assertEquals(ErrorCode.E6001, response.getErrorReports().get(0).getErrorCode());
142+
}
73143
}

0 commit comments

Comments
 (0)