@@ -817,6 +817,84 @@ public void scheduleJobShouldThrowWhenNameInRequestIsEmpty() {
817
817
assertEquals ("Name in the request cannot be null or empty" , exception .getMessage ());
818
818
}
819
819
820
+ @ Test
821
+ public void scheduleJobShouldThrowWhenNameAlreadyExists () {
822
+ AtomicInteger callCount = new AtomicInteger (0 );
823
+
824
+ doAnswer (invocation -> {
825
+ StreamObserver <DaprProtos .ScheduleJobResponse > observer = invocation .getArgument (1 );
826
+ if (callCount .incrementAndGet () == 1 ) {
827
+ // First call succeeds
828
+ observer .onCompleted ();
829
+ } else {
830
+ // Second call fails with ALREADY_EXISTS
831
+ observer .onError (newStatusRuntimeException ("ALREADY_EXISTS" , "Job with name 'testJob' already exists" ));
832
+ }
833
+ return null ;
834
+ }).when (daprStub ).scheduleJobAlpha1 (any (DaprProtos .ScheduleJobRequest .class ), any ());
835
+
836
+ // First call should succeed
837
+ ScheduleJobRequest firstRequest = new ScheduleJobRequest ("testJob" , Instant .now ());
838
+ assertDoesNotThrow (() -> previewClient .scheduleJob (firstRequest ).block ());
839
+
840
+ ArgumentCaptor <DaprProtos .ScheduleJobRequest > captor =
841
+ ArgumentCaptor .forClass (DaprProtos .ScheduleJobRequest .class );
842
+
843
+ verify (daprStub , times (1 )).scheduleJobAlpha1 (captor .capture (), Mockito .any ());
844
+ DaprProtos .ScheduleJobRequest actualScheduleJobRequest = captor .getValue ();
845
+ DaprProtos .Job job = actualScheduleJobRequest .getJob ();
846
+ assertEquals ("testJob" , job .getName ());
847
+ assertFalse (job .hasData ());
848
+ assertEquals (0 , job .getRepeats ());
849
+ assertFalse (job .hasTtl ());
850
+
851
+ // Second call with same name should fail
852
+ ScheduleJobRequest secondRequest = new ScheduleJobRequest ("testJob" , Instant .now ());
853
+
854
+ assertThrowsDaprException (
855
+ ExecutionException .class ,
856
+ "ALREADY_EXISTS" ,
857
+ "ALREADY_EXISTS: Job with name 'testJob' already exists" ,
858
+ () -> previewClient .scheduleJob (secondRequest ).block ());
859
+ }
860
+
861
+ @ Test
862
+ public void scheduleJobShouldSucceedWhenNameAlreadyExistsWithOverwrite () {
863
+ doAnswer (invocation -> {
864
+ StreamObserver <DaprProtos .ScheduleJobResponse > observer = invocation .getArgument (1 );
865
+ observer .onCompleted (); // Simulate successful response for both calls
866
+ return null ;
867
+ }).when (daprStub ).scheduleJobAlpha1 (any (DaprProtos .ScheduleJobRequest .class ), any ());
868
+
869
+ // First call should succeed
870
+ ScheduleJobRequest firstRequest = new ScheduleJobRequest ("testJob" , Instant .now ());
871
+ assertDoesNotThrow (() -> previewClient .scheduleJob (firstRequest ).block ());
872
+
873
+ // Second call with same name but overwrite=true should also succeed
874
+ ScheduleJobRequest secondRequest = new ScheduleJobRequest ("testJob" , Instant .now ())
875
+ .setOverwrite (true );
876
+ assertDoesNotThrow (() -> previewClient .scheduleJob (secondRequest ).block ());
877
+
878
+ // Verify that both calls were made successfully
879
+ ArgumentCaptor <DaprProtos .ScheduleJobRequest > captor =
880
+ ArgumentCaptor .forClass (DaprProtos .ScheduleJobRequest .class );
881
+ verify (daprStub , times (2 )).scheduleJobAlpha1 (captor .capture (), any ());
882
+
883
+ // Verify the first call doesn't have overwrite set
884
+ DaprProtos .ScheduleJobRequest firstActualRequest = captor .getAllValues ().get (0 );
885
+ assertFalse (firstActualRequest .getJob ().getOverwrite ());
886
+ assertEquals ("testJob" , firstActualRequest .getJob ().getName ());
887
+
888
+ // Verify the second call has overwrite set to true
889
+ DaprProtos .ScheduleJobRequest secondActualRequest = captor .getAllValues ().get (1 );
890
+ assertTrue (secondActualRequest .getJob ().getOverwrite ());
891
+ assertEquals ("testJob" , secondActualRequest .getJob ().getName ());
892
+ }
893
+
894
+
895
+
896
+
897
+
820
898
@ Test
821
899
public void getJobShouldReturnResponseWhenAllFieldsArePresentInRequest () {
822
900
DateTimeFormatter iso8601Formatter = DateTimeFormatter .ofPattern ("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" )
0 commit comments