Skip to content

Commit a763314

Browse files
committed
Trash run even if it is already trashed
Trashing a run that was already trashed should have no effects and it should not throw an exception Signed-off-by: Andrea Lamparelli <[email protected]>
1 parent 00e2b18 commit a763314

File tree

5 files changed

+215
-5
lines changed

5 files changed

+215
-5
lines changed

horreum-backend/src/main/java/io/hyperfoil/tools/horreum/svc/RunServiceImpl.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -921,11 +921,13 @@ private void trashInternal(int id, boolean trashed) {
921921
if (run == null) {
922922
throw ServiceException.notFound("Run not found: " + id);
923923
}
924-
if (run.trashed == trashed)
925-
throw ServiceException.badRequest("The run " + id + " has already been trashed, not possible to trash it again.");
924+
if (run.trashed == trashed && trashed) {
925+
log.infof("The run %s has already been trashed, doing nothing.", id);
926+
return;
927+
}
926928
if (trashed) {
927929
trashConnectedDatasets(run.id, run.testid);
928-
run.trashed = trashed;
930+
run.trashed = true;
929931
run.persist();
930932
if (mediator.testMode())
931933
Util.registerTxSynchronization(tm,
@@ -935,7 +937,7 @@ private void trashInternal(int id, boolean trashed) {
935937
// before we try to recalculate the dataset
936938
else {
937939
if (TestDAO.findById(run.testid) != null) {
938-
run.trashed = trashed;
940+
run.trashed = false;
939941
run.persistAndFlush();
940942
transform(id, true);
941943
} else

horreum-backend/src/main/java/io/hyperfoil/tools/horreum/svc/TestServiceImpl.java

-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ public void delete(int id) {
119119
if (mediator.testMode())
120120
Util.registerTxSynchronization(tm,
121121
txStatus -> mediator.publishEvent(AsyncEventChannels.TEST_DELETED, test.id, TestMapper.from(test)));
122-
;
123122
}
124123

125124
@Override

horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/BaseServiceNoRestTest.java

+24
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package io.hyperfoil.tools.horreum.svc;
22

3+
import java.time.Instant;
34
import java.util.ArrayList;
45
import java.util.List;
56

7+
import jakarta.inject.Inject;
8+
import jakarta.persistence.EntityManager;
9+
10+
import com.fasterxml.jackson.databind.JsonNode;
11+
612
import io.hyperfoil.tools.horreum.api.data.Access;
713
import io.hyperfoil.tools.horreum.api.data.Extractor;
814
import io.hyperfoil.tools.horreum.api.data.Label;
15+
import io.hyperfoil.tools.horreum.api.data.Run;
916
import io.hyperfoil.tools.horreum.api.data.Schema;
1017
import io.hyperfoil.tools.horreum.api.data.Test;
1118
import io.hyperfoil.tools.horreum.api.data.Transformer;
@@ -19,6 +26,9 @@ public abstract class BaseServiceNoRestTest {
1926
protected static final String FOO_UPLOADER = "foo-uploader";
2027
protected static final String BAR_TEAM = "bar-team";
2128

29+
@Inject
30+
protected EntityManager em;
31+
2232
protected Schema createSampleSchema(String name, String uri, String owner) {
2333
Schema schema = new Schema();
2434
schema.owner = owner;
@@ -85,4 +95,18 @@ protected Test createSampleTest(String name, String owner, String folder, Intege
8595
test.folder = folder == null ? "" : folder;
8696
return test;
8797
}
98+
99+
protected Run createSampleRun(int testId, JsonNode runJson, String owner) {
100+
Instant instant = Instant.now();
101+
102+
Run run = new Run();
103+
run.testid = testId;
104+
run.data = runJson;
105+
run.trashed = false;
106+
run.start = instant;
107+
run.stop = instant;
108+
run.owner = owner == null ? FOO_TEAM : owner;
109+
110+
return run;
111+
}
88112
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package io.hyperfoil.tools.horreum.svc;
2+
3+
import static io.hyperfoil.tools.horreum.svc.BaseServiceNoRestTest.DEFAULT_USER;
4+
import static io.hyperfoil.tools.horreum.svc.BaseServiceNoRestTest.FOO_TEAM;
5+
import static io.hyperfoil.tools.horreum.svc.BaseServiceNoRestTest.FOO_TESTER;
6+
import static io.hyperfoil.tools.horreum.svc.BaseServiceNoRestTest.FOO_UPLOADER;
7+
import static org.junit.jupiter.api.Assertions.assertEquals;
8+
import static org.junit.jupiter.api.Assertions.assertFalse;
9+
import static org.junit.jupiter.api.Assertions.assertNotNull;
10+
import static org.junit.jupiter.api.Assertions.assertTrue;
11+
12+
import jakarta.inject.Inject;
13+
import jakarta.ws.rs.core.Response;
14+
15+
import com.fasterxml.jackson.databind.JsonNode;
16+
import com.fasterxml.jackson.databind.ObjectMapper;
17+
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
18+
19+
import io.hyperfoil.tools.horreum.api.data.Access;
20+
import io.hyperfoil.tools.horreum.api.data.Run;
21+
import io.hyperfoil.tools.horreum.api.data.Test;
22+
import io.hyperfoil.tools.horreum.api.services.RunService;
23+
import io.hyperfoil.tools.horreum.api.services.TestService;
24+
import io.hyperfoil.tools.horreum.entity.data.RunDAO;
25+
import io.hyperfoil.tools.horreum.entity.data.TestDAO;
26+
import io.hyperfoil.tools.horreum.test.HorreumTestProfile;
27+
import io.hyperfoil.tools.horreum.test.PostgresResource;
28+
import io.quarkus.test.TestTransaction;
29+
import io.quarkus.test.common.QuarkusTestResource;
30+
import io.quarkus.test.junit.QuarkusTest;
31+
import io.quarkus.test.junit.TestProfile;
32+
import io.quarkus.test.security.TestSecurity;
33+
34+
@QuarkusTest
35+
@QuarkusTestResource(PostgresResource.class)
36+
@TestProfile(HorreumTestProfile.class)
37+
@TestTransaction
38+
@TestSecurity(user = DEFAULT_USER, roles = { Roles.TESTER, Roles.VIEWER, Roles.UPLOADER, FOO_TEAM, FOO_TESTER, FOO_UPLOADER })
39+
class RunServiceNoRestTest extends BaseServiceNoRestTest {
40+
41+
@Inject
42+
RunService runService;
43+
44+
@Inject
45+
TestService testService;
46+
47+
@Inject
48+
ObjectMapper objectMapper;
49+
50+
@org.junit.jupiter.api.Test
51+
void testUploadRun() {
52+
Test t1 = createSampleTest("test", null, null, null);
53+
54+
Test created1 = testService.add(t1);
55+
assertNotNull(created1.id);
56+
assertEquals(1, TestDAO.count());
57+
58+
int runId = uploadRun(created1.id, FOO_TEAM, JsonNodeFactory.instance.objectNode());
59+
assertEquals(1, RunDAO.count());
60+
assertNotNull(RunDAO.findById(runId));
61+
}
62+
63+
@org.junit.jupiter.api.Test
64+
void testTrashRun() {
65+
Test t1 = createSampleTest("test", null, null, null);
66+
67+
Test created1 = testService.add(t1);
68+
assertNotNull(created1.id);
69+
assertEquals(1, TestDAO.count());
70+
71+
int runId = uploadRun(created1.id, FOO_TEAM, JsonNodeFactory.instance.objectNode());
72+
assertEquals(1, RunDAO.count());
73+
RunDAO run = RunDAO.findById(runId);
74+
assertFalse(run.trashed);
75+
76+
runService.trash(runId, true);
77+
assertTrue(run.trashed);
78+
}
79+
80+
@org.junit.jupiter.api.Test
81+
void testTrashAlreadyTrashedRun() {
82+
Test t1 = createSampleTest("test", null, null, null);
83+
84+
Test created1 = testService.add(t1);
85+
assertNotNull(created1.id);
86+
assertEquals(1, TestDAO.count());
87+
88+
int runId = uploadRun(created1.id, FOO_TEAM, JsonNodeFactory.instance.objectNode());
89+
assertEquals(1, RunDAO.count());
90+
RunDAO run = RunDAO.findById(runId);
91+
assertFalse(run.trashed);
92+
93+
runService.trash(runId, true);
94+
assertTrue(run.trashed);
95+
96+
// trash again the same trashed run
97+
runService.trash(runId, true);
98+
assertTrue(run.trashed);
99+
}
100+
101+
// utility to create a sample test and add to Horreum
102+
private Test addTest(String name, String owner, String folder, Integer datastoreId) {
103+
Test test = createSampleTest(name, owner, folder, datastoreId);
104+
return testService.add(test);
105+
}
106+
107+
// utility to create a sample test and add to Horreum
108+
private int uploadRun(int testId, String owner, JsonNode runData) {
109+
Run run = createSampleRun(testId, runData, owner);
110+
111+
try (Response resp = runService.add(String.valueOf(testId), owner, Access.PUBLIC, run)) {
112+
assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
113+
return Integer.parseInt(resp.getEntity().toString());
114+
}
115+
}
116+
}

horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/TestServiceNoRestTest.java

+69
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static io.hyperfoil.tools.horreum.svc.BaseServiceNoRestTest.DEFAULT_USER;
44
import static io.hyperfoil.tools.horreum.svc.BaseServiceNoRestTest.FOO_TEAM;
55
import static io.hyperfoil.tools.horreum.svc.BaseServiceNoRestTest.FOO_TESTER;
6+
import static io.hyperfoil.tools.horreum.svc.BaseServiceNoRestTest.FOO_UPLOADER;
67
import static org.junit.jupiter.api.Assertions.assertEquals;
78
import static org.junit.jupiter.api.Assertions.assertFalse;
89
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -20,12 +21,16 @@
2021

2122
import com.fasterxml.jackson.core.JsonProcessingException;
2223
import com.fasterxml.jackson.databind.ObjectMapper;
24+
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
2325
import com.fasterxml.jackson.databind.node.ObjectNode;
2426

2527
import io.hyperfoil.tools.horreum.api.SortDirection;
2628
import io.hyperfoil.tools.horreum.api.data.Access;
29+
import io.hyperfoil.tools.horreum.api.data.Run;
2730
import io.hyperfoil.tools.horreum.api.data.Test;
31+
import io.hyperfoil.tools.horreum.api.services.RunService;
2832
import io.hyperfoil.tools.horreum.api.services.TestService;
33+
import io.hyperfoil.tools.horreum.entity.data.RunDAO;
2934
import io.hyperfoil.tools.horreum.entity.data.TestDAO;
3035
import io.hyperfoil.tools.horreum.test.HorreumTestProfile;
3136
import io.hyperfoil.tools.horreum.test.PostgresResource;
@@ -47,6 +52,9 @@ class TestServiceNoRestTest extends BaseServiceNoRestTest {
4752
@Inject
4853
TestService testService;
4954

55+
@Inject
56+
RunService runService;
57+
5058
@Inject
5159
ObjectMapper objectMapper;
5260

@@ -498,6 +506,67 @@ void testDeleteTestNotFound() {
498506
assertEquals(Response.Status.NOT_FOUND.getStatusCode(), thrown.getResponse().getStatus());
499507
}
500508

509+
@TestSecurity(user = DEFAULT_USER, roles = { Roles.TESTER, Roles.VIEWER, Roles.UPLOADER, FOO_TEAM, FOO_TESTER,
510+
FOO_UPLOADER })
511+
@org.junit.jupiter.api.Test
512+
void testDeleteTestWithRun() {
513+
Test created1 = addTest("test", null, null, null);
514+
assertNotNull(created1.id);
515+
assertEquals(1, TestDAO.count());
516+
517+
Run run1 = createSampleRun(created1.id, JsonNodeFactory.instance.objectNode(), FOO_TEAM);
518+
int runId;
519+
try (Response resp = runService.add(created1.name, FOO_TEAM, Access.PUBLIC, run1)) {
520+
assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
521+
runId = Integer.parseInt(resp.getEntity().toString());
522+
}
523+
assertEquals(1, RunDAO.count());
524+
525+
// flush data
526+
em.clear();
527+
528+
testService.delete(created1.id);
529+
assertEquals(0, TestDAO.count());
530+
531+
// atm when a test is deleted, its runs are simply trashed
532+
assertEquals(1, RunDAO.count());
533+
RunDAO persistedRun = RunDAO.findById(runId);
534+
assertNotNull(persistedRun);
535+
assertTrue(persistedRun.trashed);
536+
}
537+
538+
@TestSecurity(user = DEFAULT_USER, roles = { Roles.TESTER, Roles.VIEWER, Roles.UPLOADER, FOO_TEAM, FOO_TESTER,
539+
FOO_UPLOADER })
540+
@org.junit.jupiter.api.Test
541+
void testDeleteTestWithAlreadyTrashedRun() {
542+
Test created1 = addTest("test", null, null, null);
543+
assertNotNull(created1.id);
544+
assertEquals(1, TestDAO.count());
545+
546+
Run run1 = createSampleRun(created1.id, JsonNodeFactory.instance.objectNode(), FOO_TEAM);
547+
int runId;
548+
try (Response resp = runService.add(created1.name, FOO_TEAM, Access.PUBLIC, run1)) {
549+
assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
550+
runId = Integer.parseInt(resp.getEntity().toString());
551+
}
552+
assertEquals(1, RunDAO.count());
553+
554+
// flush data
555+
em.clear();
556+
557+
// trash the run
558+
runService.trash(runId, true);
559+
560+
testService.delete(created1.id);
561+
assertEquals(0, TestDAO.count());
562+
563+
// atm when a test is deleted, its runs are simply trashed
564+
assertEquals(1, RunDAO.count());
565+
RunDAO persistedRun = RunDAO.findById(runId);
566+
assertNotNull(persistedRun);
567+
assertTrue(persistedRun.trashed);
568+
}
569+
501570
@TestSecurity(user = DEFAULT_USER, roles = { Roles.TESTER, Roles.VIEWER, FOO_TEAM, FOO_TESTER, FOO_UPLOADER })
502571
@org.junit.jupiter.api.Test
503572
void testEnsureTestExists() {

0 commit comments

Comments
 (0)