如何用PgTap结合逻辑运算符测试Supabase行级策略?
解决PgTap测试OR组合条件的方法
你可以通过以下几种方式实现OR组合条件的测试:
方法1:用check()函数直接验证布尔表达式
PgTap的check()支持直接传入SQL布尔表达式,刚好能用来测试OR组合的约束逻辑:
验证所有可见行的合规性
SELECT check( NOT EXISTS ( SELECT 1 FROM posts WHERE (creator != tests.get_supabase_uid('test_owner') ->> 'id') AND (published != true) ), '所有可见帖子要么属于当前测试用户,要么已发布' );
验证单条特定帖子的合规性
-- 假设已插入测试帖子,用ID定位目标行 SELECT check( (SELECT (creator = tests.get_supabase_uid('test_owner') ->> 'id') OR (published = true) FROM posts WHERE id = 'test-post-uuid'), '该测试帖子满足创建者可见或已发布的条件' );
方法2:用ok()函数对比行数匹配情况
先算出符合OR条件的预期行数,再和当前用户实际能看到的行数对比:
WITH expected_count AS ( SELECT COUNT(*) AS num FROM posts WHERE (creator = tests.get_supabase_uid('test_owner') ->> 'id') OR (published = true) ), actual_count AS ( SELECT COUNT(*) AS num FROM posts ) SELECT ok( (SELECT num FROM expected_count) = (SELECT num FROM actual_count), '当前用户可见的帖子数量与预期符合OR条件的数量一致' );
方法3:用results_eq()精确对比结果集
如果需要验证可见的具体行完全匹配,可构造预期结果集和实际查询结果对比:
SELECT results_eq( 'SELECT * FROM posts', $$ SELECT * FROM posts WHERE (creator = tests.get_supabase_uid('test_owner') ->> 'id') OR (published = true) $$, '实际可见的帖子与满足OR条件的帖子完全一致' );
注意:tests.get_supabase_uid('test_owner')返回JSON对象,用->> 'id'获取字符串类型的UUID,避免类型不匹配问题。
内容的提问来源于stack exchange,提问作者JoJota
相关产品推荐
相关产品推荐

