fix: create Odoo env directly in BDD fixture; fix _generate_template call

- pytest-odoo 2.x provides no 'env' pytest fixture; env only exists as
  self.env in TransactionCase subclasses. Build the env from odoo.registry()
  directly in the odoo_env fixture and rollback after each BDD scenario.
- _generate_template() takes positional args (res_ids, render_fields),
  not keyword args; remove 'fields=' keyword from all call sites.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Nicholas Riegel 2026-05-30 02:51:33 -04:00
parent 9948c7aad6
commit 3281298f5e
2 changed files with 17 additions and 5 deletions

View file

@ -8,6 +8,8 @@ Links: blog_generation.feature, blog_scheduling.feature,
RED PHASE all scenarios FAIL until implementation exists. RED PHASE all scenarios FAIL until implementation exists.
""" """
import pytest import pytest
import odoo
from odoo.api import Environment
from unittest.mock import patch, MagicMock from unittest.mock import patch, MagicMock
from pytest_bdd import scenarios, given, when, then, parsers from pytest_bdd import scenarios, given, when, then, parsers
@ -25,8 +27,18 @@ scenarios('../features/notification_email.feature')
@pytest.fixture @pytest.fixture
def odoo_env(request): def odoo_env(request):
"""pytest-odoo's env fixture, re-exported for BDD step access.""" """Odoo environment for BDD step definitions.
return request.getfixturevalue('env')
pytest-odoo 2.x does not expose an 'env' pytest fixture env only
exists as self.env inside TransactionCase subclasses. We build one
directly from the registry and roll back after each scenario.
"""
db = request.config.getoption('--odoo-database')
registry = odoo.registry(db)
with registry.cursor() as cr:
env = Environment(cr, odoo.SUPERUSER_ID, {})
yield env
cr.rollback()
@pytest.fixture @pytest.fixture

View file

@ -254,7 +254,7 @@ class TestNotificationEmail(TransactionCase):
# ACT — render the template synchronously to check the subject # ACT — render the template synchronously to check the subject
template = self.env.ref('itsulu_blog_publisher.email_template_blog_published') template = self.env.ref('itsulu_blog_publisher.email_template_blog_published')
rendered = template._generate_template([log.id], fields=['subject']) rendered = template._generate_template([log.id], ['subject'])
# ASSERT # ASSERT
subject = rendered[log.id].get('subject', '') subject = rendered[log.id].get('subject', '')
@ -300,7 +300,7 @@ class TestNotificationEmail(TransactionCase):
# Verify template renders all platform copy in the body # Verify template renders all platform copy in the body
template = self.env.ref('itsulu_blog_publisher.email_template_blog_published') template = self.env.ref('itsulu_blog_publisher.email_template_blog_published')
rendered = template._generate_template([log.id], fields=['body_html']) rendered = template._generate_template([log.id], ['body_html'])
body = rendered[log.id].get('body_html', '') body = rendered[log.id].get('body_html', '')
self.assertIn('Twitter A copy', body, "Body must contain Twitter copy") self.assertIn('Twitter A copy', body, "Body must contain Twitter copy")
self.assertIn('LinkedIn copy', body, "Body must contain LinkedIn copy") self.assertIn('LinkedIn copy', body, "Body must contain LinkedIn copy")
@ -319,7 +319,7 @@ class TestNotificationEmail(TransactionCase):
# ASSERT — render the template synchronously to check the URL appears in the body # ASSERT — render the template synchronously to check the URL appears in the body
template = self.env.ref('itsulu_blog_publisher.email_template_blog_published') template = self.env.ref('itsulu_blog_publisher.email_template_blog_published')
rendered = template._generate_template([log.id], fields=['body_html']) rendered = template._generate_template([log.id], ['body_html'])
body = rendered[log.id].get('body_html', '') body = rendered[log.id].get('body_html', '')
self.assertIn('itsulu.com', body, "Body must contain itsulu.com URL") self.assertIn('itsulu.com', body, "Body must contain itsulu.com URL")