1- use pg_schema_cache:: Function ;
2-
31use crate :: {
42 builder:: CompletionBuilder , context:: CompletionContext , relevance:: CompletionRelevanceData ,
53 CompletionItem , CompletionItemKind ,
@@ -27,10 +25,9 @@ pub fn complete_functions(ctx: &CompletionContext, builder: &mut CompletionBuild
2725#[ cfg( test) ]
2826mod tests {
2927 use crate :: {
30- context:: CompletionContext ,
31- providers:: complete_functions,
28+ complete,
3229 test_helper:: { get_test_deps, get_test_params, CURSOR_POS } ,
33- CompletionItem ,
30+ CompletionItem , CompletionItemKind ,
3431 } ;
3532
3633 #[ tokio:: test]
@@ -49,19 +46,83 @@ mod tests {
4946
5047 let query = format ! ( "select coo{}" , CURSOR_POS ) ;
5148
52- let ( tree, cache, mut builder ) = get_test_deps ( setup, & query) . await ;
49+ let ( tree, cache) = get_test_deps ( setup, & query) . await ;
5350 let params = get_test_params ( & tree, & cache, & query) ;
54- let ctx = CompletionContext :: new ( & params) ;
51+ let results = complete ( params) ;
5552
56- complete_functions ( & ctx, & mut builder) ;
53+ let CompletionItem { label, .. } = results
54+ . into_iter ( )
55+ . next ( )
56+ . expect ( "Should return at least one completion item" ) ;
5757
58- let results = builder. finish ( ) ;
58+ assert_eq ! ( label, "cool" ) ;
59+ }
5960
60- let CompletionItem { label, .. } = results
61+ #[ tokio:: test]
62+ async fn prefers_fn_if_invocation ( ) {
63+ let setup = r#"
64+ create table coos (
65+ id serial primary key,
66+ name text
67+ );
68+
69+ create or replace function cool()
70+ returns trigger
71+ language plpgsql
72+ security invoker
73+ as $$
74+ begin
75+ raise exception 'dont matter';
76+ end;
77+ $$;
78+ "# ;
79+
80+ let query = format ! ( r#"select * from coo{}()"# , CURSOR_POS ) ;
81+
82+ let ( tree, cache) = get_test_deps ( setup, & query) . await ;
83+ let params = get_test_params ( & tree, & cache, & query) ;
84+ let results = complete ( params) ;
85+
86+ let CompletionItem { label, kind, .. } = results
87+ . into_iter ( )
88+ . next ( )
89+ . expect ( "Should return at least one completion item" ) ;
90+
91+ assert_eq ! ( label, "cool" ) ;
92+ assert_eq ! ( kind, CompletionItemKind :: Function ) ;
93+ }
94+
95+ #[ tokio:: test]
96+ async fn prefers_fn_in_select_clause ( ) {
97+ let setup = r#"
98+ create table coos (
99+ id serial primary key,
100+ name text
101+ );
102+
103+ create or replace function cool()
104+ returns trigger
105+ language plpgsql
106+ security invoker
107+ as $$
108+ begin
109+ raise exception 'dont matter';
110+ end;
111+ $$;
112+ "# ;
113+
114+ let query = format ! ( r#"select coo{}"# , CURSOR_POS ) ;
115+
116+ let ( tree, cache) = get_test_deps ( setup, & query) . await ;
117+ let params = get_test_params ( & tree, & cache, & query) ;
118+ let results = complete ( params) ;
119+
120+ let CompletionItem { label, kind, .. } = results
61121 . into_iter ( )
62122 . next ( )
63123 . expect ( "Should return at least one completion item" ) ;
64124
65125 assert_eq ! ( label, "cool" ) ;
126+ assert_eq ! ( kind, CompletionItemKind :: Function ) ;
66127 }
67128}
0 commit comments