@@ -981,3 +981,134 @@ async fn test_issue_281() -> Result<()> {
981981
982982 Ok ( ( ) )
983983}
984+
985+ #[ tokio:: test]
986+ async fn test_issue_303 ( ) -> Result < ( ) > {
987+ let factory = ServerFactory :: default ( ) ;
988+ let mut fs = MemoryFileSystem :: default ( ) ;
989+ let test_db = get_new_test_db ( ) . await ;
990+
991+ let setup = r#"
992+ create table public.users (
993+ id serial primary key,
994+ name varchar(255) not null
995+ );
996+ "# ;
997+
998+ test_db
999+ . execute ( setup)
1000+ . await
1001+ . expect ( "Failed to setup test database" ) ;
1002+
1003+ let mut conf = PartialConfiguration :: init ( ) ;
1004+ conf. merge_with ( PartialConfiguration {
1005+ db : Some ( PartialDatabaseConfiguration {
1006+ database : Some (
1007+ test_db
1008+ . connect_options ( )
1009+ . get_database ( )
1010+ . unwrap ( )
1011+ . to_string ( ) ,
1012+ ) ,
1013+ ..Default :: default ( )
1014+ } ) ,
1015+ ..Default :: default ( )
1016+ } ) ;
1017+ fs. insert (
1018+ url ! ( "postgrestools.jsonc" ) . to_file_path ( ) . unwrap ( ) ,
1019+ serde_json:: to_string_pretty ( & conf) . unwrap ( ) ,
1020+ ) ;
1021+
1022+ let ( service, client) = factory
1023+ . create_with_fs ( None , DynRef :: Owned ( Box :: new ( fs) ) )
1024+ . into_inner ( ) ;
1025+
1026+ let ( stream, sink) = client. split ( ) ;
1027+ let mut server = Server :: new ( service) ;
1028+
1029+ let ( sender, _) = channel ( CHANNEL_BUFFER_SIZE ) ;
1030+ let reader = tokio:: spawn ( client_handler ( stream, sink, sender) ) ;
1031+
1032+ server. initialize ( ) . await ?;
1033+ server. initialized ( ) . await ?;
1034+
1035+ server. load_configuration ( ) . await ?;
1036+
1037+ server. open_document ( "" ) . await ?;
1038+
1039+ let chars = [
1040+ "c" , "r" , "e" , "a" , "t" , "e" , " " , "t" , "a" , "b" , "l" , "e" , " " , "\" \" " , "h" , "e" , "l" ,
1041+ "l" , "o" ,
1042+ ] ;
1043+ let mut version = 1 ;
1044+
1045+ for ( i, c) in chars. iter ( ) . enumerate ( ) {
1046+ version += 1 ;
1047+ server
1048+ . change_document (
1049+ version,
1050+ vec ! [ TextDocumentContentChangeEvent {
1051+ range: Some ( Range {
1052+ start: Position {
1053+ line: 0 ,
1054+ character: i as u32 ,
1055+ } ,
1056+ end: Position {
1057+ line: 0 ,
1058+ character: i as u32 ,
1059+ } ,
1060+ } ) ,
1061+ range_length: Some ( 0 ) ,
1062+ text: c. to_string( ) ,
1063+ } ] ,
1064+ )
1065+ . await ?;
1066+ }
1067+
1068+ version += 1 ;
1069+ server
1070+ . change_document (
1071+ version,
1072+ vec ! [ TextDocumentContentChangeEvent {
1073+ range: Some ( Range {
1074+ start: Position {
1075+ line: 0 ,
1076+ character: 20 ,
1077+ } ,
1078+ end: Position {
1079+ line: 0 ,
1080+ character: 20 ,
1081+ } ,
1082+ } ) ,
1083+ range_length: Some ( 0 ) ,
1084+ text: " " . to_string( ) ,
1085+ } ] ,
1086+ )
1087+ . await ?;
1088+
1089+ version += 1 ;
1090+ server
1091+ . change_document (
1092+ version,
1093+ vec ! [ TextDocumentContentChangeEvent {
1094+ range: Some ( Range {
1095+ start: Position {
1096+ line: 0 ,
1097+ character: 20 ,
1098+ } ,
1099+ end: Position {
1100+ line: 0 ,
1101+ character: 21 ,
1102+ } ,
1103+ } ) ,
1104+ range_length: Some ( 0 ) ,
1105+ text: "" . to_string( ) ,
1106+ } ] ,
1107+ )
1108+ . await ?;
1109+
1110+ server. shutdown ( ) . await ?;
1111+ reader. abort ( ) ;
1112+
1113+ Ok ( ( ) )
1114+ }
0 commit comments