부록 B. 테스트 근거¶
B.1 현재 확인한 결과¶
| 실행일 | 대상 | 명령 또는 절차 | 관찰 결과 | 상태 |
|---|---|---|---|---|
| 2026-07-18 UTC | 최종 자동 테스트 | uv run pytest -q |
224 tests, 346 subtests PASS | PASS |
| 2026-07-16 | 테스트 인프라 재현 | README의 테스트 전용 Compose 준비·전체 테스트·정리 절차 | loopback 전용 DB·Redis에서 170 tests, 217 subtests PASS; 별도 프로젝트·볼륨 정리 확인 | PASS |
| 2026-07-16 | 상품 이미지 지속성 | 깨끗한 Compose에서 유효 PNG 등록·미디어 GET·앱 재시작·재조회 | 등록 302, 미디어 HTTP 200 image/png, 재시작 후 파일·조회 유지 |
PASS |
| 2026-07-16 | DB 중단 준비 상태 | PostgreSQL 중단 뒤 3초 제한 /readyz/, 재시작 뒤 재요청 |
0.271초에 JSON 503, 복구 후 HTTP 200 | PASS |
| 2026-07-16 | 릴리스 표현 | RC1·RC2 본문과 태그 대상 확인 | GitHub Release 객체와 태그/SHA 불변 규칙을 구분하고 기존 태그 대상 유지 | PASS |
| 2026-07-16 | Django 설정 | python src/manage.py check |
PASS | PASS |
| 2026-07-16 | 운영 보안 설정 | python src/manage.py check --deploy --fail-level WARNING |
PASS | PASS |
| 2026-07-16 | 마이그레이션 일치 | python src/manage.py makemigrations --check --dry-run |
변경 없음 | PASS |
| 2026-07-16 | PostgreSQL 마이그레이션 | python src/manage.py migrate --noinput |
PASS | PASS |
| 2026-07-16 | 컨테이너 정의·빌드 | docker compose config --quiet, docker build --check ., 이미지 build |
PASS | PASS |
| 2026-07-16 | .env 없는 로컬 실행 |
.env 없이 Compose build·migrate·up -d --wait |
앱·PostgreSQL·Redis healthy | PASS |
| 2026-07-16 | 준비 상태 | Compose 실행 뒤 /readyz/ 요청 |
HTTP 200 | PASS |
| 2026-07-16 | 정적 채팅 자산 | Compose 실행 뒤 /static/chat/chat.js 요청 |
HTTP 200, Content-Type: text/javascript |
PASS |
| 2026-07-16 | 서비스 복구 | DB·Redis·앱 재시작 | 재시작 뒤 복구 확인 | PASS |
| 2026-07-16 | PostgreSQL 백업·복원 | PostgreSQL backup/restore | 복원 전후 users=1, products=1, migrations=24 일치 |
PASS |
| 2026-07-16 | 의존성 감사 | pytest 9.0.3 업그레이드 후 all-groups pip-audit |
취약 의존성 없음 | PASS |
| 2026-07-16 | 비밀값 | 고정 버전 gitleaks의 전체 Git 이력 검사 | 62 commits 검사, 누출 없음 | PASS |
| 2026-07-16 | Pages 배포 | GitHub Pages 배포 확인 | https://ratelxd.github.io/secure-coding/ 접근 가능 |
PASS |
| 2026-07-16 | 외부 터널 | ngrok | 도구를 사용할 수 없어 실행하지 않음 | 미검증 |
| 2026-07-23 UTC | PR #43 필수 CI | GitHub Actions run 30038923030 | governance-title, unit, integration-postgres-redis, security, migration, browser-a11y 6개 PASS | PASS |
| 2026-07-23 UTC | PR #44 필수 CI | GitHub Actions run 30039390145 | 위 필수 CI 6개 PASS; 재연결 한도 보정 포함 | PASS |
| 2026-07-24 | 로컬 WebSocket 수동 캡처 | 127.0.0.1:8000 재연결 화면 확인 시도 | 로컬 서버 미실행으로 실제 끊김·복구 캡처는 남기지 않음 | 미검증 |
B.2 과거 발견·수정 근거¶
아래 결과는 결함을 발견하고 수정했을 당시의 기록이며, 현재 실패 상태를 뜻하지 않습니다.
| 실행일 | 대상 | 당시 관찰 결과 | 후속 확인 |
|---|---|---|---|
| 2026-07-16 | 채팅 수락 PostgreSQL 독립 테스트 | nullable join과 행 잠금 조합으로 3 errors | 잠금·Origin·휴면 수신 집중 회귀 PASS |
| 2026-07-16 | WebSocket 정확 Origin 독립 테스트 | Host userinfo 검증 누락으로 FAIL | 집중 회귀 PASS |
| 2026-07-16 | 1차 통합 스위트 | 당시 pytest -q가 154 tests, 210 subtests PASS |
당시 수정본의 회귀 근거; 이후 기준 170 tests, 217 subtests를 거쳐 현재 224 tests, 346 subtests는 B.1에 기록 |
| 2026-07-16 | 정식 릴리스 v0.1.0 README 테스트 절차 |
기본 Compose 실행 뒤 문서의 127.0.0.1:5432 연결이 거부됨 |
issue #20 기록; 테스트 오버레이와 구성 회귀 테스트 추가 후 전체 테스트 PASS |
| 2026-07-16 | 정식 릴리스 상품 이미지 등록 | 유효 PNG 제출이 /app/media 권한 오류로 HTTP 500 |
issue #21 기록; 앱 소유 디렉터리·영속 볼륨 추가 후 등록·재시작 회귀 PASS |
| 2026-07-16 | 정식 릴리스 DB 중단 준비 상태 | /readyz/가 JSON 503 대신 3초 제한 시간 초과 |
issue #22 기록; 제한된 해석과 다중 주소 단일 쿼리로 수정 후 0.271초 503·복구 200 |
| 2026-07-16 | 릴리스 불변성 표현 | GitHub API는 immutable=false인데 본문은 “불변 후보”로 표기 |
issue #23 기록; 태그/SHA 규칙과 Release 객체 상태를 구분하도록 본문 수정 |
B.3 자동화·운영 확인 상태¶
| 영역 | 확인 내용 | 상태 |
|---|---|---|
| 사용자 | 회원가입·로그인, 일반 오류, 비밀번호 저장·로그, CSRF, 타인 변경 거부, 제한 경합 | PASS |
| 상품 | 가격 경계, 소유자 CRUD, 공개 여부, 재인코딩·메타데이터·우회 입력 | PASS |
| 채팅 | 인증·Origin·참여자, 재전송 충돌, 속도, Redis 장애·이력 동기화, 휴면 수신 차단 | PASS |
| 신고·제재 | 필수 사유, 자기 신고, 동시 임계값, 단일 감사, 정확한 만료 | PASS |
| 배포·복구 | .env 없는 Compose, 준비 상태, 정적 자산, 재시작, PostgreSQL 백업·복원 |
PASS |
| 실제 프록시·TLS | 배포 환경의 종단 프록시와 TLS | 미검증 |
| ngrok 외부 터널 | 터널을 통한 외부 접속 | 미검증(도구 사용 불가) |
| Windows 로컬 G6R-2 자산 해시 | DJANGO_SECRET_KEY=... python -m unittest tests.governance.test_stitch_manifest -v |
5건 실패; core.autocrlf=true로 작업 트리의 텍스트/SVG 줄바꿈이 Git 기준 바이트와 달라 발생. Git 기준 SHA와 manifest는 일치하며 Linux CI 기준 검증 대상 |
B.4 상품 권위 구현 검증 근거¶
아래 항목은 2026-07-18 UTC에 동일 작업 트리의 PostgreSQL·Redis 테스트 환경에서 실행했습니다. 집중 스위트 53건, 전체 pytest 224건과 하위 사례 346건, 데스크톱 브라우저 2건, 거버넌스 55건이 통과했고 마이그레이션 변경이 없음을 확인했습니다.
| Test-ID | 대상 | 실행 절차 | 확인한 불변식 | 현재 상태 |
|---|---|---|---|---|
G7A-CAT-MIG-001 |
legacy image·SOLD·region forward/reverse | tests/integration/test_catalog_authority_migration.py 집중 실행 |
source/destination byte·SHA-256 일치와 key 분리, LEGACY_SOLD 1:1, NULL→LEGACY_UNSET, 안전한 reverse 뒤 source와 외부 copy byte 보존 |
PASS |
G7A-CAT-BOUNDARY-001~002 |
gallery 0/1/4/5와 저장 수명주기 | gallery boundary/lifecycle 집중 실행 | 0·1·4장 순서·checksum 저장, 5장과 rollback 잔여 파일 0, promotion·삭제 실패의 재시도 근거 보존 | PASS |
G7A-CAT-PROJECTOR-001~003 |
Trade 읽기 권위 | tests/unit/accounts_catalog/test_catalog_authority.py 집중 실행 |
호환 sale_state 무시, typed completed만 SOLD, timezone-aware DB 경계 시각 입력 필수 |
PASS |
G7A-CAT-GUARD-001~004 |
direct write·old-app·shared key | tests/security/catalog/test_authority_guards.py 집중 실행 |
sale_state/legacy image UPDATE와 hard DELETE 거부, 정확한 trigger 식별, shared key 직접 쓰기 거부 |
PASS |
G7A-CAT-AUTHZ-001 |
기존 인증·소유권·지역 경계 | gallery 집중 테스트와 catalog HTTP 회귀 실행 | 비인증 생성 0, 소유권·CSRF 유지, 지역 생략·정확 선택·잘못된 코드 fail-closed | PASS |
G7A-CAT-BROWSER-001 |
실제 로컬 catalog 브라우저 권위 | 명시 포트의 credential-free http://127.0.0.1:<port>에서 npx playwright test |
기존 서버 재사용 없이 네 장의 순서·서로 다른 이미지, 양의 natural dimension, same-origin 응답, axe·overflow·모바일/데스크톱 캡처 | PASS |
실행 기록에는 대상 SHA, migration leaf, PostgreSQL/Python 버전, 시작·종료 UTC, 명령, 실제 row/count/checksum, 실패 분류를 함께 남깁니다.
B.5 보고서용 캡처 원칙¶
- 보고서에서는 자동화 결과와 운영 확인을 위 표에 기록된 명령과 관찰 결과를 근거로 인용합니다.
- 캡처에는 사용자 실명, 비밀번호, 세션, 토큰, 로컬 절대 경로를 포함하지 않습니다.
- 구현하지 않은 다음 단계 기능의 화면·캡처는 이 1차 근거에 포함하지 않습니다.