@@ -238,8 +238,11 @@ private List<Test> create(User user, Long projectId, List<Test> tests, TestSuite
238238 }
239239
240240 public Test get (User user , Long projectId , Long testId ) {
241- final Project project = projectRepository .findById (projectId ).orElse (null );
242- return get (user , project , testId );
241+ final var project = projectRepository .findById (projectId ).orElse (null );
242+ final var test = testRepository .findById (testId ).orElse (null );
243+ checkAccess (user , project , test );
244+ loadLazyRelations (test );
245+ return test ;
243246 }
244247
245248 public List <Test > get (User user , Long projectId , List <Long > ids ) {
@@ -262,67 +265,75 @@ public Test getRoot(User user, Long projectId) {
262265 return root ;
263266 }
264267
265- public void update (User user , Long projectId , Test test ) {
266- final Project project = projectRepository .findById (projectId ).orElse (null );
268+ public Test update (User user , Long projectId , Long testId , Test test ) {
269+ final var project = projectRepository .findById (projectId ).orElse (null );
270+ final var testInDB = testRepository .findById (testId ).orElse (null );
267271 checkAccess (user , project , test );
268272 checkRunningTestProcess (user , project , test );
269273
270274 // check lock status
271275 testPresenceService .checkLockStatus (projectId , test .getId (), user .getId ());
272276
273277 // make sure the name of the Test Case is unique
274- Test testInDB = testRepository .findOneByParent_IdAndName (test .getParentId (), test .getName ());
275- if (testInDB != null && !testInDB .getId ().equals (test .getId ())) {
278+ final var testWithSameName = testRepository .findOneByParent_IdAndName (test .getParentId (), test .getName ());
279+ if (testWithSameName != null && !testWithSameName .getId ().equals (testInDB .getId ())) {
276280 throw new ValidationException ("To update a test case or suite its name must be unique within its parent." );
277281 }
278282
279- final Test root = testRepository .findFirstByProject_IdOrderByIdAsc (test .getProjectId ());
280- if (test .getId ().equals (root .getId ()) && !test .getName ().equals ("Root" )) {
283+ final var rootTestSuite = testRepository .findFirstByProject_IdOrderByIdAsc (test .getProjectId ());
284+ if (test .getId ().equals (rootTestSuite .getId ()) && !test .getName ().equals ("Root" )) {
281285 throw new ValidationException ("The name of the root test suite may not be changed." );
282286 }
283287
284- testInDB = get ( user , test . getProjectId (), test . getId ());
285-
286- test . setId ( testInDB . getId () );
287- test . setProject ( testInDB . getProject ()) ;
288- test . setParent ( getParent ( user , projectId , testInDB . getParentId ()));
289-
290- if ( test instanceof TestSuite ) {
291- updateTestSuite ( user , ( TestSuite ) test , test . getProject ()) ;
292- } else if ( test instanceof TestCase ) {
293- updateTestCase ( user , ( TestCase ) test , test . getProject () );
288+ if ( testInDB instanceof TestSuite && test instanceof TestSuite ) {
289+ final var updatedTestSuite = updateTestSuite (( TestSuite ) testInDB , ( TestSuite ) test );
290+ loadLazyRelations ( updatedTestSuite );
291+ return updatedTestSuite ;
292+ } else if ( testInDB instanceof TestCase && test instanceof TestCase ) {
293+ final var updatedTestCase = updateTestCase ( user , ( TestCase ) testInDB , ( TestCase ) test );
294+ loadLazyRelations ( updatedTestCase );
295+ return updatedTestCase ;
296+ } else {
297+ throw new IllegalStateException ( "Cannot update a test case with a test suite or vice versa." );
294298 }
295299 }
296300
297- private List <Long > getStepsWithIds (List <TestCaseStep > steps ) {
298- return steps .stream ()
299- .filter (s -> s .getId () != null )
300- .map (TestCaseStep ::getId )
301- .collect (Collectors .toList ());
302- }
303-
304- private void updateTestCase (User user , TestCase testCase , Project project ) {
301+ private Test updateTestCase (User user , TestCase testCaseInDB , TestCase testCase ) {
305302 checkIfOutputMappingNamesAreUnique (testCase );
306303
307- beforeSaving (user , project , testCase );
308-
309- testCase .setGenerated (false );
310- testCase .setUpdatedOn (ZonedDateTime .now ());
311- testCase .setLastUpdatedBy (user );
312-
313- final List <Long > allStepIds = new ArrayList <>(); // all ids that still exist in the db
314- allStepIds .addAll (getStepsWithIds (testCase .getPreSteps ()));
315- allStepIds .addAll (getStepsWithIds (testCase .getSteps ()));
316- allStepIds .addAll (getStepsWithIds (testCase .getPostSteps ()));
317-
318- testCaseStepRepository .deleteAllByTestCase_IdAndIdNotIn (testCase .getId (), allStepIds );
319-
320- // delete all test case steps that have been removed in the update.
321- saveTestCaseSteps (testCase .getPreSteps ());
322- saveTestCaseSteps (testCase .getSteps ());
323- saveTestCaseSteps (testCase .getPostSteps ());
324-
325- testRepository .save (testCase );
304+ testCaseInDB .setName (testCase .getName ());
305+ testCaseInDB .setGenerated (false );
306+ testCaseInDB .setUpdatedOn (ZonedDateTime .now ());
307+ testCaseInDB .setLastUpdatedBy (user );
308+
309+ testCaseInDB .getPreSteps ().clear ();
310+ testCaseInDB .getSteps ().clear ();
311+ testCaseInDB .getPostSteps ().clear ();
312+ testRepository .save (testCaseInDB );
313+
314+ testCaseInDB .getPreSteps ().addAll (testCase .getPreSteps ());
315+ testCaseInDB .getSteps ().addAll (testCase .getSteps ());
316+ testCaseInDB .getPostSteps ().addAll (testCase .getPostSteps ());
317+ removeIdsFromSteps (testCaseInDB );
318+ beforeSaving (user , testCaseInDB .getProject (), testCaseInDB );
319+
320+ saveTestCaseSteps (testCaseInDB .getPreSteps ());
321+ saveTestCaseSteps (testCaseInDB .getSteps ());
322+ saveTestCaseSteps (testCaseInDB .getPostSteps ());
323+ testRepository .save (testCaseInDB );
324+
325+ return testCaseInDB ;
326+ }
327+
328+ private void removeIdsFromSteps (TestCase testCase ) {
329+ Stream .of (testCase .getPreSteps (), testCase .getSteps (), testCase .getPostSteps ())
330+ .flatMap (Collection ::stream )
331+ .forEach (s -> {
332+ s .setId (null );
333+ s .getPSymbol ().setId (null );
334+ s .getPSymbol ().getOutputMappings ().forEach (om -> om .setId (null ));
335+ s .getPSymbol ().getParameterValues ().forEach (om -> om .setId (null ));
336+ });
326337 }
327338
328339 private void checkIfOutputMappingNamesAreUnique (TestCase testCase ) {
@@ -336,10 +347,9 @@ private void checkIfOutputMappingNamesAreUnique(TestCase testCase) {
336347 SymbolOutputMappingUtils .checkIfMappedNamesAreUnique (oms );
337348 }
338349
339- private void updateTestSuite (User user , TestSuite testSuite , Project project ) {
340- testSuite .getTests ().forEach (t -> t .setParent (null ));
341- beforeSaving (user , project , testSuite );
342- testRepository .save (testSuite );
350+ private Test updateTestSuite (TestSuite testSuiteInDB , TestSuite testSuite ) {
351+ testSuiteInDB .setName (testSuite .getName ());
352+ return testRepository .save (testSuiteInDB );
343353 }
344354
345355 public void delete (User user , Long projectId , Long testId ) {
@@ -568,13 +578,6 @@ private void saveTestCaseSteps(List<TestCaseStep> steps) {
568578 });
569579 }
570580
571- private Test get (User user , Project project , Long testId ) {
572- final Test test = testRepository .findById (testId ).orElse (null );
573- checkAccess (user , project , test );
574- loadLazyRelations (test );
575- return test ;
576- }
577-
578581 private void loadLazyRelations (TestResult testResult ) {
579582 if (testResult instanceof TestCaseResult ) {
580583 Hibernate .initialize (((TestCaseResult ) testResult ).getOutputs ());
@@ -606,7 +609,8 @@ private void beforeSaving(User user, Project project, Test test) {
606609 if (test instanceof TestSuite ) {
607610 TestSuite testSuite = (TestSuite ) test ;
608611 for (Long testId : testSuite .getTestsAsIds ()) {
609- Test otherTest = get (user , project , testId );
612+ final var otherTest = testRepository .findById (testId ).orElse (null );
613+ checkAccess (user , project , otherTest );
610614 testSuite .addTest (otherTest );
611615 }
612616 } else if (test instanceof TestCase ) {
0 commit comments