diff --git a/addons/itsulu_blog_publisher/data/mail_template_data.xml b/addons/itsulu_blog_publisher/data/mail_template_data.xml
index ddb6148..23ab502 100644
--- a/addons/itsulu_blog_publisher/data/mail_template_data.xml
+++ b/addons/itsulu_blog_publisher/data/mail_template_data.xml
@@ -5,42 +5,42 @@
Title: ${object.blog_post_id.name} Blog: ${object.blog_post_id.blog_id.name} URL: https://itsulu.com${object.blog_post_id.website_url} Title: Blog: URL: https://itsulu.com ${social.twitter_post_a} ${social.twitter_post_b} ${social.bluesky_post_a} ${social.bluesky_post_b} ${social.mastodon_post} ${social.linkedin_post} Blog Post Published
-Social Media Posts — Ready to Post
-% for social in object.blog_post_id.itsulu_social_id:
-% if social.twitter_post_a:
+Twitter
-Twitter
-BlueSky
-BlueSky
-Mastodon
-LinkedIn
-
' + ('Generated content. ' * 30) + '
', + 'meta_title': 'Generated SEO Title', + 'meta_description': 'Generated meta description for the post.', + 'meta_keywords': 'ai, testing, blog', + 'tags': ['AI', 'Testing'], + 'social': { + 'twitter_a': 'Tweet A', 'twitter_b': 'Tweet B', + 'bluesky_a': 'BlueSky A', 'bluesky_b': 'BlueSky B', + 'mastodon': 'Mastodon post', 'linkedin': 'LinkedIn post', + }, + 'sources': [], + }) + + @when('the LLM router is called with a prompt') def when_llm_router_called(odoo_env, ctx): from odoo.addons.itsulu_blog_publisher.services.llm_router import LLMRouter - mock_resp = MagicMock(text='Generated
', tokens_used=500) + # The router parses provider_response.text as JSON, so the mock must + # return a valid JSON blob with all required fields — not raw HTML. + mock_resp = MagicMock(text=_valid_llm_json(), tokens_used=500) provider_map = { 'anthropic': 'odoo.addons.itsulu_blog_publisher.services.anthropic_provider.AnthropicProvider.generate', @@ -243,10 +264,11 @@ def when_llm_router_called(odoo_env, ctx): try: if patch_target: with patch(patch_target, return_value=mock_resp) as mock_gen: - router = LLMRouter(odoo_env, provider=provider, model=ctx.get('model', '')) - result = router.generate(topic='Write a blog post') - ctx['result'] = result + # Record the mock before generate() so assertions can see it + # even if generate() raises. ctx['mock_generate'] = mock_gen + router = LLMRouter(odoo_env, provider=provider, model=ctx.get('model', '')) + ctx['result'] = router.generate(topic='Write a blog post') else: router = LLMRouter(odoo_env, provider=provider, model=ctx.get('model', '')) ctx['result'] = router.generate(topic='Write a blog post')