-- ============================================================================= -- bibimbap dev seed — 리뷰/댓글(W3-2) 기능 테스트용 더미 상황 -- ============================================================================= -- 목적: 새로 추가된 게임 리뷰/댓글 기능을 실제로 테스트할 수 있는 더미 데이터. -- 1) 로그인 가능한 테스트 계정 1개 (직접 로그인 → 리뷰/댓글 작성 테스트용) -- 2) 표시되는 더미 게임 1개 (테스트 계정 소유) -- 3) 이미 등록된 더미 리뷰 5개 (각자 다른 더미 유저 — game당 user 1리뷰 제약 때문) -- + 보너스: 더미 댓글 3개 -- -- 멱등(idempotent): 같은 이메일/게임명 기준 NOT EXISTS 가드 → 재실행해도 중복 미생성. -- -- 적용 (가동중인 컨테이너): -- docker exec -i bibimbap-db psql -U bibimbap -d bibimbap -v ON_ERROR_STOP=1 < db/seed-dev.sql -- 적용 (호스트 psql, 포트 5433): -- PGPASSWORD=change_me_local_dev psql -h localhost -p 5433 -U bibimbap -d bibimbap -f db/seed-dev.sql -- -- 로그인 자격: tester@bibimbap.local / test1234! (provider='email') -- password_hash 는 UserController.hashPassword 와 동일 알고리즘으로 사전 생성: -- PBKDF2WithHmacSHA256 / 210000 iter / 256-bit key / 16-byte salt, -- 포맷 = pbkdf2_sha256$$$. -- -- 되돌리기 (이 더미만 정리): db/seed-dev-teardown.sql 참고. -- ============================================================================= SET search_path TO dev; DO $$ DECLARE v_tester_id bigint; v_game_id bigint; v_uid bigint; -- test1234! 의 사전 생성 해시 (위 알고리즘과 동일). c_pw_hash text := 'pbkdf2_sha256$210000$QJ5MV+dx3aECELuuh3ibIA==$/59CO6JWXXGXWW0hzqpnZwu89qirDozP0jlq3JzEwZw='; r RECORD; BEGIN -- ------------------------------------------------------------------------- -- 1) 로그인 테스트 계정 (users + email identity) -- ------------------------------------------------------------------------- SELECT id INTO v_tester_id FROM users WHERE canonical_email = 'tester@bibimbap.local' AND is_delete IS NOT TRUE LIMIT 1; IF v_tester_id IS NULL THEN INSERT INTO users (display_name, canonical_email, role, status) VALUES ('테스터', 'tester@bibimbap.local', 'USER', 'ACTIVE') RETURNING id INTO v_tester_id; END IF; IF NOT EXISTS ( SELECT 1 FROM user_auth_identities WHERE provider = 'email' AND provider_user_id = 'tester@bibimbap.local' AND is_delete IS NOT TRUE ) THEN INSERT INTO user_auth_identities (user_id, provider, provider_user_id, email, password_hash, display_name) VALUES (v_tester_id, 'email', 'tester@bibimbap.local', 'tester@bibimbap.local', c_pw_hash, '테스터'); END IF; -- ------------------------------------------------------------------------- -- 2) 더미 게임 (테스트 계정 소유, 목록/상세에 표시되도록 visible) -- webgl_path / thumbnail_url 은 NULL — game-detail.jsp 가 빈 src 로 안전 처리. -- ------------------------------------------------------------------------- SELECT id INTO v_game_id FROM games WHERE name = '테스트 게임 (더미)' AND is_delete IS NOT TRUE LIMIT 1; IF v_game_id IS NULL THEN INSERT INTO games (user_id, name, creator_note, is_visible, sort_order) VALUES ( v_tester_id, '테스트 게임 (더미)', '리뷰/댓글 기능 테스트용 더미 게임입니다. 자유롭게 리뷰와 댓글을 남겨보세요.', true, (SELECT COALESCE(MAX(sort_order), 0) + 1 FROM games WHERE is_delete IS NOT TRUE) ) RETURNING id INTO v_game_id; END IF; -- ------------------------------------------------------------------------- -- 3) 더미 리뷰어 5명 + 각자 리뷰 1건 (game당 user 1리뷰 unique 제약 충족) -- created_at 을 days_ago 만큼 과거로 스태거 → 목록(최신순) 정렬이 자연스럽게. -- ------------------------------------------------------------------------- FOR r IN SELECT * FROM (VALUES ('김플레이', 'reviewer1@bibimbap.local', 5, '그래픽이 깔끔하고 조작감이 좋아요. 가볍게 즐기기 딱 좋습니다. 추천!', 5), ('이도전', 'reviewer2@bibimbap.local', 4, '아이디어가 신선했습니다. 난이도 밸런스만 조금 더 다듬으면 완벽할 듯해요.', 4), ('박캐주얼', 'reviewer3@bibimbap.local', 3, '무난하게 즐길 만한 게임. 다만 후반부가 살짝 반복적으로 느껴졌어요.', 3), ('최열정', 'reviewer4@bibimbap.local', 5, '시간 가는 줄 모르고 플레이했네요. BGM이 특히 인상적이었습니다!', 2), ('정라이트', 'reviewer5@bibimbap.local', 2, '초반 튜토리얼이 불친절해서 적응이 조금 어려웠어요. 보완되면 좋겠습니다.', 1) ) AS t(nickname, email, rating, body, days_ago) LOOP SELECT id INTO v_uid FROM users WHERE canonical_email = r.email AND is_delete IS NOT TRUE LIMIT 1; IF v_uid IS NULL THEN INSERT INTO users (display_name, canonical_email, role, status) VALUES (r.nickname, r.email, 'USER', 'ACTIVE') RETURNING id INTO v_uid; END IF; IF NOT EXISTS ( SELECT 1 FROM game_reviews WHERE game_id = v_game_id AND user_id = v_uid AND is_delete IS NOT TRUE ) THEN INSERT INTO game_reviews (game_id, user_id, rating, body, created_at, updated_at) VALUES ( v_game_id, v_uid, r.rating, r.body, now() - make_interval(days => r.days_ago), now() - make_interval(days => r.days_ago) ); END IF; END LOOP; -- ------------------------------------------------------------------------- -- 보너스) 더미 댓글 3건 (리뷰어 유저 귀속, created_at ASC 정렬용 스태거) -- ------------------------------------------------------------------------- FOR r IN SELECT * FROM (VALUES ('reviewer1@bibimbap.local', '오 이거 재밌네요 ㅎㅎ', 3), ('reviewer3@bibimbap.local', '다음 업데이트도 기대할게요!', 2), ('reviewer5@bibimbap.local', '버그 제보: 가끔 화면이 멈춰요.', 1) ) AS t(email, content, days_ago) LOOP SELECT id INTO v_uid FROM users WHERE canonical_email = r.email AND is_delete IS NOT TRUE LIMIT 1; IF v_uid IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM game_comments WHERE game_id = v_game_id AND user_id = v_uid AND content = r.content AND is_delete IS NOT TRUE ) THEN INSERT INTO game_comments (game_id, user_id, nickname, content, created_at) VALUES ( v_game_id, v_uid, (SELECT display_name FROM users WHERE id = v_uid), r.content, now() - make_interval(days => r.days_ago) ); END IF; END LOOP; RAISE NOTICE 'seed-dev 완료: tester_id=%, game_id=%', v_tester_id, v_game_id; END $$; -- 적용 결과 확인용 요약 (psql 실행 시 출력). SELECT (SELECT count(*) FROM users WHERE canonical_email LIKE '%@bibimbap.local' AND is_delete IS NOT TRUE) AS dummy_users, (SELECT count(*) FROM games WHERE name = '테스트 게임 (더미)' AND is_delete IS NOT TRUE) AS dummy_games, (SELECT count(*) FROM game_reviews r JOIN games g ON g.id = r.game_id WHERE g.name = '테스트 게임 (더미)' AND r.is_delete IS NOT TRUE) AS dummy_reviews, (SELECT count(*) FROM game_comments c JOIN games g ON g.id = c.game_id WHERE g.name = '테스트 게임 (더미)' AND c.is_delete IS NOT TRUE) AS dummy_comments;