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