2023-03-31 18:46:13 +00:00
mod parse ;
use parse ::Parse ;
use surrealdb ::dbs ::Session ;
use surrealdb ::err ::Error ;
use surrealdb ::kvs ::Datastore ;
use surrealdb ::sql ::Value ;
#[ tokio::test ]
2023-05-07 12:33:32 +00:00
async fn update_simple_with_input ( ) -> Result < ( ) , Error > {
2023-03-31 18:46:13 +00:00
let sql = "
DEFINE FIELD name ON TABLE person
ASSERT
IF $input THEN
$input = / ^ [ A - Z ] { 1 } [ a - z ] + $ /
ELSE
true
END
VALUE
IF $input THEN
' Name : ' + $input
ELSE
$value
END
;
UPDATE person :test CONTENT { name : ' Tobie ' } ;
UPDATE person :test REPLACE { name : ' jaime ' } ;
UPDATE person :test MERGE { name : ' Jaime ' } ;
UPDATE person :test SET name = ' tobie ' ;
UPDATE person :test SET name = ' Tobie ' ;
SELECT * FROM person :test ;
" ;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
2023-06-20 11:48:20 +00:00
let res = & mut dbs . execute ( sql , & ses , None , false ) . await ? ;
2023-03-31 18:46:13 +00:00
assert_eq! ( res . len ( ) , 7 ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( tmp . is_ok ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : person :test ,
name : ' Name : Tobie ' ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = r # "Found 'Name: jaime' for field `name`, with record `person:test`, but field must conform to: IF $input THEN $input = /^[A-Z]{1}[a-z]+$/ ELSE true END"#
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : person :test ,
name : ' Name : Jaime ' ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( matches! (
tmp . err ( ) ,
Some ( e ) if e . to_string ( ) = = r # "Found 'Name: tobie' for field `name`, with record `person:test`, but field must conform to: IF $input THEN $input = /^[A-Z]{1}[a-z]+$/ ELSE true END"#
) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : person :test ,
name : ' Name : Tobie ' ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : person :test ,
name : ' Name : Tobie ' ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}
2023-05-07 12:33:32 +00:00
#[ tokio::test ]
async fn update_complex_with_input ( ) -> Result < ( ) , Error > {
let sql = "
DEFINE FIELD images ON product
TYPE array
ASSERT array ::len ( $value ) > 0
;
DEFINE FIELD images . * ON product TYPE string
VALUE string ::trim ( $input )
ASSERT $input AND string ::len ( $value ) > 0
;
CREATE product :test SET images = [ ' test . png ' ] ;
" ;
let dbs = Datastore ::new ( " memory " ) . await ? ;
let ses = Session ::for_kv ( ) . with_ns ( " test " ) . with_db ( " test " ) ;
2023-06-20 11:48:20 +00:00
let res = & mut dbs . execute ( sql , & ses , None , false ) . await ? ;
2023-05-07 12:33:32 +00:00
assert_eq! ( res . len ( ) , 3 ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( tmp . is_ok ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ;
assert! ( tmp . is_ok ( ) ) ;
//
let tmp = res . remove ( 0 ) . result ? ;
let val = Value ::parse (
" [
{
id : product :test ,
images : [ ' test . png ' ] ,
}
] " ,
) ;
assert_eq! ( tmp , val ) ;
//
Ok ( ( ) )
}