7.0.9 릴리즈 사전 점검에서 공개 배포물에 실릴 결함을 전수 정리한다. 출시일자: 이번 사이클에 버전이 오르거나 새로 추가된 대상 10건의 CHANGELOG 출시일을 실제 공개일로 정렬. 결제 3종은 직전 릴리즈 페이로드로 이미 나갔으므로 제외했다. 내부 역할 호칭: 공개 배포물 26파일 49곳을 중립 표현으로 치환. 이미 공개된 페이로드에는 실질 0건이라 이번 릴리즈가 첫 유입이었다. 최초 출시 규격: 신규 플러그인과 그 언어팩의 CHANGELOG 를 선례 규격으로 재구성. 작성 중 확인되지 않은 서술 2건은 코드 실측으로 교정했다. 번들 ja 언어팩: 번역 값에 남은 한글 40건 정정. 같은 용어가 세 갈래로 갈려 있던 표기도 함께 통일했다. 정정값의 근거는 저장소가 이미 갖고 있었다 — 테스트가 정답으로 단언하는 값과 배포물이 어긋난 상태였다. 재발 방지: 원인은 번역 생성기의 용어집 미등록이므로 출력만 고치면 다음 빌드에서 되살아난다. 용어집에 8건을 등록하고, 규정 3건과 잔존 검출 룰을 신설했다. 룰은 수정 전 배포물로 red 가 되는지를 픽스처로 고정해 판정기가 모집단에 닿는지를 증명한다.
115 lines
7.7 KiB
YAML
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
|