2121import org .springframework .batch .item .ExecutionContext ;
2222import org .springframework .beans .factory .annotation .Autowired ;
2323import org .springframework .boot .test .context .SpringBootTest ;
24+ import org .springframework .dao .OptimisticLockingFailureException ;
2425
2526import java .util .Date ;
2627import java .util .HashMap ;
2728import java .util .Map ;
2829
2930import static org .assertj .core .api .Assertions .assertThat ;
31+ import static org .assertj .core .api .Assertions .assertThatThrownBy ;
3032
3133@ SpringBootTest (classes = Neo4jTestApplication .class , webEnvironment = SpringBootTest .WebEnvironment .NONE )
3234class JobExecutionDaoTest {
@@ -74,6 +76,15 @@ void saveJobExecution() {
7476 assertThat (exec .getJobParameters ()).isEqualToComparingFieldByField (newExec .getJobParameters ());
7577 }
7678
79+ @ Test
80+ void saveSameJobExecutionThrows () {
81+ var newExec = execution ();
82+ execDao .saveJobExecution (newExec );
83+
84+ assertThatThrownBy (() -> execDao .saveJobExecution (newExec ))
85+ .isInstanceOf (IllegalStateException .class );
86+ }
87+
7788 @ Test
7889 void updateJobExecution () {
7990 var newExec = execution ();
@@ -94,7 +105,23 @@ void updateJobExecution() {
94105 assertThat (exec .getStatus ()).isEqualTo (BatchStatus .ABANDONED );
95106 assertThat (exec .getExecutionContext ()).isEqualTo (params ());
96107 assertThat (exec .getJobParameters ()).isEqualToComparingFieldByField (newExec .getJobParameters ());
108+ }
109+
110+ @ Test
111+ void updateOldVersionThrows () {
112+ var newExec = execution ();
113+ execDao .saveJobExecution (newExec );
114+
115+ ExecutionContext newCtx = new ExecutionContext (params ());
116+ newExec .setExitStatus (ExitStatus .COMPLETED );
117+ newExec .setStatus (BatchStatus .ABANDONED );
118+ newExec .setExecutionContext (newCtx );
97119
120+ execDao .updateJobExecution (newExec );
121+ newExec .setVersion (newExec .getVersion () - 1 );
122+
123+ assertThatThrownBy (() -> execDao .updateJobExecution (newExec ))
124+ .isInstanceOf (OptimisticLockingFailureException .class );
98125 }
99126
100127 /**
@@ -186,6 +213,22 @@ void synchronizeStatus() {
186213 .isEqualTo (BatchStatus .ABANDONED );
187214 }
188215
216+ @ Test
217+ void synchronizeStatusDoesNotUpdateSame () {
218+ JobParameters parameters = new JobParametersBuilder ().addLong (PARAM , LONG_PARAM_VAL ).toJobParameters ();
219+ val instance = instanceDao .createJobInstance (JOB_NAME , parameters );
220+
221+ var execToSave = execution (instance );
222+ execToSave .setStartTime (new Date ());
223+ execDao .saveJobExecution (execToSave );
224+
225+ execToSave .setStatus (BatchStatus .ABANDONED );
226+ execDao .synchronizeStatus (execToSave );
227+
228+ assertThat (execDao .getJobExecution (execToSave .getId ())).extracting (JobExecution ::getStatus )
229+ .isEqualTo (BatchStatus .STARTING );
230+ }
231+
189232 private JobExecution execution (JobInstance instance ) {
190233 JobParameters parameters = new JobParametersBuilder ().addLong (PARAM , LONG_PARAM_VAL ).toJobParameters ();
191234 return new JobExecution (instance , parameters );
0 commit comments