발행된 사이트가 전부 자동 생성·발송 대상이라, 테스트로 만든 업장까지 매일 알림을 받는다. 실측(2026-10-01): 발행 25곳 중 스테이,머뭄 5개·게으르게펜션 2개 등 중복·테스트 업장이 상당수였고, 수신자는 내부 계정 7명이었다. 시험 운영 중에는 받을 사람을 좁혀 둔다. - blog_jobs._for_auto_sweep: user_id 목록으로 거른다. **비면 전체**다 — 운영 기본값이라 칸이 비었다고 기능이 꺼지면 안 된다(쉼표만 있는 입력도 전체로 친다) - generate_drafts · send_reviewed 두 스윕에 **같이** 건다 — 한쪽만 걸면 만들어 놓고 안 보내거나 그 반대가 된다 ★★ 거르는 자리가 `_published_places()` 안이 아니다. 그 함수는 빌더의 [지금 생성하기] (`generate_range`·`generate_one_for_date`)도 쓰는데, 거기서 거르면 **목록 밖 사장님이 자기 화면에서 자기 글도 못 만든다** — 자동으로 보낼지와 직접 만들지는 다른 질문이다. 테스트가 그 두 함수의 소스에 `_for_auto_sweep` 이 없는지까지 본다. ★ 목록 밖 업장의 글은 건너뛸 뿐 **버리지 않는다** — REVIEWED 로 남아 목록을 풀면 그때 나간다. 거기서 SENT 로 찍으면 아무에게도 안 간 글이 보낸 것으로 기록된다. 테스트 5건 추가. blog 관련 78 passed Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
60 lines
2.5 KiB
Python
60 lines
2.5 KiB
Python
"""자동 스윕 수신자 제한 — `BLOG_AUTO_OWNER_IDS`.
|
|
|
|
★ 왜 있나: 발행된 사이트가 전부 자동 생성·발송 대상이라, 테스트로 만든 중복 업장까지
|
|
매일 알림을 받는다(실측 2026-10-01: 발행 25곳 중 상당수가 중복·테스트 업장).
|
|
★★ 거르는 자리가 중요하다. `_published_places()` 안에서 거르면 빌더의 [지금 생성하기] 도
|
|
같이 막혀 **목록 밖 사장님이 자기 글도 못 만든다** — 자동으로 보낼지와 직접 만들지는
|
|
다른 질문이다. 그래서 두 스윕에서만 거른다.
|
|
"""
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from services import blog_jobs
|
|
|
|
A = "11111111-1111-1111-1111-111111111111"
|
|
B = "22222222-2222-2222-2222-222222222222"
|
|
|
|
|
|
def _pair(user_id, place_name):
|
|
return (SimpleNamespace(place_id=f"place-{place_name}", name=place_name),
|
|
SimpleNamespace(user_id=user_id))
|
|
|
|
|
|
@pytest.fixture
|
|
def pairs():
|
|
return [_pair(A, "내 숙소"), _pair(B, "남의 숙소"), _pair(B, "테스트 중복")]
|
|
|
|
|
|
def test_비어_있으면_전체가_대상이다(monkeypatch, pairs):
|
|
"""★ 운영 기본값이다 — 칸이 비었다고 기능이 꺼지면 안 된다."""
|
|
monkeypatch.delenv("BLOG_AUTO_OWNER_IDS", raising=False)
|
|
assert blog_jobs._for_auto_sweep(pairs) == pairs
|
|
|
|
|
|
def test_목록에_있는_사장님만_남는다(monkeypatch, pairs):
|
|
monkeypatch.setenv("BLOG_AUTO_OWNER_IDS", A)
|
|
assert [p.name for p, _ in blog_jobs._for_auto_sweep(pairs)] == ["내 숙소"]
|
|
|
|
|
|
def test_쉼표로_여럿_공백은_무시한다(monkeypatch, pairs):
|
|
monkeypatch.setenv("BLOG_AUTO_OWNER_IDS", f" {A} , {B} ")
|
|
assert len(blog_jobs._for_auto_sweep(pairs)) == 3
|
|
|
|
|
|
def test_쉼표만_있으면_전체로_친다(monkeypatch, pairs):
|
|
"""빈 항목만 남는 입력을 '아무도 없음' 으로 읽으면 알림이 통째로 멎는다."""
|
|
monkeypatch.setenv("BLOG_AUTO_OWNER_IDS", " , , ")
|
|
assert blog_jobs._for_auto_sweep(pairs) == pairs
|
|
|
|
|
|
def test_수동_생성_경로는_이_목록을_보지_않는다():
|
|
"""★★ 목록 밖 사장님도 빌더에서 자기 글은 만들 수 있어야 한다.
|
|
`generate_range` · `generate_one_for_date` 가 `_for_auto_sweep` 을 부르면 안 된다."""
|
|
import inspect
|
|
|
|
for fn in (blog_jobs.generate_range, blog_jobs.generate_one_for_date):
|
|
assert "_for_auto_sweep" not in inspect.getsource(fn), (
|
|
f"{fn.__name__} 이 자동 스윕 목록을 본다 — 수동 생성까지 막힌다"
|
|
)
|