1242a8e5cSJaap de Haan<?php 29ff8d41cSJaap de Haan 3242a8e5cSJaap de Haan/** 4242a8e5cSJaap de Haan * @group plugin_bpmnio 5242a8e5cSJaap de Haan * @group plugins 6242a8e5cSJaap de Haan */ 79ff8d41cSJaap de Haanclass action_plugin_bpmnio_editor_test extends DokuWikiTest 89ff8d41cSJaap de Haan{ 9242a8e5cSJaap de Haan protected $pluginsEnabled = array('bpmnio'); 10242a8e5cSJaap de Haan 11*36b712d8SJaap de Haan public function tearDown(): void 12*36b712d8SJaap de Haan { 13*36b712d8SJaap de Haan parent::tearDown(); 14*36b712d8SJaap de Haan 15*36b712d8SJaap de Haan global $TEXT; 16*36b712d8SJaap de Haan global $RANGE; 17*36b712d8SJaap de Haan $TEXT = null; 18*36b712d8SJaap de Haan $RANGE = null; 19*36b712d8SJaap de Haan } 20*36b712d8SJaap de Haan 21242a8e5cSJaap de Haan /** 22242a8e5cSJaap de Haan * Test that the editor plugin can be loaded 23242a8e5cSJaap de Haan */ 249ff8d41cSJaap de Haan public function test_plugin_load() 259ff8d41cSJaap de Haan { 26242a8e5cSJaap de Haan $plugin = plugin_load('action', 'bpmnio_editor'); 27242a8e5cSJaap de Haan $this->assertNotNull($plugin, 'Editor action plugin should be loadable'); 28242a8e5cSJaap de Haan } 29242a8e5cSJaap de Haan 30242a8e5cSJaap de Haan /** 31242a8e5cSJaap de Haan * Test section edit button for BPMN target 32242a8e5cSJaap de Haan */ 339ff8d41cSJaap de Haan public function test_section_edit_button_bpmn() 349ff8d41cSJaap de Haan { 35242a8e5cSJaap de Haan $plugin = plugin_load('action', 'bpmnio_editor'); 36242a8e5cSJaap de Haan 37242a8e5cSJaap de Haan $data = ['target' => 'plugin_bpmnio_bpmn', 'name' => '']; 38242a8e5cSJaap de Haan $event = new \dokuwiki\Extension\Event('HTML_SECEDIT_BUTTON', $data); 39242a8e5cSJaap de Haan 40242a8e5cSJaap de Haan $plugin->sectionEditButton($event); 41242a8e5cSJaap de Haan 42242a8e5cSJaap de Haan $this->assertNotEmpty($data['name'], 'Button name should be set for BPMN target'); 43242a8e5cSJaap de Haan } 44242a8e5cSJaap de Haan 45242a8e5cSJaap de Haan /** 46242a8e5cSJaap de Haan * Test section edit button for DMN target 47242a8e5cSJaap de Haan */ 489ff8d41cSJaap de Haan public function test_section_edit_button_dmn() 499ff8d41cSJaap de Haan { 50242a8e5cSJaap de Haan $plugin = plugin_load('action', 'bpmnio_editor'); 51242a8e5cSJaap de Haan 52242a8e5cSJaap de Haan $data = ['target' => 'plugin_bpmnio_dmn', 'name' => '']; 53242a8e5cSJaap de Haan $event = new \dokuwiki\Extension\Event('HTML_SECEDIT_BUTTON', $data); 54242a8e5cSJaap de Haan 55242a8e5cSJaap de Haan $plugin->sectionEditButton($event); 56242a8e5cSJaap de Haan 57242a8e5cSJaap de Haan $this->assertNotEmpty($data['name'], 'Button name should be set for DMN target'); 58242a8e5cSJaap de Haan } 59242a8e5cSJaap de Haan 60242a8e5cSJaap de Haan /** 61242a8e5cSJaap de Haan * Test section edit button ignores non-bpmnio targets 62242a8e5cSJaap de Haan */ 639ff8d41cSJaap de Haan public function test_section_edit_button_ignores_other() 649ff8d41cSJaap de Haan { 65242a8e5cSJaap de Haan $plugin = plugin_load('action', 'bpmnio_editor'); 66242a8e5cSJaap de Haan 67242a8e5cSJaap de Haan $data = ['target' => 'section', 'name' => '']; 68242a8e5cSJaap de Haan $event = new \dokuwiki\Extension\Event('HTML_SECEDIT_BUTTON', $data); 69242a8e5cSJaap de Haan 70242a8e5cSJaap de Haan $plugin->sectionEditButton($event); 71242a8e5cSJaap de Haan 72242a8e5cSJaap de Haan $this->assertEmpty($data['name'], 'Button name should not be set for non-bpmnio targets'); 73242a8e5cSJaap de Haan } 74242a8e5cSJaap de Haan 75242a8e5cSJaap de Haan /** 76242a8e5cSJaap de Haan * Test handlePost does nothing when plugin data not in POST 77242a8e5cSJaap de Haan */ 789ff8d41cSJaap de Haan public function test_handle_post_noop_without_data() 799ff8d41cSJaap de Haan { 80242a8e5cSJaap de Haan $plugin = plugin_load('action', 'bpmnio_editor'); 81242a8e5cSJaap de Haan 82242a8e5cSJaap de Haan global $TEXT; 83242a8e5cSJaap de Haan $TEXT = 'original'; 84242a8e5cSJaap de Haan global $INPUT; 85242a8e5cSJaap de Haan 86242a8e5cSJaap de Haan $data = 'edit'; 87242a8e5cSJaap de Haan $event = new \dokuwiki\Extension\Event('ACTION_ACT_PREPROCESS', $data); 88242a8e5cSJaap de Haan 89242a8e5cSJaap de Haan $plugin->handlePost($event); 90242a8e5cSJaap de Haan 91242a8e5cSJaap de Haan $this->assertEquals('original', $TEXT, '$TEXT should not change when plugin data is not posted'); 92242a8e5cSJaap de Haan } 9361596a8fSJaap de Haan 94*36b712d8SJaap de Haan public function test_handle_form_uses_render_payload_but_preserves_original_text() 9561596a8fSJaap de Haan { 9661596a8fSJaap de Haan $plugin = plugin_load('action', 'bpmnio_editor'); 9761596a8fSJaap de Haan 9861596a8fSJaap de Haan global $TEXT; 9961596a8fSJaap de Haan global $RANGE; 100*36b712d8SJaap de Haan $TEXT = '<?xml version="1.0"?><definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"><process id="Process_1"><task id="Task_1" name="[[:docs:start|Read docs]]" /></process></definitions>'; 101*36b712d8SJaap de Haan $RANGE = '1-10'; 10261596a8fSJaap de Haan 103033061beSJaap de Haan $form = new class { 104*36b712d8SJaap de Haan /** @var array<string, string> */ 105033061beSJaap de Haan public array $hiddenFields = []; 106*36b712d8SJaap de Haan 107033061beSJaap de Haan public string $html = ''; 108033061beSJaap de Haan 109*36b712d8SJaap de Haan public function setHiddenField(string $name, string $value): void 110033061beSJaap de Haan { 111033061beSJaap de Haan $this->hiddenFields[$name] = $value; 112033061beSJaap de Haan } 113033061beSJaap de Haan 114*36b712d8SJaap de Haan public function addHTML(string $html): void 115033061beSJaap de Haan { 116033061beSJaap de Haan $this->html .= $html; 117033061beSJaap de Haan } 118033061beSJaap de Haan }; 119*36b712d8SJaap de Haan $data = ['target' => 'plugin_bpmnio_bpmn', 'form' => $form]; 12061596a8fSJaap de Haan $event = new \dokuwiki\Extension\Event('EDIT_FORM_ADDTEXTAREA', $data); 12161596a8fSJaap de Haan 12261596a8fSJaap de Haan $plugin->handleForm($event); 12361596a8fSJaap de Haan 12461596a8fSJaap de Haan $this->assertArrayHasKey('plugin_bpmnio_data', $form->hiddenFields); 125*36b712d8SJaap de Haan $this->assertArrayHasKey('plugin_bpmnio_links', $form->hiddenFields); 126*36b712d8SJaap de Haan $this->assertEquals(base64_encode($TEXT), $form->hiddenFields['plugin_bpmnio_data']); 12761596a8fSJaap de Haan $this->assertStringContainsString('id="plugin_bpmnio__bpmn_editor"', $form->html); 12861596a8fSJaap de Haan $this->assertStringContainsString('<div class="bpmn_js_canvas">', $form->html); 129*36b712d8SJaap de Haan $this->assertSame(5, substr_count($form->html, '<div')); 130*36b712d8SJaap de Haan $this->assertSame(5, substr_count($form->html, '</div>')); 131*36b712d8SJaap de Haan 132*36b712d8SJaap de Haan preg_match('/<div class="bpmn_js_data">(.*?)<\/div>/s', $form->html, $xmlMatch); 133*36b712d8SJaap de Haan $this->assertNotEmpty($xmlMatch[1]); 134*36b712d8SJaap de Haan $decodedXml = base64_decode(trim($xmlMatch[1]), true); 135*36b712d8SJaap de Haan $this->assertNotFalse($decodedXml); 136*36b712d8SJaap de Haan $this->assertStringContainsString('name="Read docs"', $decodedXml); 137*36b712d8SJaap de Haan 138*36b712d8SJaap de Haan preg_match('/<div class="bpmn_js_links">(.*?)<\/div>/s', $form->html, $linkMatch); 139*36b712d8SJaap de Haan $this->assertNotEmpty($linkMatch[1]); 140*36b712d8SJaap de Haan $decodedLinks = base64_decode(trim($linkMatch[1]), true); 141*36b712d8SJaap de Haan $links = json_decode($decodedLinks, true); 142*36b712d8SJaap de Haan $this->assertArrayHasKey('Task_1', $links); 143*36b712d8SJaap de Haan $this->assertEquals('docs:start', $links['Task_1']['target']); 14461596a8fSJaap de Haan } 145242a8e5cSJaap de Haan} 146