Files
Odoo-Modules/docs/superpowers/tests/2026-04-21-sub2-cert-resolver-test.py
2026-04-21 20:23:32 -04:00

109 lines
4.1 KiB
Python

"""Sub 2 — test _fp_resolve_cert_requirement behaviour.
Run via:
cat docs/superpowers/tests/2026-04-21-sub2-cert-resolver-test.py | \
ssh pve-worker5 "pct exec 111 -- bash -c 'cat > /tmp/t.py && \
su - odoo -s /bin/bash -c \"/usr/bin/odoo shell -c /etc/odoo/odoo.conf -d admin --no-http --stop-after-init\" < /tmp/t.py'"
"""
import sys
env = self.env
def ok(msg): print(f" [OK] {msg}")
def fail(msg): print(f" [FAIL] {msg}"); sys.exit(1)
def hdr(t): print(f"\n=== {t} ===")
# ---- Setup ----
hdr("Setup")
Product = env['product.product']
product = Product.search([('active', '=', True)], limit=1)
Partner = env['res.partner']
partner = Partner.create({
'name': 'Sub2 CertResolver Test Co',
'is_company': True,
'customer_rank': 1,
'x_fc_send_coc': True,
'x_fc_send_thickness_report': False,
})
PartCat = env['fp.part.catalog']
part_inherit = PartCat.create({
'name': 'P-INHERIT', 'part_number': 'P-INHERIT', 'revision': 'A',
'partner_id': partner.id, 'certificate_requirement': 'inherit',
})
part_none = PartCat.create({
'name': 'P-NONE', 'part_number': 'P-NONE', 'revision': 'A',
'partner_id': partner.id, 'certificate_requirement': 'none',
})
part_thick = PartCat.create({
'name': 'P-THICK', 'part_number': 'P-THICK', 'revision': 'A',
'partner_id': partner.id, 'certificate_requirement': 'coc_thickness',
})
ok(f"parts created: {part_inherit.id}, {part_none.id}, {part_thick.id}")
def make_mo(lines):
"""Helper: builds an SO with the given part_catalogs, confirms it, returns MO."""
so_vals = {
'partner_id': partner.id,
'order_line': [
(0, 0, {
'product_id': product.id,
'product_uom_qty': 1,
'x_fc_part_catalog_id': pc.id,
}) for pc in lines
],
}
if 'x_fc_po_number' in env['sale.order']._fields:
so_vals['x_fc_po_number'] = 'TEST-PO'
so = env['sale.order'].create(so_vals)
so.action_confirm()
mo = env['mrp.production'].create({
'product_id': product.id, 'product_qty': 1, 'origin': so.name,
})
mo.action_confirm()
return mo
# ---- Test 1: inherit → partner ----
hdr("1. Part=inherit + partner(coc=T, thick=F) → (T, F)")
mo1 = make_mo([part_inherit])
want_coc, want_thickness = mo1._fp_resolve_cert_requirement()
if (want_coc, want_thickness) != (True, False):
fail(f"got ({want_coc}, {want_thickness}), expected (True, False)")
ok("inherit falls through to partner correctly")
# ---- Test 2: part=none overrides partner ----
hdr("2. Part=none + partner(coc=T) → (F, F)")
mo2 = make_mo([part_none])
want_coc, want_thickness = mo2._fp_resolve_cert_requirement()
if (want_coc, want_thickness) != (False, False):
fail(f"got ({want_coc}, {want_thickness}), expected (False, False)")
ok("part=none wins over partner=coc")
# ---- Test 3: part=coc_thickness + partner(coc=F, thick=F) → (T, T) ----
hdr("3. Part=coc_thickness + partner=none → (T, T)")
partner.x_fc_send_coc = False
mo3 = make_mo([part_thick])
want_coc, want_thickness = mo3._fp_resolve_cert_requirement()
if (want_coc, want_thickness) != (True, True):
fail(f"got ({want_coc}, {want_thickness}), expected (True, True)")
ok("part=coc_thickness wins over partner=off")
partner.x_fc_send_coc = True # reset
# ---- Test 4: multi-line MO strictest wins ----
hdr("4. Multi-line [none, coc_thickness] → (T, T)")
mo4 = make_mo([part_none, part_thick])
want_coc, want_thickness = mo4._fp_resolve_cert_requirement()
if (want_coc, want_thickness) != (True, True):
fail(f"got ({want_coc}, {want_thickness}), expected (True, True)")
ok("multi-line strictest wins")
# ---- Test 5: MO without SO link → safe default ----
hdr("5. Orphan MO → (T, F) safe default")
orphan = env['mrp.production'].create({
'product_id': product.id, 'product_qty': 1, 'origin': 'NONEXISTENT-SO',
})
want_coc, want_thickness = orphan._fp_resolve_cert_requirement()
if (want_coc, want_thickness) != (True, False):
fail(f"got ({want_coc}, {want_thickness}), expected (True, False)")
ok("orphan MO falls back to safe default")
hdr("ALL CERT RESOLVER TESTS PASS")