oca-technical/odoo-bringout-oca-rest-framework-graphql_demo/graphql_demo/tests/test_graphene.py
2025-08-29 15:43:03 +02:00

70 lines
2.3 KiB
Python

# Copyright 2018 ACSONE SA/NV
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
import logging
from graphene.test import Client
from odoo.tests import TransactionCase
from ..schema import schema
class TestGraphene(TransactionCase):
@classmethod
def setUpClass(cls):
super(TestGraphene, cls).setUpClass()
cls.client = Client(schema)
# disable logging for the graphql executor because we are testing
# errors and OCA's test runner considers the two errors being logged
# as fatal
logging.getLogger("graphql.execution").setLevel(logging.CRITICAL)
def execute(self, query):
res = self.client.execute(query, context={"env": self.env})
if not res:
raise RuntimeError("GraphQL query returned no data")
if res.get("errors"):
raise RuntimeError(
"GraphQL query returned error: {}".format(repr(res["errors"]))
)
return res.get("data")
def test_query_all_partners(self):
expected_names = set(self.env["res.partner"].search([]).mapped("name"))
actual_names = {
r["name"] for r in self.execute(" {allPartners{ name } }")["allPartners"]
}
self.assertEqual(actual_names, expected_names)
def test_query_all_partners_companies_only(self):
expected_names = set(
self.env["res.partner"].search([("is_company", "=", True)]).mapped("name")
)
actual_names = {
r["name"]
for r in self.execute(" {allPartners(companiesOnly: true){ name } }")[
"allPartners"
]
}
self.assertEqual(actual_names, expected_names)
def test_error(self):
r = self.client.execute("{errorExample}", context={"env": self.env})
self.assertIn("UserError example", r["errors"][0]["message"])
def test_mutation(self):
mutation = """\
mutation{
createPartner(
name: "toto",
email: "toto@acsone.eu",
) {
name
}
}
"""
self.client.execute(mutation, context={"env": self.env})
self.assertEqual(
len(self.env["res.partner"].search([("name", "=", "toto")])), 1
)