xref: /plugin/bpmnio/_test/action_plugin_bpmnio_editor.test.php (revision 36b712d809a9afeda77eb7dba8abf621818208c9)
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