diff --git a/.smoke_phase6.py b/.smoke_phase6.py new file mode 100644 index 00000000..30098192 --- /dev/null +++ b/.smoke_phase6.py @@ -0,0 +1,115 @@ +import xmlrpc.client +from odoo.addons.fusion_helpdesk.utils import build_scope_domain +from odoo.addons.fusion_helpdesk.utils import build_ticket_vals + +SMOKE_EMAIL = 'phase6-smoke@example.com' +SMOKE_NAME = 'Phase6 Smoke (delete me)' + +def line(k, v): + print('SMOKE|%s|%s' % (k, v)) + +ICP = env['ir.config_parameter'].sudo() +cfg = { + 'url': (ICP.get_param('fusion_helpdesk.remote_url') or '').strip().rstrip('/'), + 'db': (ICP.get_param('fusion_helpdesk.remote_db') or '').strip(), + 'login': (ICP.get_param('fusion_helpdesk.remote_login') or '').strip(), + 'password': ICP.get_param('fusion_helpdesk.remote_password') or '', + 'team_id': int(ICP.get_param('fusion_helpdesk.remote_team_id') or 0) or False, + 'client_label': (ICP.get_param('fusion_helpdesk.client_label') or '').strip(), +} +line('CFG_URL', cfg['url']) +line('CFG_DB', cfg['db']) +line('CFG_LOGIN', cfg['login']) +line('CFG_TEAM', cfg['team_id']) +line('CFG_LABEL', repr(cfg['client_label'])) + +common = xmlrpc.client.ServerProxy(cfg['url'] + '/xmlrpc/2/common', allow_none=True) +uid = common.authenticate(cfg['db'], cfg['login'], cfg['password'], {}) +line('AUTH_UID', uid) +models = xmlrpc.client.ServerProxy(cfg['url'] + '/xmlrpc/2/object', allow_none=True) + + +def kw(model, method, args, kwargs=None): + return models.execute_kw(cfg['db'], uid, cfg['password'], model, method, args, kwargs or {}) + + +vals = build_ticket_vals( + kind='bug', subject='Phase 6 deploy smoke test', + body_html='

Automated smoke test from entech after deploy. Safe to delete.

', + team_id=cfg['team_id'], client_label=cfg['client_label'], + reporter_name=SMOKE_NAME, reporter_email=SMOKE_EMAIL, + company_name='SMOKE-TEST', +) +line('VALS', vals) + +tid = kw('helpdesk.ticket', 'create', [vals]) +line('CREATED_TICKET_ID', tid) + +rb = kw('helpdesk.ticket', 'read', [[tid], [ + 'name', 'partner_id', 'partner_email', 'partner_name', + 'x_fc_client_label', 'message_partner_ids', 'ticket_ref']])[0] +line('READ_NAME', rb['name']) +line('READ_PARTNER_ID', rb['partner_id']) +line('READ_PARTNER_EMAIL', rb['partner_email']) +line('READ_PARTNER_NAME', rb['partner_name']) +line('READ_LABEL', repr(rb['x_fc_client_label'])) +line('READ_FOLLOWERS', rb['message_partner_ids']) +partner_id = rb['partner_id'][0] if rb['partner_id'] else None +line('ASSERT_PARTNER_RESOLVED', bool(partner_id)) +line('ASSERT_LABEL_MATCHES', rb['x_fc_client_label'] == cfg['client_label']) +line('ASSERT_FOLLOWER', bool(partner_id) and partner_id in (rb['message_partner_ids'] or [])) + +# Ack email queued by the central create-override? +acks = kw('mail.mail', 'search_read', + [[('subject', 'ilike', 'received your request')]], + {'fields': ['id', 'state', 'email_to', 'subject'], 'order': 'id desc', 'limit': 5}) +line('ACK_CANDIDATES', acks) +ack_mail_ids = [m['id'] for m in acks if SMOKE_EMAIL in (m.get('email_to') or '')] +line('ASSERT_ACK_FOR_SMOKE', bool(ack_mail_ids)) + +# Support reply (as the service/agent account) -> should show in public thread +kw('helpdesk.ticket', 'message_post', [[tid]], { + 'body': '

Smoke test support reply.

', 'body_is_html': True, + 'message_type': 'comment', 'subtype_xmlid': 'mail.mt_comment', +}) +pub = kw('mail.message', 'search_read', + [[('model', '=', 'helpdesk.ticket'), ('res_id', '=', tid), + ('message_type', 'in', ['comment', 'email'])]], + {'fields': ['id', 'author_id', 'subtype_id'], 'order': 'id asc'}) +line('PUBLIC_MSG_COUNT', len(pub)) + +# Inbox scope: would the entech reporter (email+label, non-admin) find this ticket? +dom = build_scope_domain(cfg['client_label'], SMOKE_EMAIL, False) +line('SCOPE_DOMAIN', dom) +found = kw('helpdesk.ticket', 'search', [dom], {'limit': 50}) +line('SCOPE_FOUND_IDS', found) +line('ASSERT_INBOX_SEES_TICKET', tid in found) + +# Cross-deployment leak guard: a different label must NOT see it +dom_other = build_scope_domain('SOME-OTHER-LABEL', SMOKE_EMAIL, False) +found_other = kw('helpdesk.ticket', 'search', [dom_other], {'limit': 50}) +line('ASSERT_NO_LEAK_OTHER_LABEL', tid not in found_other) + +# ---- Cleanup (best effort) ------------------------------------------------ +cleanup = {'mail': False, 'ticket': False, 'partner': False} +try: + if ack_mail_ids: + kw('mail.mail', 'unlink', [ack_mail_ids]) + cleanup['mail'] = True +except Exception as e: + line('CLEANUP_MAIL_ERR', e) +try: + kw('helpdesk.ticket', 'unlink', [[tid]]) + cleanup['ticket'] = True +except Exception as e: + line('CLEANUP_TICKET_ERR', e) +try: + if partner_id: + p = kw('res.partner', 'read', [[partner_id], ['email']]) + if p and p[0].get('email') == SMOKE_EMAIL: + kw('res.partner', 'unlink', [[partner_id]]) + cleanup['partner'] = True +except Exception as e: + line('CLEANUP_PARTNER_ERR', e) +line('CLEANUP', cleanup) +line('DONE', 'ok')