Skip to content

Commit 9ac55a5

Browse files
chore: move tests into individual files
1 parent b0b5bf5 commit 9ac55a5

File tree

4 files changed

+148
-182
lines changed

4 files changed

+148
-182
lines changed

crates/pg_completions/src/complete.rs

Lines changed: 0 additions & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -40,183 +40,3 @@ pub fn complete(params: CompletionParams) -> CompletionResult {
4040

4141
builder.finish()
4242
}
43-
44-
#[cfg(test)]
45-
mod tests {
46-
use pg_schema_cache::SchemaCache;
47-
use pg_test_utils::test_database::*;
48-
49-
use sqlx::Executor;
50-
51-
use crate::{complete, CompletionParams};
52-
53-
#[tokio::test]
54-
async fn autocompletes_simple_table() {
55-
let test_db = get_new_test_db().await;
56-
57-
let setup = r#"
58-
create table users (
59-
id serial primary key,
60-
name text,
61-
password text
62-
);
63-
"#;
64-
65-
test_db
66-
.execute(setup)
67-
.await
68-
.expect("Failed to execute setup query");
69-
70-
let input = "select * from u";
71-
72-
let mut parser = tree_sitter::Parser::new();
73-
parser
74-
.set_language(tree_sitter_sql::language())
75-
.expect("Error loading sql language");
76-
77-
let tree = parser.parse(input, None).unwrap();
78-
let schema_cache = SchemaCache::load(&test_db).await;
79-
80-
let p = CompletionParams {
81-
position: ((input.len() - 1) as u32).into(),
82-
schema: &schema_cache,
83-
text: input.into(),
84-
tree: Some(&tree),
85-
};
86-
87-
let result = complete(p);
88-
89-
assert!(!result.items.is_empty());
90-
91-
let best_match = &result.items[0];
92-
93-
assert_eq!(
94-
best_match.label, "users",
95-
"Does not return the expected table to autocomplete: {}",
96-
best_match.label
97-
)
98-
}
99-
100-
#[tokio::test]
101-
async fn autocompletes_table_alphanumerically() {
102-
let test_db = get_new_test_db().await;
103-
104-
let setup = r#"
105-
create table addresses (
106-
id serial primary key
107-
);
108-
109-
create table users (
110-
id serial primary key
111-
);
112-
113-
create table emails (
114-
id serial primary key
115-
);
116-
"#;
117-
118-
test_db
119-
.execute(setup)
120-
.await
121-
.expect("Failed to execute setup query");
122-
123-
let schema_cache = SchemaCache::load(&test_db).await;
124-
125-
let mut parser = tree_sitter::Parser::new();
126-
parser
127-
.set_language(tree_sitter_sql::language())
128-
.expect("Error loading sql language");
129-
130-
let test_cases = vec![
131-
("select * from us", "users"),
132-
("select * from em", "emails"),
133-
("select * from ", "addresses"),
134-
];
135-
136-
for (input, expected_label) in test_cases {
137-
let tree = parser.parse(input, None).unwrap();
138-
139-
let p = CompletionParams {
140-
position: ((input.len() - 1) as u32).into(),
141-
schema: &schema_cache,
142-
text: input.into(),
143-
tree: Some(&tree),
144-
};
145-
146-
let result = complete(p);
147-
148-
assert!(!result.items.is_empty());
149-
150-
let best_match = &result.items[0];
151-
152-
assert_eq!(
153-
best_match.label, expected_label,
154-
"Does not return the expected table to autocomplete: {}",
155-
best_match.label
156-
)
157-
}
158-
}
159-
160-
#[tokio::test]
161-
async fn autocompletes_table_with_schema() {
162-
let test_db = get_new_test_db().await;
163-
164-
let setup = r#"
165-
create schema customer_support;
166-
create schema private;
167-
168-
create table private.user_z (
169-
id serial primary key,
170-
name text,
171-
password text
172-
);
173-
174-
create table customer_support.user_y (
175-
id serial primary key,
176-
request text,
177-
send_at timestamp with time zone
178-
);
179-
"#;
180-
181-
test_db
182-
.execute(setup)
183-
.await
184-
.expect("Failed to execute setup query");
185-
186-
let schema_cache = SchemaCache::load(&test_db).await;
187-
188-
let mut parser = tree_sitter::Parser::new();
189-
parser
190-
.set_language(tree_sitter_sql::language())
191-
.expect("Error loading sql language");
192-
193-
let test_cases = vec![
194-
("select * from u", "user_y"), // user_y is preferred alphanumerically
195-
("select * from private.u", "user_z"),
196-
("select * from customer_support.u", "user_y"),
197-
];
198-
199-
for (input, expected_label) in test_cases {
200-
let tree = parser.parse(input, None).unwrap();
201-
202-
let p = CompletionParams {
203-
position: ((input.len() - 1) as u32).into(),
204-
schema: &schema_cache,
205-
text: input.into(),
206-
tree: Some(&tree),
207-
};
208-
209-
let result = complete(p);
210-
211-
assert!(!result.items.is_empty());
212-
213-
let best_match = &result.items[0];
214-
215-
assert_eq!(
216-
best_match.label, expected_label,
217-
"Does not return the expected table to autocomplete: {}",
218-
best_match.label
219-
)
220-
}
221-
}
222-
}

crates/pg_completions/src/providers/functions.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,38 @@ mod tests {
125125
assert_eq!(label, "cool");
126126
assert_eq!(kind, CompletionItemKind::Function);
127127
}
128+
129+
#[tokio::test]
130+
async fn prefers_function_in_from_clause_if_invocation() {
131+
let setup = r#"
132+
create table coos (
133+
id serial primary key,
134+
name text
135+
);
136+
137+
create or replace function cool()
138+
returns trigger
139+
language plpgsql
140+
security invoker
141+
as $$
142+
begin
143+
raise exception 'dont matter';
144+
end;
145+
$$;
146+
"#;
147+
148+
let query = format!(r#"select * from coo{}()"#, CURSOR_POS);
149+
150+
let (tree, cache) = get_test_deps(setup, &query).await;
151+
let params = get_test_params(&tree, &cache, &query);
152+
let results = complete(params);
153+
154+
let CompletionItem { label, kind, .. } = results
155+
.into_iter()
156+
.next()
157+
.expect("Should return at least one completion item");
158+
159+
assert_eq!(label, "cool");
160+
assert_eq!(kind, CompletionItemKind::Function);
161+
}
128162
}

crates/pg_completions/src/providers/tables.rs

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,117 @@ mod tests {
3232
CompletionItem, CompletionItemKind,
3333
};
3434

35+
#[tokio::test]
36+
async fn autocompletes_simple_table() {
37+
let setup = r#"
38+
create table users (
39+
id serial primary key,
40+
name text,
41+
password text
42+
);
43+
"#;
44+
45+
let query = format!("select * from u{}", CURSOR_POS);
46+
47+
let (tree, cache) = get_test_deps(setup, &query).await;
48+
let params = get_test_params(&tree, &cache, &query);
49+
let results = complete(params);
50+
51+
assert!(!results.items.is_empty());
52+
53+
let best_match = &results.items[0];
54+
55+
assert_eq!(
56+
best_match.label, "users",
57+
"Does not return the expected table to autocomplete: {}",
58+
best_match.label
59+
)
60+
}
61+
62+
#[tokio::test]
63+
async fn autocompletes_table_alphanumerically() {
64+
let setup = r#"
65+
create table addresses (
66+
id serial primary key
67+
);
68+
69+
create table users (
70+
id serial primary key
71+
);
72+
73+
create table emails (
74+
id serial primary key
75+
);
76+
"#;
77+
78+
let test_cases = vec![
79+
(format!("select * from us{}", CURSOR_POS), "users"),
80+
(format!("select * from em{}", CURSOR_POS), "emails"),
81+
(format!("select * from {}", CURSOR_POS), "addresses"),
82+
];
83+
84+
for (query, expected_label) in test_cases {
85+
let (tree, cache) = get_test_deps(setup, &query).await;
86+
let params = get_test_params(&tree, &cache, &query);
87+
let results = complete(params);
88+
89+
assert!(!results.items.is_empty());
90+
91+
let best_match = &results.items[0];
92+
93+
assert_eq!(
94+
best_match.label, expected_label,
95+
"Does not return the expected table to autocomplete: {}",
96+
best_match.label
97+
)
98+
}
99+
}
100+
101+
#[tokio::test]
102+
async fn autocompletes_table_with_schema() {
103+
let setup = r#"
104+
create schema customer_support;
105+
create schema private;
106+
107+
create table private.user_z (
108+
id serial primary key,
109+
name text,
110+
password text
111+
);
112+
113+
create table customer_support.user_y (
114+
id serial primary key,
115+
request text,
116+
send_at timestamp with time zone
117+
);
118+
"#;
119+
120+
let test_cases = vec![
121+
(format!("select * from u{}", CURSOR_POS), "user_y"), // user_y is preferred alphanumerically
122+
(format!("select * from private.u{}", CURSOR_POS), "user_z"),
123+
(
124+
format!("select * from customer_support.u{}", CURSOR_POS),
125+
"user_y",
126+
),
127+
];
128+
129+
for (query, expected_label) in test_cases {
130+
let (tree, cache) = get_test_deps(setup, &query).await;
131+
let params = get_test_params(&tree, &cache, &query);
132+
let results = complete(params);
133+
134+
assert!(!results.items.is_empty());
135+
136+
let best_match = &results.items[0];
137+
138+
assert_eq!(
139+
best_match.label, expected_label,
140+
"Does not return the expected table to autocomplete: {}",
141+
best_match.label
142+
)
143+
}
144+
}
145+
35146
#[tokio::test]
36147
async fn prefers_table_in_from_clause() {
37148
let setup = r#"
@@ -55,7 +166,6 @@ mod tests {
55166

56167
let (tree, cache) = get_test_deps(setup, &query).await;
57168
let params = get_test_params(&tree, &cache, &query);
58-
59169
let results = complete(params);
60170

61171
let CompletionItem { label, kind, .. } = results

crates/pg_completions/src/test_helper.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use sqlx::Executor;
44

55
use crate::CompletionParams;
66

7-
pub static CURSOR_POS: &str = "€";
7+
pub static CURSOR_POS: char = '€';
88

99
pub(crate) async fn get_test_deps(
1010
setup: &str,
@@ -37,6 +37,8 @@ pub(crate) fn get_test_params<'a>(
3737
let position = sql.find(CURSOR_POS).unwrap();
3838
let text = sql.replace(CURSOR_POS, "");
3939

40+
println!("position: {}", position);
41+
4042
CompletionParams {
4143
position: (position as u32).into(),
4244
schema: schema_cache,

0 commit comments

Comments
 (0)