Skip to content

Commit 9f48201

Browse files
committed
fix(tests): address code review recommendations from Phase 1
Addresses all 5 non-blocking issues identified in code review: 1. Remove dead code warning in comparison_tests.rs - Removed unused fetch_text_column function 2. SQL injection fix in config_tests.rs - Refactored search_config_exists to use parameterized queries - Added proper type cast for eql_v2_configuration_state parameter - Removed unused Row import 3. Improve fixture documentation - Added SQL line references to encryptindex_tables.sql fixture - Format: "Converted from src/encryptindex/functions_test.sql lines 10-17" 4. Add assertion counts to test function comments - config_tests.rs: 6+9+6+3+2+4+11 = 41 assertions - encryptindex_tests.rs: 7+4+6+4+8+5+7 = 41 assertions - operator_class_tests.rs: 1+3+37 = 41 assertions - Total: 123 assertions across Phase 1 5. Standardize error assertion format - Converted single-line error assertions to multi-line pattern - Applied to configuration_constraint_validation test All tests pass. No compiler warnings.
1 parent 351845c commit 9f48201

File tree

5 files changed

+45
-47
lines changed

5 files changed

+45
-47
lines changed

tests/sqlx/fixtures/encryptindex_tables.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
-- Fixture for encryptindex tests
2+
-- Converted from src/encryptindex/functions_test.sql lines 10-17
23
-- Referenced by: tests/sqlx/tests/encryptindex_tests.rs
34
--
45
-- Creates a users table with plaintext columns for testing encrypted column

tests/sqlx/tests/comparison_tests.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,6 @@ async fn get_ore_encrypted_as_jsonb(pool: &PgPool, id: i32) -> Result<String> {
3131
result.with_context(|| format!("ore table returned NULL for id={}", id))
3232
}
3333

34-
/// Helper to fetch a single text column from a SQL query
35-
async fn fetch_text_column(pool: &PgPool, sql: &str) -> Result<String> {
36-
let row = sqlx::query(sql)
37-
.fetch_one(pool)
38-
.await
39-
.with_context(|| format!("executing query: {}", sql))?;
40-
41-
let result: Option<String> = row
42-
.try_get(0)
43-
.with_context(|| "extracting text column")?;
44-
45-
result.with_context(|| "query returned NULL")
46-
}
4734

4835
/// Helper to execute create_encrypted_json SQL function
4936
#[allow(dead_code)]

tests/sqlx/tests/config_tests.rs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//! Tests EQL configuration add/remove operations and state management
55
66
use anyhow::{Context, Result};
7-
use sqlx::{PgPool, Row};
7+
use sqlx::PgPool;
88

99
/// Helper to check if search config exists
1010
/// Replicates _search_config_exists SQL function from lines 25-33
@@ -15,26 +15,27 @@ async fn search_config_exists(
1515
index_name: &str,
1616
state: &str,
1717
) -> Result<bool> {
18-
let sql = format!(
18+
let exists: bool = sqlx::query_scalar(
1919
"SELECT EXISTS (
2020
SELECT id FROM eql_v2_configuration c
21-
WHERE c.state = '{}'
22-
AND c.data #> array['tables', '{}', '{}', 'indexes'] ? '{}'
23-
)",
24-
state, table_name, column_name, index_name
25-
);
26-
27-
let row = sqlx::query(&sql)
28-
.fetch_one(pool)
29-
.await
30-
.context("checking search config existence")?;
31-
32-
row.try_get(0).context("extracting exists result")
21+
WHERE c.state = $1::eql_v2_configuration_state
22+
AND c.data #> array['tables', $2, $3, 'indexes'] ? $4
23+
)"
24+
)
25+
.bind(state)
26+
.bind(table_name)
27+
.bind(column_name)
28+
.bind(index_name)
29+
.fetch_one(pool)
30+
.await
31+
.context("checking search config existence")?;
32+
33+
Ok(exists)
3334
}
3435

3536
#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))]
3637
async fn add_and_remove_multiple_indexes(pool: PgPool) -> Result<()> {
37-
// Test: Add and remove multiple indexes
38+
// Test: Add and remove multiple indexes (6 assertions)
3839
// Original SQL lines 42-67 in src/config/config_test.sql
3940

4041
// Truncate config
@@ -106,7 +107,7 @@ async fn add_and_remove_multiple_indexes(pool: PgPool) -> Result<()> {
106107

107108
#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))]
108109
async fn add_and_remove_indexes_from_multiple_tables(pool: PgPool) -> Result<()> {
109-
// Test: Add/remove indexes from multiple tables
110+
// Test: Add/remove indexes from multiple tables (9 assertions)
110111
// Original SQL lines 78-116 in src/config/config_test.sql
111112

112113
sqlx::query("TRUNCATE TABLE eql_v2_configuration")
@@ -208,7 +209,7 @@ async fn add_and_remove_indexes_from_multiple_tables(pool: PgPool) -> Result<()>
208209

209210
#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))]
210211
async fn add_and_modify_index(pool: PgPool) -> Result<()> {
211-
// Test: Add and modify index
212+
// Test: Add and modify index (6 assertions)
212213
// Original SQL lines 128-150 in src/config/config_test.sql
213214

214215
// Add match index
@@ -288,7 +289,7 @@ async fn add_and_modify_index(pool: PgPool) -> Result<()> {
288289

289290
#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))]
290291
async fn add_index_with_existing_active_config(pool: PgPool) -> Result<()> {
291-
// Test: Adding index creates new pending configuration when active config exists
292+
// Test: Adding index creates new pending configuration when active config exists (3 assertions)
292293
// Original SQL lines 157-196 in src/config/config_test.sql
293294

294295
sqlx::query("TRUNCATE TABLE eql_v2_configuration")
@@ -349,7 +350,7 @@ async fn add_index_with_existing_active_config(pool: PgPool) -> Result<()> {
349350

350351
#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))]
351352
async fn add_column_to_nonexistent_table_fails(pool: PgPool) -> Result<()> {
352-
// Test: Adding column to nonexistent table fails
353+
// Test: Adding column to nonexistent table fails (2 assertions)
353354
// Original SQL lines 204-215 in src/config/config_test.sql
354355

355356
sqlx::query("TRUNCATE TABLE eql_v2_configuration")
@@ -380,7 +381,7 @@ async fn add_column_to_nonexistent_table_fails(pool: PgPool) -> Result<()> {
380381

381382
#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))]
382383
async fn add_and_remove_column(pool: PgPool) -> Result<()> {
383-
// Test: Add and remove column
384+
// Test: Add and remove column (4 assertions)
384385
// Original SQL lines 223-248 in src/config/config_test.sql
385386

386387
sqlx::query("TRUNCATE TABLE eql_v2_configuration")
@@ -431,7 +432,7 @@ async fn add_and_remove_column(pool: PgPool) -> Result<()> {
431432

432433
#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))]
433434
async fn configuration_constraint_validation(pool: PgPool) -> Result<()> {
434-
// Test: Configuration constraint validation
435+
// Test: Configuration constraint validation (11 assertions)
435436
// Original SQL lines 259-334 in src/config/config_test.sql
436437

437438
sqlx::query("TRUNCATE TABLE eql_v2_configuration")
@@ -455,7 +456,10 @@ async fn configuration_constraint_validation(pool: PgPool) -> Result<()> {
455456
.execute(&pool)
456457
.await;
457458

458-
assert!(result1.is_err(), "insert without schema version should fail");
459+
assert!(
460+
result1.is_err(),
461+
"insert without schema version should fail"
462+
);
459463

460464
// Test 2: Empty tables - ALLOWED (config_check_tables only checks field exists, not emptiness)
461465
// Original SQL test expected failure, but constraints.sql line 58-67 shows empty tables {} is valid
@@ -478,7 +482,10 @@ async fn configuration_constraint_validation(pool: PgPool) -> Result<()> {
478482
.execute(&pool)
479483
.await;
480484

481-
assert!(result3.is_err(), "insert with invalid cast should fail");
485+
assert!(
486+
result3.is_err(),
487+
"insert with invalid cast should fail"
488+
);
482489

483490
// Test 4: Invalid index - should fail
484491
let result4 = sqlx::query(
@@ -500,7 +507,10 @@ async fn configuration_constraint_validation(pool: PgPool) -> Result<()> {
500507
.execute(&pool)
501508
.await;
502509

503-
assert!(result4.is_err(), "insert with invalid index should fail");
510+
assert!(
511+
result4.is_err(),
512+
"insert with invalid index should fail"
513+
);
504514

505515
// Verify no pending configuration was created
506516
let pending_exists: bool = sqlx::query_scalar(

tests/sqlx/tests/encryptindex_tests.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ async fn has_pending_column(pool: &PgPool, column_name: &str) -> Result<bool> {
4141

4242
#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))]
4343
async fn create_encrypted_columns_from_config(pool: PgPool) -> Result<()> {
44-
// Test: Create encrypted columns from configuration
44+
// Test: Create encrypted columns from configuration (7 assertions)
4545
// Original SQL lines 8-56 in src/encryptindex/functions_test.sql
4646
// Verifies: pending columns, target columns, create_encrypted_columns(),
4747
// rename_encrypted_columns(), and resulting column types
@@ -143,7 +143,7 @@ async fn create_encrypted_columns_from_config(pool: PgPool) -> Result<()> {
143143

144144
#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))]
145145
async fn create_multiple_encrypted_columns(pool: PgPool) -> Result<()> {
146-
// Test: Create multiple encrypted columns from configuration
146+
// Test: Create multiple encrypted columns from configuration (4 assertions)
147147
// Original SQL lines 63-119 in src/encryptindex/functions_test.sql
148148
// Verifies: multiple columns with different indexes
149149

@@ -218,7 +218,7 @@ async fn create_multiple_encrypted_columns(pool: PgPool) -> Result<()> {
218218

219219
#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))]
220220
async fn select_pending_columns(pool: PgPool) -> Result<()> {
221-
// Test: select_pending_columns() returns correct columns
221+
// Test: select_pending_columns() returns correct columns (6 assertions)
222222
// Original SQL lines 127-148 in src/encryptindex/functions_test.sql
223223

224224
// Truncate config
@@ -299,7 +299,7 @@ async fn select_pending_columns(pool: PgPool) -> Result<()> {
299299

300300
#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))]
301301
async fn select_target_columns(pool: PgPool) -> Result<()> {
302-
// Test: select_target_columns() returns correct columns
302+
// Test: select_target_columns() returns correct columns (4 assertions)
303303
// Original SQL lines 156-177 in src/encryptindex/functions_test.sql
304304

305305
// Truncate config
@@ -363,7 +363,7 @@ async fn select_target_columns(pool: PgPool) -> Result<()> {
363363

364364
#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))]
365365
async fn activate_pending_config(pool: PgPool) -> Result<()> {
366-
// Test: activate_config() transitions encrypting -> active
366+
// Test: activate_config() transitions encrypting -> active (8 assertions)
367367
// Original SQL lines 185-224 in src/encryptindex/functions_test.sql
368368

369369
// Truncate config
@@ -455,7 +455,7 @@ async fn activate_pending_config(pool: PgPool) -> Result<()> {
455455

456456
#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))]
457457
async fn encrypted_column_index_generation(pool: PgPool) -> Result<()> {
458-
// Test: Encrypted columns are created with proper JSONB structure
458+
// Test: Encrypted columns are created with proper JSONB structure (5 assertions)
459459
// Original SQL lines 232-268 in src/encryptindex/functions_test.sql
460460
// Verifies: JSON structure has required 'i' (index metadata) field
461461

@@ -518,7 +518,7 @@ async fn encrypted_column_index_generation(pool: PgPool) -> Result<()> {
518518

519519
#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))]
520520
async fn handle_null_values_in_encrypted_columns(pool: PgPool) -> Result<()> {
521-
// Test: Exception raised when pending config exists but no migrate called
521+
// Test: Exception raised when pending config exists but no migrate called (7 assertions)
522522
// Original SQL lines 276-290 in src/encryptindex/functions_test.sql
523523

524524
// Truncate config

tests/sqlx/tests/operator_class_tests.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ async fn create_table_with_encrypted(pool: &PgPool) -> Result<()> {
2727

2828
#[sqlx::test]
2929
async fn group_by_encrypted_column(pool: PgPool) -> Result<()> {
30-
// Test: GROUP BY works with eql_v2_encrypted type
30+
// Test: GROUP BY works with eql_v2_encrypted type (1 assertion)
3131
// Original SQL lines 6-25 in src/operators/operator_class_test.sql
3232

3333
create_table_with_encrypted(&pool).await?;
@@ -63,7 +63,7 @@ async fn group_by_encrypted_column(pool: PgPool) -> Result<()> {
6363

6464
#[sqlx::test]
6565
async fn index_usage_with_explain_analyze(pool: PgPool) -> Result<()> {
66-
// Test: Operator class index usage patterns
66+
// Test: Operator class index usage patterns (3 assertions)
6767
// Original SQL lines 30-79 in src/operators/operator_class_test.sql
6868

6969
create_table_with_encrypted(&pool).await?;
@@ -106,7 +106,7 @@ async fn index_usage_with_explain_analyze(pool: PgPool) -> Result<()> {
106106

107107
#[sqlx::test]
108108
async fn index_behavior_with_different_data_types(pool: PgPool) -> Result<()> {
109-
// Test: Index behavior with various encrypted data types
109+
// Test: Index behavior with various encrypted data types (37 assertions)
110110
// Original SQL lines 86-237 in src/operators/operator_class_test.sql
111111

112112
create_table_with_encrypted(&pool).await?;

0 commit comments

Comments
 (0)