6464import com .scalar .db .io .Key ;
6565import com .scalar .dl .client .exception .ClientException ;
6666import com .scalar .dl .client .service .GenericContractClientService ;
67+ import com .scalar .dl .genericcontracts .object .Constants ;
6768import com .scalar .dl .ledger .error .LedgerError ;
6869import com .scalar .dl .ledger .model .ContractExecutionResult ;
6970import com .scalar .dl .ledger .model .LedgerValidationResult ;
7071import com .scalar .dl .ledger .service .StatusCode ;
7172import com .scalar .dl .ledger .util .JacksonSerDe ;
7273import java .io .IOException ;
74+ import java .time .LocalDateTime ;
7375import java .util .HashSet ;
7476import java .util .List ;
7577import java .util .Map ;
@@ -90,7 +92,7 @@ public class GenericContractObjectAndCollectionEndToEndTest
9092 private static final String ASSET_AGE = "age" ;
9193 private static final String ASSET_OUTPUT = "output" ;
9294 private static final String DATA_TYPE_INT = "INT" ;
93- private static final String DATA_TYPE_BIGINT = "BIGINT " ;
95+ private static final String DATA_TYPE_TIMESTAMP = "TIMESTAMP " ;
9496 private static final String DATA_TYPE_TEXT = "TEXT" ;
9597
9698 private static final String PACKAGE_OBJECT = "object" ;
@@ -138,6 +140,8 @@ public class GenericContractObjectAndCollectionEndToEndTest
138140 private static final String SOME_COLUMN_NAME_2 = "version" ;
139141 private static final String SOME_COLUMN_NAME_3 = "status" ;
140142 private static final String SOME_COLUMN_NAME_4 = "registered_at" ;
143+ private static final String SOME_TIMESTAMP_TEXT = "2021-02-03 05:45:00" ;
144+ private static final LocalDateTime SOME_TIMESTAMP_VALUE = LocalDateTime .of (2021 , 2 , 3 , 5 , 45 );
141145 private static final String SOME_COLLECTION_ID = "set" ;
142146 private static final ArrayNode SOME_DEFAULT_OBJECT_IDS =
143147 mapper .createArrayNode ().add ("object1" ).add ("object2" ).add ("object3" ).add ("object4" );
@@ -241,20 +245,20 @@ private JsonNode createColumn(String name, int value) {
241245 .put (DATA_TYPE , DATA_TYPE_INT );
242246 }
243247
244- private JsonNode createColumn (String name , long value ) {
248+ private JsonNode createColumn (String name , String value ) {
245249 return mapper
246250 .createObjectNode ()
247251 .put (COLUMN_NAME , name )
248252 .put (VALUE , value )
249- .put (DATA_TYPE , DATA_TYPE_BIGINT );
253+ .put (DATA_TYPE , DATA_TYPE_TEXT );
250254 }
251255
252- private JsonNode createColumn (String name , String value ) {
256+ private JsonNode createTimestampColumn (String name , String value ) {
253257 return mapper
254258 .createObjectNode ()
255259 .put (COLUMN_NAME , name )
256260 .put (VALUE , value )
257- .put (DATA_TYPE , DATA_TYPE_TEXT );
261+ .put (DATA_TYPE , DATA_TYPE_TIMESTAMP );
258262 }
259263
260264 private JsonNode createFunctionArguments (
@@ -267,7 +271,7 @@ private JsonNode createFunctionArguments(
267271 mapper
268272 .createArrayNode ()
269273 .add (createColumn (SOME_COLUMN_NAME_3 , status ))
270- .add (createColumn (SOME_COLUMN_NAME_4 , registeredAt ));
274+ .add (createTimestampColumn (SOME_COLUMN_NAME_4 , SOME_TIMESTAMP_TEXT ));
271275
272276 ObjectNode arguments = mapper .createObjectNode ();
273277 arguments .put (NAMESPACE , getFunctionNamespace ());
@@ -574,11 +578,11 @@ public void putObject_FunctionArgumentsGiven_ShouldPutRecordToFunctionTable()
574578 assertThat (results .get (0 ).getText (SOME_COLUMN_NAME_1 )).isEqualTo (SOME_OBJECT_ID );
575579 assertThat (results .get (0 ).getText (SOME_COLUMN_NAME_2 )).isEqualTo (SOME_VERSION_ID_0 );
576580 assertThat (results .get (0 ).getInt (SOME_COLUMN_NAME_3 )).isEqualTo (0 );
577- assertThat (results .get (0 ).getBigInt (SOME_COLUMN_NAME_4 )).isEqualTo (1L );
581+ assertThat (results .get (0 ).getTimestamp (SOME_COLUMN_NAME_4 )).isEqualTo (SOME_TIMESTAMP_VALUE );
578582 assertThat (results .get (1 ).getText (SOME_COLUMN_NAME_1 )).isEqualTo (SOME_OBJECT_ID );
579583 assertThat (results .get (1 ).getText (SOME_COLUMN_NAME_2 )).isEqualTo (SOME_VERSION_ID_1 );
580584 assertThat (results .get (1 ).getInt (SOME_COLUMN_NAME_3 )).isEqualTo (1 );
581- assertThat (results .get (1 ).getBigInt (SOME_COLUMN_NAME_4 )).isEqualTo (1234567890123L );
585+ assertThat (results .get (1 ).getTimestamp (SOME_COLUMN_NAME_4 )).isEqualTo (SOME_TIMESTAMP_VALUE );
582586 } catch (IOException e ) {
583587 throw new RuntimeException (e );
584588 }
@@ -662,6 +666,45 @@ public void putObject_FunctionArgumentsGiven_ShouldPutRecordToFunctionTable()
662666 .isEqualTo (StatusCode .CONFLICT );
663667 }
664668
669+ @ Test
670+ public void
671+ putObject_FunctionArgumentsWithInvalidTimeRelatedTypeFormatGiven_ShouldThrowClientException () {
672+ // Arrange
673+ JsonNode contractArguments =
674+ mapper
675+ .createObjectNode ()
676+ .put (OBJECT_ID , SOME_OBJECT_ID )
677+ .put (HASH_VALUE , SOME_HASH_VALUE_0 )
678+ .set (METADATA , SOME_METADATA_0 );
679+ ObjectNode functionArguments =
680+ mapper
681+ .createObjectNode ()
682+ .put (NAMESPACE , getFunctionNamespace ())
683+ .put (TABLE , getFunctionTable ());
684+ functionArguments .set (
685+ PARTITION_KEY ,
686+ mapper .createArrayNode ().add (createColumn (SOME_COLUMN_NAME_1 , SOME_OBJECT_ID )));
687+ functionArguments .set (
688+ CLUSTERING_KEY ,
689+ mapper .createArrayNode ().add (createColumn (SOME_COLUMN_NAME_2 , SOME_VERSION_ID_0 )));
690+ functionArguments .set (
691+ COLUMNS ,
692+ mapper
693+ .createArrayNode ()
694+ .add (createColumn (SOME_COLUMN_NAME_3 , 0 ))
695+ .add (createTimestampColumn (SOME_COLUMN_NAME_4 , "2024-05-19" )));
696+
697+ // Act Assert
698+ assertThatThrownBy (
699+ () ->
700+ clientService .executeContract (
701+ ID_OBJECT_PUT , contractArguments , ID_OBJECT_PUT_MUTABLE , functionArguments ))
702+ .isExactlyInstanceOf (ClientException .class )
703+ .hasMessage (Constants .INVALID_PUT_MUTABLE_FUNCTION_ARGUMENT_FORMAT )
704+ .extracting ("code" )
705+ .isEqualTo (StatusCode .CONTRACT_CONTEXTUAL_ERROR );
706+ }
707+
665708 @ Test
666709 public void putObject_InvalidMetadataGiven_ShouldThrowClientException () {
667710 // Arrange
0 commit comments