Files
Gnuboard7/plugins/_bundled/sirsoft-message_bizppurio/tests/scenarios/plugin-settings.yaml
T
HeuJung 0bccd867a7 chore(release): 7.0.9 출시 준비 — 출시일자 정렬·공개 배포물 정합 결함 정리
7.0.9 릴리즈 사전 점검에서 공개 배포물에 실릴 결함을 전수 정리한다.

출시일자: 이번 사이클에 버전이 오르거나 새로 추가된 대상 10건의 CHANGELOG
출시일을 실제 공개일로 정렬. 결제 3종은 직전 릴리즈 페이로드로 이미 나갔으므로
제외했다.

내부 역할 호칭: 공개 배포물 26파일 49곳을 중립 표현으로 치환. 이미 공개된
페이로드에는 실질 0건이라 이번 릴리즈가 첫 유입이었다.

최초 출시 규격: 신규 플러그인과 그 언어팩의 CHANGELOG 를 선례 규격으로
재구성. 작성 중 확인되지 않은 서술 2건은 코드 실측으로 교정했다.

번들 ja 언어팩: 번역 값에 남은 한글 40건 정정. 같은 용어가 세 갈래로 갈려
있던 표기도 함께 통일했다. 정정값의 근거는 저장소가 이미 갖고 있었다 —
테스트가 정답으로 단언하는 값과 배포물이 어긋난 상태였다.

재발 방지: 원인은 번역 생성기의 용어집 미등록이므로 출력만 고치면 다음
빌드에서 되살아난다. 용어집에 8건을 등록하고, 규정 3건과 잔존 검출 룰을
신설했다. 룰은 수정 전 배포물로 red 가 되는지를 픽스처로 고정해 판정기가
모집단에 닿는지를 증명한다.
2026-08-24 16:18:52 +09:00

115 lines
7.7 KiB
YAML

# audit:allow test-scenario-coverage reason: |
# 환경설정 화면의 입력·저장은 코어 /api/admin/plugins/{id}/settings 에 위임되는 자동바인딩
# 폼이라, axes cross product 의 UI 구조·검증·i18n effects 는 Vitest(plugin_settings.test.tsx)
# 정적 검증으로 가드된다. 검수 모드 off(운영) 조건부 검증 왕복(422/200)과 리포트 수신 주소
# 조회는 PHPUnit Feature(BizppurioLiveModeSettingsValidationTest·ReportUrlEndpointTest) 로
# 실제 HTTP 왕복을 관찰한다. (§529) 연결 확인 API 왕복(200/422 + result_code)은
# TokenCheckEndpointTest, 저장 시 토큰 캐시 무효화는 실제 훅 체인(core.plugin_settings.
# after_save) + 실제 CacheInterface 로 InvalidateTokenOnSettingsSaveListenerTest 가,
# verifyCredentials/describeFailure 는 BizppurioTokenServiceTest 가 각각 관찰한다.
# 런타임 Playwright spec 은 계획서 §9 방침에 따라 실연동 검증(직접 수행, 인증·발송
# 환경 필요) 단계에서 최초 도입하며, 그 시점에 @scenario/@effects docblock 완전 매핑을
# 추가한다. 그때까지 매니페스트는 명세로 유지한다.
feature: 비즈뿌리오 메시지 발송 환경설정 (Phase 1)
description: |
관리자 환경설정 화면(admin/plugin_settings.json)에서 비즈뿌리오 연동 정보를 입력·저장한다.
코어 플러그인 설정 인프라(/api/admin/plugins/{id}/settings)에 자동바인딩(_local.form)으로
위임하며, 상단 안내 패널 + 2 섹션(API 연동 / 발송 설정) + 리포트 수신 설정 카드로 구성된다.
핵심 동작:
- 검수 모드: is_test_mode Toggle (독립 카드). 켜짐=검수(dev) 도메인, 꺼짐=운영(live) 도메인
- API 연동: 비즈뿌리오 아이디 + 비즈뿌리오 모듈 비밀번호 + API 키
- 발송 설정: 발신번호 + 알림톡 발신프로필 키
- 검수 모드를 끄면(운영) 경고 박스를 표시하고, 저장 시 발송 필수 자격증명
(bizppurio_id/password/sender_number)을 required 로 강제(조건부 검증 필터 훅)
- 저장 실패 시 각 필드 하단에 인라인 에러 메시지 표시
- 리포트 수신 설정: 발송 결과 수신 주소를 사이트 도메인 기준 절대 URL 로 조회·복사
- 크리덴셜(password/api_key/sender_key)은 type=password 마스킹 + frontend_schema expose:false
- 저장은 hasChanges 없으면 비활성, 있으면 코어 설정 API 로 PUT
- 설치·활성화 시 권한 2개(view/manage)·잔액부족 알림 정의 생성 + 설정 초기값 로드
(관리자 메뉴는 추가하지 않음 — ⚑ 결정 3, 진입은 코어 소유 설정 페이지 하나)
- (§529) 저장 성공 시 인증 토큰 캐시를 무조건 무효화 — 비밀번호 변경 후 옛 자격증명으로
발급된 토큰이 만료(23h)까지 재사용되는 것을 방지
- (§529) "연결 확인" 버튼 — 비밀번호 필드와 분리된 독립 필드. 저장된 자격증명으로
캐시를 거치지 않고 즉시 `/v1/token` 재검증. hasChanges=true(미저장 변경 존재)면
API 호출 없이 "먼저 저장해주세요" toast 만 표시. 결과는 toast 로만 안내(상시 표시 없음)
※ 리포트 실제 수신 처리(POST /webhook)·알림톡 채널 기본 body 시드는 Phase 4~6 으로 이관.
axes:
credential_state: [empty, filled]
test_mode: [on, off]
field_kind: [credential, plain, readonly]
connection_check_result: [valid_credentials, invalid_credentials, unsaved_changes]
exclusions:
- { field_kind: readonly, credential_state: filled, reason: "리포트 수신 주소는 서버 조회 표시값 — 운영자 입력 대상 아님" }
- { connection_check_result: unsaved_changes, credential_state: empty, reason: "unsaved_changes 분기는 hasChanges 게이트만 검증 — 자격증명 값 자체는 무관(가드가 API 호출 자체를 막음)" }
effects:
# 섹션 구조
- info_panel_test_mode_api_sending_report_sections_present
- test_mode_card_has_is_test_mode_toggle
- test_mode_card_shows_separate_account_notice_always
- live_mode_warning_shown_when_test_mode_off
# 입력 필드
- five_input_fields_bound_by_name
- credential_fields_masked_as_password
- plain_fields_use_text_input
- inline_error_node_present_per_field
# 조건부 검증 (백엔드)
- test_mode_off_empty_credentials_return_422_for_bizppurio_id_password_sender_number
- test_mode_off_does_not_require_api_key_or_sender_key
- test_mode_on_empty_credentials_return_200
- test_mode_off_filled_credentials_return_200
- validation_error_messages_use_localized_field_labels
- test_mode_off_selects_live_domain_test_mode_on_selects_dev_domain
# 리포트 수신 설정
- report_url_endpoint_returns_absolute_url_from_app_url
- report_url_endpoint_requires_authentication
- report_section_shows_readonly_url_with_copy_button
# 저장
- save_button_disabled_without_changes
- save_puts_to_core_plugin_settings_api
- only_registered_handlers_used
# 연결 확인 + 저장 시 토큰 캐시 무효화 (§529)
- password_field_label_distinguishes_module_password_from_g7_login_password
- connection_check_field_is_separate_node_from_password_field
- connection_check_button_shows_plug_icon_idle_spinner_icon_loading
- connection_check_calls_token_check_api_only_when_no_unsaved_changes
- connection_check_shows_unsaved_changes_toast_without_api_call_when_has_changes
- connection_check_result_shown_via_toast_only_no_persistent_indicator
- token_check_endpoint_returns_200_on_valid_credentials
- token_check_endpoint_returns_422_with_bizppurio_reason_and_result_code_on_failure
- token_check_endpoint_requires_authentication_and_manage_permission
- settings_save_success_invalidates_token_cache_regardless_of_changed_fields
- settings_save_failure_does_not_invalidate_token_cache
- other_plugin_settings_save_does_not_invalidate_this_plugin_token_cache
# 탭 전환 (환경설정 ↔ 알림 템플릿 관리) — query.tab 변경 시 if 조건부 패널 재평가 필요
- tab_buttons_use_navigate_not_replaceurl # replaceUrl 은 URL만 바꿔 if 재평가 없음 → 화면 미전환 회귀
# 구 '알림톡 템플릿'(kapi 실시간 목록 조회) 탭의 오류 배너 effect 는 제거했다 — 그 화면 자체가
# #597 §3.5 에서 DB 기반 라이프사이클로 대체돼 사라졌고, 남겨 두면 존재하지 않는 화면을
# 서술하는 계약이 된다. 현 오류 표면화 계약은 bizppurio-template-lifecycle.yaml 이 소유한다.
# 다국어
- all_referenced_i18n_keys_exist_in_ko_and_en
# 설치·활성화 (백엔드)
- install_creates_view_and_manage_permissions
- activate_does_not_create_admin_menus # ⚑ 결정 3: 플러그인 메뉴 폐기, 진입은 설정 페이지 하나로 통일
- balance_low_notification_targets_admin
- settings_defaults_load_with_test_mode_on
test_files:
- plugins/_bundled/sirsoft-message_bizppurio/resources/js/__tests__/layouts/plugin_settings.test.tsx
- plugins/_bundled/sirsoft-message_bizppurio/tests/Feature/Settings/BizppurioLiveModeSettingsValidationTest.php
- plugins/_bundled/sirsoft-message_bizppurio/tests/Feature/Settings/ReportUrlEndpointTest.php
- plugins/_bundled/sirsoft-message_bizppurio/tests/Feature/Settings/TokenCheckEndpointTest.php
- plugins/_bundled/sirsoft-message_bizppurio/tests/Feature/Installation/InstallationTest.php
- plugins/_bundled/sirsoft-message_bizppurio/tests/Unit/Enums/EnumTest.php
- plugins/_bundled/sirsoft-message_bizppurio/tests/Unit/Listeners/InvalidateTokenOnSettingsSaveListenerTest.php
- plugins/_bundled/sirsoft-message_bizppurio/tests/Unit/Services/BizppurioTokenServiceTest.php
audit:
status: codified