diff --git a/.github/actions/prepare-linkedin-release-post/prepare.py b/.github/actions/prepare-linkedin-release-post/prepare.py index 24df321..6561e3e 100644 --- a/.github/actions/prepare-linkedin-release-post/prepare.py +++ b/.github/actions/prepare-linkedin-release-post/prepare.py @@ -14,6 +14,8 @@ def truncate(value, limit): if len(value) <= limit: return value + if limit <= 3: + return value[:limit] return value[: limit - 3].rstrip() + "..." @@ -26,7 +28,7 @@ def truncate_little_text(value, limit): if len(escaped) <= limit: return escaped - available = limit - 3 + available = limit if limit <= 3 else limit - 3 result = [] length = 0 for character in value: @@ -35,7 +37,8 @@ def truncate_little_text(value, limit): break result.append(token) length += len(token) - return "".join(result).rstrip() + "..." + joined = "".join(result).rstrip() + return joined if limit <= 3 else f"{joined}..." def is_release_heading(value, tag): diff --git a/.github/workflows/publish-linkedin-release-shared.yml b/.github/workflows/publish-linkedin-release-shared.yml index 710877d..fe50931 100644 --- a/.github/workflows/publish-linkedin-release-shared.yml +++ b/.github/workflows/publish-linkedin-release-shared.yml @@ -48,8 +48,12 @@ jobs: runs-on: ubuntu-slim permissions: {} steps: + - id: check-token + env: + TELEGRAM_BOT_TOKEN: ${{ secrets.telegram-bot-token }} + run: echo "present=${TELEGRAM_BOT_TOKEN:+true}" >> "$GITHUB_OUTPUT" - name: Notify success - if: needs.publish.result == 'success' + if: needs.publish.result == 'success' && steps.check-token.outputs.present == 'true' uses: $/.github/actions/send-telegram-message with: message: >- @@ -58,7 +62,7 @@ jobs: telegram-bot-token: ${{ secrets.telegram-bot-token }} telegram-chat-id: ${{ inputs.telegram-chat-id }} - name: Notify failure - if: needs.publish.result == 'failure' + if: needs.publish.result == 'failure' && steps.check-token.outputs.present == 'true' uses: $/.github/actions/send-telegram-message with: message: >- diff --git a/test/test_linkedin_release.py b/test/test_linkedin_release.py index 93673cb..ca0bebb 100644 --- a/test/test_linkedin_release.py +++ b/test/test_linkedin_release.py @@ -115,6 +115,16 @@ def test_normalizes_and_deduplicates_repository_topics(self): "#GithubActions #CPlusPlus", ) + def test_truncate_never_exceeds_limit_for_small_limits(self): + for limit in range(4): + with self.subTest(limit=limit): + self.assertLessEqual(len(PREPARE.truncate("hello world", limit)), limit) + + def test_truncate_little_text_never_exceeds_limit_for_small_limits(self): + for limit in range(4): + with self.subTest(limit=limit): + self.assertLessEqual(len(PREPARE.truncate_little_text("hello #world", limit)), limit) + def test_truncates_body_and_preserves_release_url(self): self.release["body"] = "x" * 4000 @@ -270,15 +280,18 @@ def test_shared_workflow_notifies_telegram_when_chat_id_is_set(self): self.assertIn("needs.publish.result == 'success'", job["if"]) self.assertIn("needs.publish.result == 'failure'", job["if"]) self.assertEqual(job["permissions"], {}) - self.assertEqual( - [step["uses"] for step in job["steps"]], - ["$/.github/actions/send-telegram-message", "$/.github/actions/send-telegram-message"], - ) - for step in job["steps"]: + + check_token, notify_success, notify_failure = job["steps"] + self.assertEqual(check_token["id"], "check-token") + self.assertIn("secrets.telegram-bot-token", check_token["env"]["TELEGRAM_BOT_TOKEN"]) + + for step in (notify_success, notify_failure): + self.assertEqual(step["uses"], "$/.github/actions/send-telegram-message") + self.assertIn("steps.check-token.outputs.present == 'true'", step["if"]) self.assertEqual(step["with"]["telegram-bot-token"], "${{ secrets.telegram-bot-token }}") self.assertEqual(step["with"]["telegram-chat-id"], "${{ inputs.telegram-chat-id }}") - self.assertEqual(job["steps"][0]["if"], "needs.publish.result == 'success'") - self.assertEqual(job["steps"][1]["if"], "needs.publish.result == 'failure'") + self.assertIn("needs.publish.result == 'success'", notify_success["if"]) + self.assertIn("needs.publish.result == 'failure'", notify_failure["if"]) def test_baseline_caller_passes_token_explicitly(self): path = BASELINE_ROOT / ".github" / "workflows" / "publish-linkedin-release.yml"