#!/bin/bash # LOG376 の試験:ダミーの X・LinkedIn(mock.py)と、GitHub の代わりの bare リポジトリで、sns_autopost.py を動かす set -u S=$(cd "$(dirname "$0")" && pwd); cd "$S" python3 mock.py 8765 & MOCK=$!; sleep 1 rm -rf t remote.git log.txt; git clone -q --bare /home/claude/r2r2r-content remote.git; git clone -q remote.git t python3 - <<'PY' import json src=json.load(open('t/sns/LOG375_sns_posts.json')); src['meta']['url']='http://127.0.0.1:8765/article' json.dump(src,open('t/sns/TEST_sns_posts.json','w'),ensure_ascii=False) json.dump({'posts':[ {'id':'T-x','source':'sns/TEST_sns_posts.json','platform':'x','post_at':'2026-10-24T21:00:00+09:00'}, {'id':'T-li','source':'sns/TEST_sns_posts.json','platform':'linkedin','post_at':'2026-10-24T21:05:00+09:00'}, {'id':'T-old','source':'sns/TEST_sns_posts.json','platform':'x','post_at':'2026-10-23T05:00:00+09:00'}, {'id':'T-future','source':'sns/TEST_sns_posts.json','platform':'x','post_at':'2026-10-26T08:00:00+09:00'}]},open('t/sns/schedule.json','w'),ensure_ascii=False) json.dump({},open('t/sns/posted.json','w')) PY cd t; git -c user.name=t -c user.email=t@t add sns; git -c user.name=t -c user.email=t@t commit -qm test; git push -q origin HEAD export X_API_BASE=http://127.0.0.1:8765 LINKEDIN_API_BASE=http://127.0.0.1:8765 X_API_KEY=k X_API_SECRET=s X_ACCESS_TOKEN=t X_ACCESS_SECRET=ts LINKEDIN_ACCESS_TOKEN=lt AUTOPOST_GIT=1 GIT_AUTHOR_NAME=a GIT_AUTHOR_EMAIL=a@a GIT_COMMITTER_NAME=a GIT_COMMITTER_EMAIL=a@a export AUTOPOST_NOW=2026-10-24T21:40:00+09:00 echo "== 1. 試し(送らない)"; python3 tools/sns_autopost.py run --dry-run | grep '^\[' echo "== 2. 投稿する"; python3 tools/sns_autopost.py run; echo "exit=$?" echo "== 3. もう一度動かす(二重投稿しないか)"; python3 tools/sns_autopost.py run; echo "exit=$?" echo "== posted.json"; cat sns/posted.json echo "== GitHub の代わりの置き場に残った記録"; git --git-dir=../remote.git log --format='%s' | head -7 echo "== ダミーのサーバーが受け取ったもの"; cat ../log.txt export AUTOPOST_NOW=2026-10-26T08:10:00+09:00 python3 - <<'PY' import json;p='sns/TEST_sns_posts.json';d=json.load(open(p));d['posts']['x']='FAIL test';json.dump(d,open(p,'w'),ensure_ascii=False) PY echo "== 4. X に断られたとき(403)"; python3 tools/sns_autopost.py run; echo "exit=$?"; python3 -c "import json;print(json.load(open('sns/posted.json'))['T-future'])" python3 - <<'PY' import json;p='sns/schedule.json';d=json.load(open(p));d['posts'].append({'id':'T-lock','source':'sns/TEST_sns_posts.json','platform':'x','post_at':'2026-10-26T08:00:00+09:00'});json.dump(d,open(p,'w'),ensure_ascii=False) PY printf '#!/bin/sh\nexit 1\n' > ../remote.git/hooks/pre-receive; chmod +x ../remote.git/hooks/pre-receive; : > ../log.txt echo "== 5. 記録の push が断られたとき"; python3 tools/sns_autopost.py run; echo "exit=$?"; echo "ダミーのサーバーへの送信: $(wc -l < ../log.txt) 回" rm ../remote.git/hooks/pre-receive python3 - <<'PY' import json;p='sns/schedule.json';d=json.load(open(p));d['posts'].append({'id':'T-bad','source':'sns/nope.json','platform':'fb','post_at':'2026-10-26 08:00'});json.dump(d,open(p,'w'),ensure_ascii=False) PY echo "== 6. 予定表の書き方が間違っているとき"; python3 tools/sns_autopost.py check; echo "exit=$?" kill $MOCK