mirror of
https://gitlab.com/flectra-community/mis-builder.git
synced 2024-11-16 19:22:04 +00:00
316 lines
12 KiB
Python
316 lines
12 KiB
Python
# Copyright 2016 ACSONE SA/NV (<http://acsone.eu>)
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
|
|
|
import flectra.tests.common as common
|
|
|
|
from ..models.accounting_none import AccountingNone
|
|
from ..models.data_error import DataError
|
|
from ..models.mis_report_style import CMP_DIFF, CMP_PCT, TYPE_NUM, TYPE_PCT, TYPE_STR
|
|
|
|
|
|
class TestRendering(common.TransactionCase):
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.style_obj = self.env["mis.report.style"]
|
|
self.kpi_obj = self.env["mis.report.kpi"]
|
|
self.style = self.style_obj.create(dict(name="teststyle"))
|
|
self.lang = (
|
|
self.env["res.lang"]
|
|
.with_context(active_test=False)
|
|
.search([("code", "=", "en_US")])[0]
|
|
)
|
|
|
|
def _render(self, value, type=TYPE_NUM):
|
|
style_props = self.style_obj.merge([self.style])
|
|
return self.style_obj.render(self.lang, style_props, type, value)
|
|
|
|
def _compare_and_render(
|
|
self, value, base_value, type=TYPE_NUM, compare_method=CMP_PCT
|
|
):
|
|
style_props = self.style_obj.merge([self.style])
|
|
r = self.style_obj.compare_and_render(
|
|
self.lang, style_props, type, compare_method, value, base_value
|
|
)[:2]
|
|
if r[0]:
|
|
return (round(r[0], 8), r[1])
|
|
else:
|
|
return r
|
|
|
|
def test_render(self):
|
|
self.assertEqual("1", self._render(1))
|
|
self.assertEqual("1", self._render(1.1))
|
|
self.assertEqual("2", self._render(1.6))
|
|
self.style.dp_inherit = False
|
|
self.style.dp = 2
|
|
self.assertEqual("1.00", self._render(1))
|
|
self.assertEqual("1.10", self._render(1.1))
|
|
self.assertEqual("1.60", self._render(1.6))
|
|
self.assertEqual("1.61", self._render(1.606))
|
|
self.assertEqual("12,345.67", self._render(12345.67))
|
|
|
|
def test_render_negative(self):
|
|
# non breaking hyphen
|
|
self.assertEqual("\u20111", self._render(-1))
|
|
|
|
def test_render_zero(self):
|
|
self.assertEqual("0", self._render(0))
|
|
self.assertEqual("", self._render(None))
|
|
self.assertEqual("", self._render(AccountingNone))
|
|
|
|
def test_render_suffix(self):
|
|
self.style.suffix_inherit = False
|
|
self.style.suffix = "€"
|
|
self.assertEqual("1\xa0€", self._render(1))
|
|
self.style.suffix = "k€"
|
|
self.style.divider_inherit = False
|
|
self.style.divider = "1e3"
|
|
self.assertEqual("1\xa0k€", self._render(1000))
|
|
|
|
def test_render_prefix(self):
|
|
self.style.prefix_inherit = False
|
|
self.style.prefix = "$"
|
|
self.assertEqual("$\xa01", self._render(1))
|
|
self.style.prefix = "k$"
|
|
self.style.divider_inherit = False
|
|
self.style.divider = "1e3"
|
|
self.assertEqual("k$\xa01", self._render(1000))
|
|
|
|
def test_render_divider(self):
|
|
self.style.divider_inherit = False
|
|
self.style.divider = "1e3"
|
|
self.style.dp_inherit = False
|
|
self.style.dp = 0
|
|
self.assertEqual("1", self._render(1000))
|
|
self.style.divider = "1e6"
|
|
self.style.dp = 3
|
|
self.assertEqual("0.001", self._render(1000))
|
|
self.style.divider = "1e-3"
|
|
self.style.dp = 0
|
|
self.assertEqual("1,000", self._render(1))
|
|
self.style.divider = "1e-6"
|
|
self.style.dp = 0
|
|
self.assertEqual("1,000,000", self._render(1))
|
|
|
|
def test_render_pct(self):
|
|
self.assertEqual("100\xa0%", self._render(1, TYPE_PCT))
|
|
self.assertEqual("50\xa0%", self._render(0.5, TYPE_PCT))
|
|
self.style.dp_inherit = False
|
|
self.style.dp = 2
|
|
self.assertEqual("51.23\xa0%", self._render(0.5123, TYPE_PCT))
|
|
|
|
def test_render_string(self):
|
|
self.assertEqual("", self._render("", TYPE_STR))
|
|
self.assertEqual("", self._render(None, TYPE_STR))
|
|
self.assertEqual("abcdé", self._render("abcdé", TYPE_STR))
|
|
|
|
def test_compare_num_pct(self):
|
|
self.assertEqual((1.0, "+100.0\xa0%"), self._compare_and_render(100, 50))
|
|
self.assertEqual((0.5, "+50.0\xa0%"), self._compare_and_render(75, 50))
|
|
self.assertEqual((0.5, "+50.0\xa0%"), self._compare_and_render(-25, -50))
|
|
self.assertEqual((1.0, "+100.0\xa0%"), self._compare_and_render(0, -50))
|
|
self.assertEqual((2.0, "+200.0\xa0%"), self._compare_and_render(50, -50))
|
|
self.assertEqual((-0.5, "\u201150.0\xa0%"), self._compare_and_render(25, 50))
|
|
self.assertEqual((-1.0, "\u2011100.0\xa0%"), self._compare_and_render(0, 50))
|
|
self.assertEqual((-2.0, "\u2011200.0\xa0%"), self._compare_and_render(-50, 50))
|
|
self.assertEqual((-0.5, "\u201150.0\xa0%"), self._compare_and_render(-75, -50))
|
|
self.assertEqual(
|
|
(AccountingNone, ""), self._compare_and_render(50, AccountingNone)
|
|
)
|
|
self.assertEqual((AccountingNone, ""), self._compare_and_render(50, None))
|
|
self.assertEqual((AccountingNone, ""), self._compare_and_render(50, 50))
|
|
self.assertEqual((0.002, "+0.2\xa0%"), self._compare_and_render(50.1, 50))
|
|
self.assertEqual((AccountingNone, ""), self._compare_and_render(50.01, 50))
|
|
self.assertEqual(
|
|
(-1.0, "\u2011100.0\xa0%"), self._compare_and_render(AccountingNone, 50)
|
|
)
|
|
self.assertEqual((-1.0, "\u2011100.0\xa0%"), self._compare_and_render(None, 50))
|
|
self.assertEqual(
|
|
(AccountingNone, ""), self._compare_and_render(DataError("#ERR", "."), 1)
|
|
)
|
|
self.assertEqual(
|
|
(AccountingNone, ""), self._compare_and_render(1, DataError("#ERR", "."))
|
|
)
|
|
|
|
def test_compare_num_diff(self):
|
|
self.assertEqual(
|
|
(25, "+25"), self._compare_and_render(75, 50, TYPE_NUM, CMP_DIFF)
|
|
)
|
|
self.assertEqual(
|
|
(-25, "\u201125"), self._compare_and_render(25, 50, TYPE_NUM, CMP_DIFF)
|
|
)
|
|
self.style.suffix_inherit = False
|
|
self.style.suffix = "€"
|
|
self.assertEqual(
|
|
(-25, "\u201125\xa0€"),
|
|
self._compare_and_render(25, 50, TYPE_NUM, CMP_DIFF),
|
|
)
|
|
self.style.suffix = ""
|
|
self.assertEqual(
|
|
(50.0, "+50"),
|
|
self._compare_and_render(50, AccountingNone, TYPE_NUM, CMP_DIFF),
|
|
)
|
|
self.assertEqual(
|
|
(50.0, "+50"), self._compare_and_render(50, None, TYPE_NUM, CMP_DIFF)
|
|
)
|
|
self.assertEqual(
|
|
(-50.0, "\u201150"),
|
|
self._compare_and_render(AccountingNone, 50, TYPE_NUM, CMP_DIFF),
|
|
)
|
|
self.assertEqual(
|
|
(-50.0, "\u201150"), self._compare_and_render(None, 50, TYPE_NUM, CMP_DIFF)
|
|
)
|
|
self.style.dp_inherit = False
|
|
self.style.dp = 2
|
|
self.assertEqual(
|
|
(0.1, "+0.10"), self._compare_and_render(1.1, 1.0, TYPE_NUM, CMP_DIFF)
|
|
)
|
|
self.assertEqual(
|
|
(AccountingNone, ""),
|
|
self._compare_and_render(1.001, 1.0, TYPE_NUM, CMP_DIFF),
|
|
)
|
|
|
|
def test_compare_pct(self):
|
|
self.assertEqual(
|
|
(0.25, "+25\xa0pp"), self._compare_and_render(0.75, 0.50, TYPE_PCT)
|
|
)
|
|
self.assertEqual(
|
|
(AccountingNone, ""), self._compare_and_render(0.751, 0.750, TYPE_PCT)
|
|
)
|
|
|
|
def test_compare_pct_result_type(self):
|
|
style_props = self.style_obj.merge([self.style])
|
|
result = self.style_obj.compare_and_render(
|
|
self.lang, style_props, TYPE_PCT, CMP_DIFF, 0.75, 0.50
|
|
)
|
|
self.assertEqual(result[3], TYPE_NUM)
|
|
|
|
def test_merge(self):
|
|
self.style.color = "#FF0000"
|
|
self.style.color_inherit = False
|
|
style_props = self.style_obj.merge([self.style])
|
|
self.assertEqual(style_props, {"color": "#FF0000"})
|
|
style_dict = {"color": "#00FF00", "dp": 0}
|
|
style_props = self.style_obj.merge([self.style, style_dict])
|
|
self.assertEqual(style_props, {"color": "#00FF00", "dp": 0})
|
|
style2 = self.style_obj.create(
|
|
dict(
|
|
name="teststyle2",
|
|
dp_inherit=False,
|
|
dp=1,
|
|
# color_inherit=True: will not be applied
|
|
color="#0000FF",
|
|
)
|
|
)
|
|
style_props = self.style_obj.merge([self.style, style_dict, style2])
|
|
self.assertEqual(style_props, {"color": "#00FF00", "dp": 1})
|
|
|
|
def test_css(self):
|
|
self.style.color_inherit = False
|
|
self.style.color = "#FF0000"
|
|
self.style.background_color_inherit = False
|
|
self.style.background_color = "#0000FF"
|
|
self.style.suffix_inherit = False
|
|
self.style.suffix = "s"
|
|
self.style.prefix_inherit = False
|
|
self.style.prefix = "p"
|
|
self.style.font_style_inherit = False
|
|
self.style.font_style = "italic"
|
|
self.style.font_weight_inherit = False
|
|
self.style.font_weight = "bold"
|
|
self.style.font_size_inherit = False
|
|
self.style.font_size = "small"
|
|
self.style.indent_level_inherit = False
|
|
self.style.indent_level = 2
|
|
style_props = self.style_obj.merge([self.style])
|
|
css = self.style_obj.to_css_style(style_props)
|
|
self.assertEqual(
|
|
css,
|
|
"font-style: italic; "
|
|
"font-weight: bold; "
|
|
"font-size: small; "
|
|
"color: #FF0000; "
|
|
"background-color: #0000FF; "
|
|
"text-indent: 2em",
|
|
)
|
|
css = self.style_obj.to_css_style(style_props, no_indent=True)
|
|
self.assertEqual(
|
|
css,
|
|
"font-style: italic; "
|
|
"font-weight: bold; "
|
|
"font-size: small; "
|
|
"color: #FF0000; "
|
|
"background-color: #0000FF",
|
|
)
|
|
|
|
def test_xslx(self):
|
|
self.style.color_inherit = False
|
|
self.style.color = "#FF0000"
|
|
self.style.background_color_inherit = False
|
|
self.style.background_color = "#0000FF"
|
|
self.style.suffix_inherit = False
|
|
self.style.suffix = "s"
|
|
self.style.prefix_inherit = False
|
|
self.style.prefix = "p"
|
|
self.style.dp_inherit = False
|
|
self.style.dp = 2
|
|
self.style.font_style_inherit = False
|
|
self.style.font_style = "italic"
|
|
self.style.font_weight_inherit = False
|
|
self.style.font_weight = "bold"
|
|
self.style.font_size_inherit = False
|
|
self.style.font_size = "small"
|
|
self.style.indent_level_inherit = False
|
|
self.style.indent_level = 2
|
|
style_props = self.style_obj.merge([self.style])
|
|
xlsx = self.style_obj.to_xlsx_style(TYPE_NUM, style_props)
|
|
self.assertEqual(
|
|
xlsx,
|
|
{
|
|
"italic": True,
|
|
"bold": True,
|
|
"size": 9,
|
|
"font_color": "#FF0000",
|
|
"bg_color": "#0000FF",
|
|
"num_format": '"p "#,##0.00" s"',
|
|
"indent": 2,
|
|
},
|
|
)
|
|
xlsx = self.style_obj.to_xlsx_style(TYPE_NUM, style_props, no_indent=True)
|
|
self.assertEqual(
|
|
xlsx,
|
|
{
|
|
"italic": True,
|
|
"bold": True,
|
|
"size": 9,
|
|
"font_color": "#FF0000",
|
|
"bg_color": "#0000FF",
|
|
"num_format": '"p "#,##0.00" s"',
|
|
},
|
|
)
|
|
# percent type ignore prefix and suffix
|
|
xlsx = self.style_obj.to_xlsx_style(TYPE_PCT, style_props, no_indent=True)
|
|
self.assertEqual(
|
|
xlsx,
|
|
{
|
|
"italic": True,
|
|
"bold": True,
|
|
"size": 9,
|
|
"font_color": "#FF0000",
|
|
"bg_color": "#0000FF",
|
|
"num_format": "0.00%",
|
|
},
|
|
)
|
|
|
|
# str type have no num_format style
|
|
xlsx = self.style_obj.to_xlsx_style(TYPE_STR, style_props, no_indent=True)
|
|
self.assertEqual(
|
|
xlsx,
|
|
{
|
|
"italic": True,
|
|
"bold": True,
|
|
"size": 9,
|
|
"font_color": "#FF0000",
|
|
"bg_color": "#0000FF",
|
|
},
|
|
)
|