test: hemar: +10 complex tests
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
-- Test file for hemar.jsonb_get_by_path function
|
-- Test file for hemar.jsonb_get_by_path function
|
||||||
-- Run with: psql -f test_jsonb_path.sql
|
-- Run with: psql -f test_jsonb_path.sql
|
||||||
|
|
||||||
@@ -107,7 +106,6 @@ BEGIN
|
|||||||
RAISE NOTICE 'Test %: Simple array access (path="%"): % | PASSED: %',
|
RAISE NOTICE 'Test %: Simple array access (path="%"): % | PASSED: %',
|
||||||
total_tests, current_path, result, passed;
|
total_tests, current_path, result, passed;
|
||||||
ELSE
|
ELSE
|
||||||
|
|
||||||
RAISE WARNING 'Test %: Simple array access (path="%"): % | PASSED: % (expected: "postgresql")',
|
RAISE WARNING 'Test %: Simple array access (path="%"): % | PASSED: % (expected: "postgresql")',
|
||||||
total_tests, current_path, result, passed;
|
total_tests, current_path, result, passed;
|
||||||
END IF;
|
END IF;
|
||||||
@@ -246,6 +244,241 @@ BEGIN
|
|||||||
total_tests, current_path, result, passed;
|
total_tests, current_path, result, passed;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
-- Additional complex test cases
|
||||||
|
|
||||||
|
-- Test 16: Deep nested object access
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_object(
|
||||||
|
'level1', jsonb_build_object(
|
||||||
|
'level2', jsonb_build_object(
|
||||||
|
'level3', jsonb_build_object(
|
||||||
|
'level4', jsonb_build_object(
|
||||||
|
'value', 'deep nested value'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
current_path := 'level1.level2.level3.level4.value';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '"deep nested value"'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Deep nested object access (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Deep nested object access (path="%"): % | PASSED: % (expected: "deep nested value")',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 17: Deep nested array access
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_array(
|
||||||
|
jsonb_build_array(
|
||||||
|
jsonb_build_array(
|
||||||
|
jsonb_build_array(
|
||||||
|
'nested array value'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
current_path := '[0][0][0][0]';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '"nested array value"'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Deep nested array access (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Deep nested array access (path="%"): % | PASSED: % (expected: "nested array value")',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 18: Complex mixed nesting (object -> array -> object -> array)
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_object(
|
||||||
|
'users', jsonb_build_array(
|
||||||
|
jsonb_build_object(
|
||||||
|
'name', 'Alice',
|
||||||
|
'permissions', jsonb_build_array('read', 'write', 'admin')
|
||||||
|
),
|
||||||
|
jsonb_build_object(
|
||||||
|
'name', 'Bob',
|
||||||
|
'permissions', jsonb_build_array('read', 'write')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
current_path := 'users[1].permissions[0]';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '"read"'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Complex mixed nesting (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Complex mixed nesting (path="%"): % | PASSED: % (expected: "read")',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 19: Array with mixed types
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_array(
|
||||||
|
'string',
|
||||||
|
42,
|
||||||
|
true,
|
||||||
|
jsonb_build_object('key', 'value'),
|
||||||
|
jsonb_build_array(1, 2, 3)
|
||||||
|
);
|
||||||
|
current_path := '[3].key';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '"value"'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Array with mixed types (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Array with mixed types (path="%"): % | PASSED: % (expected: "value")',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 20: Path with array at the end
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_object(
|
||||||
|
'data', jsonb_build_object(
|
||||||
|
'items', jsonb_build_array(10, 20, 30, 40)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
current_path := 'data.items[2]';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '30'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Path with array at the end (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Path with array at the end (path="%"): % | PASSED: % (expected: 30)',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 21: Numeric field names
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_object(
|
||||||
|
'123', 'numeric key',
|
||||||
|
'456', jsonb_build_object(
|
||||||
|
'789', 'nested numeric key'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
current_path := '456.789';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '"nested numeric key"'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Numeric field names (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Numeric field names (path="%"): % | PASSED: % (expected: "nested numeric key")',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 22: Special characters in field names
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_object(
|
||||||
|
'special@field', 'special value',
|
||||||
|
'nested', jsonb_build_object(
|
||||||
|
'field-with-hyphens', 'hyphenated value'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
current_path := 'nested.field-with-hyphens';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '"hyphenated value"'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Special characters in field names (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Special characters in field names (path="%"): % | PASSED: % (expected: "hyphenated value")',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 23: Array of arrays of arrays
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_array(
|
||||||
|
jsonb_build_array(
|
||||||
|
jsonb_build_array(1, 2),
|
||||||
|
jsonb_build_array(3, 4)
|
||||||
|
),
|
||||||
|
jsonb_build_array(
|
||||||
|
jsonb_build_array(5, 6),
|
||||||
|
jsonb_build_array(7, 8)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
current_path := '[1][0][1]';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '6'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Array of arrays of arrays (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Array of arrays of arrays (path="%"): % | PASSED: % (expected: 6)',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 24: Complex path with multiple array indices and object fields
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_object(
|
||||||
|
'companies', jsonb_build_array(
|
||||||
|
jsonb_build_object(
|
||||||
|
'name', 'Company A',
|
||||||
|
'departments', jsonb_build_array(
|
||||||
|
jsonb_build_object(
|
||||||
|
'name', 'Engineering',
|
||||||
|
'teams', jsonb_build_array(
|
||||||
|
jsonb_build_object(
|
||||||
|
'name', 'Backend',
|
||||||
|
'members', jsonb_build_array(
|
||||||
|
jsonb_build_object('name', 'John', 'role', 'Developer'),
|
||||||
|
jsonb_build_object('name', 'Jane', 'role', 'Lead')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
current_path := 'companies[0].departments[0].teams[0].members[1].role';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := result = '"Lead"'::jsonb;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Very complex path (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Very complex path (path="%"): % | PASSED: % (expected: "Lead")',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Test 25: Empty array and object edge cases
|
||||||
|
total_tests := total_tests + 1;
|
||||||
|
test_json := jsonb_build_object(
|
||||||
|
'emptyArray', jsonb_build_array(),
|
||||||
|
'emptyObject', jsonb_build_object(),
|
||||||
|
'arrayWithEmptyObject', jsonb_build_array(jsonb_build_object()),
|
||||||
|
'objectWithEmptyArray', jsonb_build_object('empty', jsonb_build_array())
|
||||||
|
);
|
||||||
|
current_path := 'objectWithEmptyArray.empty';
|
||||||
|
result := hemar.jsonb_get_by_path(test_json, current_path);
|
||||||
|
passed := jsonb_typeof(result) = 'array' AND jsonb_array_length(result) = 0;
|
||||||
|
passed_tests := passed_tests + (CASE WHEN passed THEN 1 ELSE 0 END);
|
||||||
|
IF passed THEN
|
||||||
|
RAISE NOTICE 'Test %: Empty array/object edge cases (path="%"): % | PASSED: %',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Test %: Empty array/object edge cases (path="%"): % | PASSED: % (expected: empty array)',
|
||||||
|
total_tests, current_path, result, passed;
|
||||||
|
END IF;
|
||||||
|
|
||||||
-- Print summary
|
-- Print summary
|
||||||
IF passed_tests = total_tests THEN
|
IF passed_tests = total_tests THEN
|
||||||
RAISE NOTICE '------------------------------------';
|
RAISE NOTICE '------------------------------------';
|
||||||
|
|||||||
Reference in New Issue
Block a user