From 5ed8c3e21d2a5db502cf0a6f73939b1d673084d8 Mon Sep 17 00:00:00 2001 From: seizeh Date: Sun, 26 Jul 2026 15:16:19 +0900 Subject: [PATCH] =?UTF-8?q?fix(test):=20=EA=B3=B5=EC=9A=A9=20=EC=8B=9C?= =?UTF-8?q?=EB=93=9C=EC=97=90=20care=5Fconfig=20=EC=8B=B1=EA=B8=80?= =?UTF-8?q?=ED=84=B4=20=EB=B3=B4=EC=9E=A5=20=E2=80=94=20t11=C2=B7t12=20CI?= =?UTF-8?q?=20=EC=8B=A4=ED=8C=A8=20=ED=95=B4=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pmdb main 은 2026-07-23 이후 db-tests 가 계속 빨간불이었다. 원인은 테스트도 함수도 아니고 **CI 환경에만 없는 행**이다. dump_schema.sh 는 구조만 덤프한다(데이터 제외). 그래서 CI 컨테이너의 app.care_config 는 0행이고, app.phone_hmac 의 `select hmac_key into v_key from app.care_config` 가 NULL 을 집는다 → extensions.hmac(digits, NULL, 'sha256') 이 NULL → create_care_report 가 번호를 못 읽었다며 invalid_phone(P0001) 을 던진다. · t11: 단언 2 가 죽고 3·4·6·7·8 이 연쇄 실패(케어 리포트가 안 만들어지므로) · t12: 아예 SQL 오류로 파일 중단 운영 DB 직행 검증(기존 관행)에서는 care_config 행이 이미 있어 통과하므로 CI 에서만 드러났다 — 운영 확인 결과 1행 존재, phone_hmac 정상. seed.sql 에 넣은 이유: care 기능을 쓰는 t11·t12 가 모두 이 시드를 포함하고, 앞으로 추가될 케어 테스트도 같은 함정을 밟는다. hmac_key 는 컬럼 기본값(랜덤 32바이트)에 맡긴다 — 발행·조회가 한 트랜잭션 안에서 끝나므로 키 값 자체는 무관하고 운영 키를 흉내 낼 이유도 없다. 이미 행이 있으면 no-op 이라 운영 직행 검증에도 영향이 없다. Co-Authored-By: Claude Opus 5 (1M context) --- supabase/tests/helpers/seed.sql | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/supabase/tests/helpers/seed.sql b/supabase/tests/helpers/seed.sql index 0d074eb..b9c46be 100644 --- a/supabase/tests/helpers/seed.sql +++ b/supabase/tests/helpers/seed.sql @@ -63,3 +63,18 @@ with p as ( returning id ) insert into seed select 'pet1', id from p; + +-- 케어 설정 싱글턴 — **CI 에서만 없는 행**이라 여기서 보장한다. +-- +-- dump_schema.sh 는 구조만 덤프하므로(데이터 제외) CI 컨테이너의 app.care_config +-- 는 0행이다. 그러면 app.phone_hmac 의 `select hmac_key into v_key` 가 NULL 을 +-- 집어 extensions.hmac(digits, NULL, 'sha256') 이 NULL 을 돌려주고, +-- create_care_report 가 번호를 못 읽었다며 invalid_phone 을 던진다 +-- (t11 단언 2·3·4·6·7·8 실패, t12 는 아예 SQL 오류로 중단). +-- 운영 DB 직행 검증에서는 행이 이미 있어 통과하므로 CI 에서만 드러났다. +-- +-- hmac_key 는 컬럼 기본값(랜덤 32바이트)에 맡긴다 — 테스트는 같은 트랜잭션 안에서 +-- 발행·조회를 모두 하므로 키 값 자체는 무관하고, 운영 키를 흉내 낼 이유도 없다. +-- 이미 행이 있으면(운영 직행 검증) 아무것도 하지 않는다. +insert into app.care_config (id) +select true where not exists (select 1 from app.care_config);