1*57e8c51eSJaap de Haan<?php 2*57e8c51eSJaap de Haan 3*57e8c51eSJaap de Haan/** 4*57e8c51eSJaap de Haan * @group plugin_bpmnio 5*57e8c51eSJaap de Haan * @group plugins 6*57e8c51eSJaap de Haan */ 7*57e8c51eSJaap de Haanclass plugin_bpmnio_link_processor_test extends DokuWikiTest 8*57e8c51eSJaap de Haan{ 9*57e8c51eSJaap de Haan protected $pluginsEnabled = array('bpmnio'); 10*57e8c51eSJaap de Haan 11*57e8c51eSJaap de Haan private function loadLinkProcessor(): void 12*57e8c51eSJaap de Haan { 13*57e8c51eSJaap de Haan require_once __DIR__ . '/../inc/link_processor.php'; 14*57e8c51eSJaap de Haan } 15*57e8c51eSJaap de Haan 16*57e8c51eSJaap de Haan /** 17*57e8c51eSJaap de Haan * XML with a declaration at position 0 (clean input as provided after source trim) 18*57e8c51eSJaap de Haan * must be successfully parsed so that wikilinks are resolved. 19*57e8c51eSJaap de Haan */ 20*57e8c51eSJaap de Haan public function test_build_payload_xml_declaration_at_start(): void 21*57e8c51eSJaap de Haan { 22*57e8c51eSJaap de Haan $this->loadLinkProcessor(); 23*57e8c51eSJaap de Haan 24*57e8c51eSJaap de Haan io_mkdir_p(dirname(wikiFN('test:target'))); 25*57e8c51eSJaap de Haan io_saveFile(wikiFN('test:target'), 'Target page'); 26*57e8c51eSJaap de Haan 27*57e8c51eSJaap de Haan $xml = '<?xml version="1.0" encoding="UTF-8"?>' 28*57e8c51eSJaap de Haan . '<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">' 29*57e8c51eSJaap de Haan . '<process id="Process_1">' 30*57e8c51eSJaap de Haan . '<task id="Task_1" name="[[test:target|Go there]]" />' 31*57e8c51eSJaap de Haan . '</process>' 32*57e8c51eSJaap de Haan . '</definitions>'; 33*57e8c51eSJaap de Haan 34*57e8c51eSJaap de Haan $result = plugin_bpmnio_link_processor::buildPayload($xml); 35*57e8c51eSJaap de Haan 36*57e8c51eSJaap de Haan // XML was parsed successfully: wikilink markup is stripped from name 37*57e8c51eSJaap de Haan $this->assertStringNotContainsString('[[', $result['xml']); 38*57e8c51eSJaap de Haan $this->assertStringContainsString('name="Go there"', $result['xml']); 39*57e8c51eSJaap de Haan // XML declaration is preserved in output 40*57e8c51eSJaap de Haan $this->assertStringContainsString('<?xml', $result['xml']); 41*57e8c51eSJaap de Haan // Link map contains the resolved entry 42*57e8c51eSJaap de Haan $this->assertArrayHasKey('Task_1', $result['links']); 43*57e8c51eSJaap de Haan $this->assertEquals('test:target', $result['links']['Task_1']['target']); 44*57e8c51eSJaap de Haan } 45*57e8c51eSJaap de Haan 46*57e8c51eSJaap de Haan /** 47*57e8c51eSJaap de Haan * Empty input returns empty xml and no links without crashing. 48*57e8c51eSJaap de Haan */ 49*57e8c51eSJaap de Haan public function test_build_payload_empty_input(): void 50*57e8c51eSJaap de Haan { 51*57e8c51eSJaap de Haan $this->loadLinkProcessor(); 52*57e8c51eSJaap de Haan 53*57e8c51eSJaap de Haan $result = plugin_bpmnio_link_processor::buildPayload(''); 54*57e8c51eSJaap de Haan 55*57e8c51eSJaap de Haan $this->assertSame('', $result['xml']); 56*57e8c51eSJaap de Haan $this->assertSame([], $result['links']); 57*57e8c51eSJaap de Haan } 58*57e8c51eSJaap de Haan 59*57e8c51eSJaap de Haan /** 60*57e8c51eSJaap de Haan * XML without wikilinks returns the processed XML and an empty link map. 61*57e8c51eSJaap de Haan */ 62*57e8c51eSJaap de Haan public function test_build_payload_no_links(): void 63*57e8c51eSJaap de Haan { 64*57e8c51eSJaap de Haan $this->loadLinkProcessor(); 65*57e8c51eSJaap de Haan 66*57e8c51eSJaap de Haan $xml = '<?xml version="1.0" encoding="UTF-8"?>' 67*57e8c51eSJaap de Haan . '<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">' 68*57e8c51eSJaap de Haan . '<process id="Process_1">' 69*57e8c51eSJaap de Haan . '<task id="Task_1" name="Plain Task" />' 70*57e8c51eSJaap de Haan . '</process>' 71*57e8c51eSJaap de Haan . '</definitions>'; 72*57e8c51eSJaap de Haan 73*57e8c51eSJaap de Haan $result = plugin_bpmnio_link_processor::buildPayload($xml); 74*57e8c51eSJaap de Haan 75*57e8c51eSJaap de Haan $this->assertStringContainsString('Plain Task', $result['xml']); 76*57e8c51eSJaap de Haan $this->assertSame([], $result['links']); 77*57e8c51eSJaap de Haan } 78*57e8c51eSJaap de Haan 79*57e8c51eSJaap de Haan /** 80*57e8c51eSJaap de Haan * Malformed XML returns the original string unchanged and no links. 81*57e8c51eSJaap de Haan */ 82*57e8c51eSJaap de Haan public function test_build_payload_malformed_xml(): void 83*57e8c51eSJaap de Haan { 84*57e8c51eSJaap de Haan $this->loadLinkProcessor(); 85*57e8c51eSJaap de Haan 86*57e8c51eSJaap de Haan $xml = '<unclosed>'; 87*57e8c51eSJaap de Haan 88*57e8c51eSJaap de Haan $result = plugin_bpmnio_link_processor::buildPayload($xml); 89*57e8c51eSJaap de Haan 90*57e8c51eSJaap de Haan $this->assertSame($xml, $result['xml']); 91*57e8c51eSJaap de Haan $this->assertSame([], $result['links']); 92*57e8c51eSJaap de Haan } 93*57e8c51eSJaap de Haan} 94