Make Helpdesk email updates explicit
This commit is contained in:
+21
-30
@@ -122,13 +122,22 @@ def run_smoke(config: SmokeConfig) -> None:
|
||||
assert_helpdesk_context(context, issue_id, from_address, subject, require_messages=False)
|
||||
print("[OK] redMCP issueWithHelpdesk returned Helpdesk ticket context")
|
||||
|
||||
silent_token = f"redMCP silent internal note {token}"
|
||||
redmcp_call(config, "updateIssue", {"issue_id": issue_id, "fields": {"notes": silent_token}})
|
||||
assert_mailpit_text_absent(config, silent_token)
|
||||
print("[OK] redMCP default issue update did not send Helpdesk email")
|
||||
|
||||
control = redmcp_call(config, "createControlIssue", {"project": config.control_project, "token": token})
|
||||
control_id = int(control["id"])
|
||||
redmcp_call(config, "updateIssue", {"issue_id": control_id, "fields": {"notes": f"redMCP control update {token}"}})
|
||||
redmcp_call(config, "deleteIssue", {"issue_id": control_id})
|
||||
print(f"[OK] redMCP non-Helpdesk CRUD control passed with issue #{control_id}")
|
||||
|
||||
send_helpdesk_reply(config, issue_id, reply_token)
|
||||
redmcp_call(
|
||||
config,
|
||||
"updateIssue",
|
||||
{"issue_id": issue_id, "fields": {"notes": reply_token}, "options": {"send_helpdesk_email": True}},
|
||||
)
|
||||
wait_for_mailpit_text(config, before_ids, reply_token)
|
||||
print("[OK] Mailpit received outbound Helpdesk/Redmine mail containing the reply token")
|
||||
|
||||
@@ -195,34 +204,6 @@ def trigger_helpdesk_import(config: SmokeConfig) -> None:
|
||||
raise SmokeError("Helpdesk import failed: " + (result.stderr or result.stdout).strip())
|
||||
|
||||
|
||||
def send_helpdesk_reply(config: SmokeConfig, issue_id: int, content: str) -> None:
|
||||
ruby = (
|
||||
"issue = Issue.find(%d); "
|
||||
"user = User.find_by_login('rebot') || User.find_by_login('admin') || User.find(1); "
|
||||
"User.current = user; "
|
||||
"raise 'issue has no Helpdesk customer' if issue.customer.nil?; "
|
||||
"journal = issue.init_journal(user); "
|
||||
"journal.notes = %s; "
|
||||
"issue.save!; "
|
||||
"contact = issue.customer; "
|
||||
"HelpdeskMailer.with_activated_perform_deliveries do; "
|
||||
"msg = HelpdeskMailer.issue_response(contact, journal, {}).deliver; "
|
||||
"JournalMessage.create!(:from_address => '', "
|
||||
":to_address => contact.primary_email.downcase, "
|
||||
":is_incoming => false, "
|
||||
":message_date => Time.now, "
|
||||
":message_id => msg.message_id.to_s.slice(0, 255), "
|
||||
":source => HelpdeskTicket::HELPDESK_EMAIL_SOURCE, "
|
||||
":contact => contact, "
|
||||
":journal => journal); "
|
||||
"end; "
|
||||
"puts 'ok'"
|
||||
) % (issue_id, ruby_string(content))
|
||||
result = ssh_redmine(config, f"bin/rails runner -e production {shell_quote(ruby)}")
|
||||
if result.returncode != 0:
|
||||
raise SmokeError("Helpdesk reply failed: " + (result.stderr or result.stdout).strip())
|
||||
|
||||
|
||||
def wait_for_issue(config: SmokeConfig, subject: str, timeout: int = 60) -> int:
|
||||
deadline = time.time() + timeout
|
||||
while time.time() < deadline:
|
||||
@@ -295,7 +276,7 @@ switch ($input['action']) {
|
||||
]);
|
||||
break;
|
||||
case 'updateIssue':
|
||||
$client->updateIssue((int) $payload['issue_id'], $payload['fields']);
|
||||
$client->updateIssue((int) $payload['issue_id'], $payload['fields'], $payload['options'] ?? []);
|
||||
$result = ['ok' => true];
|
||||
break;
|
||||
case 'deleteIssue':
|
||||
@@ -380,6 +361,16 @@ def wait_for_mailpit_text(config: SmokeConfig, before_ids: set[str], needle: str
|
||||
raise SmokeError(f"Timed out waiting for Mailpit message containing {needle!r}")
|
||||
|
||||
|
||||
def assert_mailpit_text_absent(config: SmokeConfig, needle: str, timeout: int = 5) -> None:
|
||||
deadline = time.time() + timeout
|
||||
while time.time() < deadline:
|
||||
for message_id in mailpit_message_ids(config):
|
||||
message = mailpit_json(config, f"/api/v1/message/{message_id}", {})
|
||||
if needle in json.dumps(message):
|
||||
raise SmokeError(f"Mailpit unexpectedly received message containing {needle!r}")
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
def mailpit_json(config: SmokeConfig, path: str, params: dict[str, str]) -> dict[str, Any]:
|
||||
query = urllib.parse.urlencode(params)
|
||||
url = f"http://{config.mailpit_host}:{config.mailpit_http_port}{path}"
|
||||
|
||||
Reference in New Issue
Block a user