blob: 32a6e5e6b54533dd47cab313a93749bcbab72ec1 [file] [log] [blame]
Akron45308ce2020-08-28 14:10:23 +02001define(['plugin/server','plugin/widget','panel', 'panel/query', 'panel/result', 'plugin/service', 'pipe', 'vc','util'], function (pluginServerClass, widgetClass, panelClass, queryPanelClass, resultPanelClass, serviceClass, pipeClass, vcClass) {
Akronb43c8c62018-07-04 18:27:28 +02002
3 describe('KorAP.Plugin.Server', function () {
4
5 it('should be initializable', function () {
6 var manager = pluginServerClass.create();
7 expect(manager).toBeTruthy();
8 manager.destroy();
9 });
10
11 it('should add a widget', function () {
12 var manager = pluginServerClass.create();
Akron4a703872018-07-26 10:59:41 +020013 var panel = panelClass.create();
Akronbb891982020-10-05 16:07:18 +020014 var id = manager.addWidget(panel, {"name": 'Example 1', "src": 'about:blank'});
Akronb43c8c62018-07-04 18:27:28 +020015 expect(id).toMatch(/^id-/);
Akron4a703872018-07-26 10:59:41 +020016
17 var panelE = panel.element();
18 var widgetE = panelE.firstChild.firstChild;
19 expect(widgetE.classList.contains('widget')).toBeTruthy();
20 expect(widgetE.firstChild.tagName).toEqual("IFRAME");
21 var iframe = widgetE.firstChild;
22 expect(iframe.getAttribute("src")).toEqual("about:blank");
23
24 expect(widgetE.lastChild.firstChild.textContent).toEqual("Close");
25 expect(widgetE.lastChild.lastChild.textContent).toEqual("Example 1");
26
Akronb43c8c62018-07-04 18:27:28 +020027 manager.destroy();
28 });
Akron10a47962018-07-12 21:17:10 +020029
Akron22598cd2019-12-09 14:59:03 +010030 it('should add a service', function () {
31 var manager = pluginServerClass.create();
32
33 var e = manager.element();
34
35 document.body.appendChild(e);
36
37 expect(document.getElementById("services")).toBeTruthy();
38
39 expect(e.getAttribute("id")).toBe("services");
40 expect(e.children.length).toBe(0);
41
Akronbb891982020-10-05 16:07:18 +020042 var id = manager.addService({"name":'Example 1', "src":'about:blank'});
Akron22598cd2019-12-09 14:59:03 +010043 expect(id).toMatch(/^id-/);
44
45 expect(e.children.length).toBe(1);
46
47 manager.destroy();
48
49 expect(document.getElementById("services")).toBeFalsy();
50
51 });
52
Akron4a703872018-07-26 10:59:41 +020053 it('should close a widget', function () {
54 var manager = pluginServerClass.create();
55 var panel = panelClass.create();
Akronbb891982020-10-05 16:07:18 +020056 var id = manager.addWidget(panel, {"name":'Example 2', "src":'about:blank'});
Akron4a703872018-07-26 10:59:41 +020057 expect(id).toMatch(/^id-/);
58
59 var panelE = panel.element();
60 var widgetE = panelE.firstChild.firstChild;
61 expect(widgetE.classList.contains('widget')).toBeTruthy();
62
63 expect(panelE.getElementsByClassName('view').length).toEqual(1);
64
Akron22598cd2019-12-09 14:59:03 +010065 var widget = manager.service(id);
66 expect(widget.isWidget).toBeTruthy();
Akron4a703872018-07-26 10:59:41 +020067 widget.close();
68
69 expect(panelE.getElementsByClassName('view').length).toEqual(0);
Akron4a703872018-07-26 10:59:41 +020070 manager.destroy();
71 });
72
73
74 it('should fail on invalid registrations', function () {
Akron10a47962018-07-12 21:17:10 +020075 var manager = pluginServerClass.create();
76
77 expect(
78 function() { manager.register({}) }
79 ).toThrow(new Error("Missing name of plugin"));
80
81 expect(
82 function() { manager.register({
83 name : 'Example',
84 embed : ''
85 })}
86 ).toThrow(new Error("Embedding of plugin is no list"));
87
88 expect(
89 function() { manager.register({
90 name : 'Example',
91 embed : [{
92 panel : ''
93 }]
94 })}
95 ).toThrow(new Error("Panel for plugin is invalid"));
Akron2d0d96d2019-11-18 19:49:50 +010096 manager.destroy();
97 });
98
99 it('should accept valid registrations for matches', function () {
100 var manager = pluginServerClass.create();
101
102 manager.register({
103 name : 'Check',
104 embed : [{
105 panel : 'match',
106 title : 'Translate',
107 onClick : {
108 template : 'test'
109 }
110 }]
111 });
112
113 expect(manager.buttonGroup('match').length).toEqual(1);
114 manager.destroy();
115 });
Akron3d013802020-10-07 15:03:38 +0200116
Akron2d0d96d2019-11-18 19:49:50 +0100117 it('should accept valid registrations for query temporary', function () {
118 var manager = pluginServerClass.create();
119
120 manager.register({
121 name : 'Check',
122 embed : [{
123 panel : 'query',
124 title : 'Translate',
125 onClick : {
126 template : 'test'
127 }
128 }]
129 });
130
131 expect(manager.buttonGroup('query').length).toEqual(1);
132 manager.destroy();
Akron10a47962018-07-12 21:17:10 +0200133 });
hebasta043e96f2019-11-28 12:33:00 +0100134
135
136 it('should accept valid registrations for result', function () {
137 var manager = pluginServerClass.create();
138
139 manager.register({
140 name : 'Check',
141 embed : [{
142 panel : 'result',
143 title : 'Translate',
144 onClick : {
145 template : 'test'
146 }
147 }]
148 });
149
150 expect(manager.buttonGroup('result').length).toEqual(1);
151 manager.destroy();
152 });
Akronba09ed22020-10-01 16:01:45 +0200153
154 it('should accept valid registrations for addWidget', function () {
155 let p = KorAP.Panel["result"] = panelClass.create();
156
157 let manager = pluginServerClass.create();
158
159 manager.register({
160 name : 'Check',
161 embed : [{
162 panel : 'result',
163 title : 'Add',
164 onClick : {
165 template : 'about:blank',
166 action : 'addWidget'
167 }
168 }]
169 });
170
Akron37ea1192021-07-28 10:40:14 +0200171 let b = p.actions().element().firstChild;
Akronba09ed22020-10-01 16:01:45 +0200172 expect(b.hasAttribute("data-icon")).toBeFalsy();
173 expect(b.hasAttribute("cls")).toBeFalsy();
174 expect(b.getAttribute("title")).toEqual("Add");
175
176 expect(p.element().querySelectorAll("iframe").length).toEqual(0);
177
178 b.click();
179
180 expect(p.element().querySelectorAll("iframe").length).toEqual(1);
181 expect(p.element().querySelectorAll("div.view.widget").length).toEqual(1);
182 expect(p.element().querySelectorAll("div.view.show.widget").length).toEqual(1);
183
184 b.click();
185
186 expect(p.element().querySelectorAll("iframe").length).toEqual(2);
187 expect(p.element().querySelectorAll("div.view.widget").length).toEqual(2);
188 expect(p.element().querySelectorAll("div.view.show.widget").length).toEqual(2);
189
190 manager.destroy();
191
192 KorAP.Panel["result"] = undefined;
193 });
194
Akronba09ed22020-10-01 16:01:45 +0200195 it('should accept valid registrations for setWidget', function () {
196 let p = KorAP.Panel["result"] = panelClass.create();
197
198 let manager = pluginServerClass.create();
199
200 manager.register({
201 name : 'Check',
202 embed : [{
203 panel : 'result',
204 title : 'Add',
205 onClick : {
206 template : 'about:blank',
Marc Kupietz0d0dc6b2026-02-15 08:43:12 +0100207 action : 'setWidget',
208 permissions: ['same-origin'] // Temporary
Akronba09ed22020-10-01 16:01:45 +0200209 }
210 }]
211 });
212
Akron37ea1192021-07-28 10:40:14 +0200213 let b = p.actions().element().firstChild;
Akronba09ed22020-10-01 16:01:45 +0200214 expect(b.hasAttribute("data-icon")).toBeFalsy();
215 expect(b.hasAttribute("cls")).toBeFalsy();
216 expect(b.getAttribute("title")).toEqual("Add");
217
218 expect(p.element().querySelectorAll("iframe").length).toEqual(0);
219
220 b.click();
221
222 expect(p.element().querySelectorAll("iframe").length).toEqual(1);
223 expect(p.element().querySelectorAll("div.view.show.widget").length).toEqual(1);
224
225 b.click();
226
227 expect(p.element().querySelectorAll("iframe").length).toEqual(1);
228 expect(p.element().querySelectorAll("div.view.widget").length).toEqual(1);
229 expect(p.element().querySelectorAll("div.view.show.widget").length).toEqual(0);
Akronfcf89db2020-10-01 17:40:20 +0200230
231 p.element().querySelector("span.close").click();
232
233 expect(p.element().querySelectorAll("iframe").length).toEqual(0);
Akronda32e7a2021-11-16 17:28:57 +0100234
Akronfcf89db2020-10-01 17:40:20 +0200235 b.click();
236
237 expect(p.element().querySelectorAll("iframe").length).toEqual(1);
238 expect(p.element().querySelectorAll("div.view.widget").length).toEqual(1);
239 expect(p.element().querySelectorAll("div.view.show.widget").length).toEqual(1);
Akron24b570b2026-03-05 17:47:29 +0100240 expect(p.element().querySelector("iframe").getAttribute('sandbox')).toEqual('allow-same-origin'); // Temporary
Akronda32e7a2021-11-16 17:28:57 +0100241
Akronba09ed22020-10-01 16:01:45 +0200242 manager.destroy();
243
244 KorAP.Panel["result"] = undefined;
245 });
Akronfb11a962020-10-05 12:12:55 +0200246
Akrona70b6892021-11-04 14:23:24 +0100247 it('should accept valid registrations for toggle', function () {
248 let p = KorAP.Panel["result"] = panelClass.create();
249
250 let manager = pluginServerClass.create();
251
252 manager.register({
253 name : 'Check',
254 embed : [{
255 panel : 'result',
256 title : 'Glemm',
Akron83a58bc2024-11-08 09:55:19 +0100257 desc : 'Start Glemm',
Akrona70b6892021-11-04 14:23:24 +0100258 onClick : {
Akronda32e7a2021-11-16 17:28:57 +0100259 state : 'check',
Akrona70b6892021-11-04 14:23:24 +0100260 template : 'about:blank',
261 action : 'toggle',
262 'default' : false
263 }
264 }]
265 });
266
267 let b = p.actions().element().firstChild;
268 expect(b.hasAttribute("data-icon")).toBeFalsy();
269 expect(b.hasAttribute("cls")).toBeFalsy();
Akron83a58bc2024-11-08 09:55:19 +0100270 expect(b.lastChild.innerText).toEqual("Glemm");
271 expect(b.getAttribute("title")).toEqual("Start Glemm");
Akrona70b6892021-11-04 14:23:24 +0100272 expect(b.firstChild.classList.contains('button-icon')).toBeTruthy();
273 expect(b.firstChild.classList.contains('check')).toBeTruthy();
274 expect(b.firstChild.classList.contains('checked')).toBeFalsy();
275
276 expect(p.element().querySelectorAll("iframe").length).toEqual(0);
277
Akronda32e7a2021-11-16 17:28:57 +0100278 expect(manager.states().toString()).toEqual("");
279
Akrona70b6892021-11-04 14:23:24 +0100280 b.click();
281
Akronda32e7a2021-11-16 17:28:57 +0100282 expect(manager.states().toString()).toEqual("\"check\":true");
283
Akron83a58bc2024-11-08 09:55:19 +0100284 expect(b.getAttribute("title")).toEqual("Start Glemm");
Akrona70b6892021-11-04 14:23:24 +0100285 expect(b.firstChild.classList.contains('button-icon')).toBeTruthy();
286 expect(b.firstChild.classList.contains('check')).toBeTruthy();
287 expect(b.firstChild.classList.contains('checked')).toBeTruthy();
288
289 // Check with true default
290 p = KorAP.Panel["result"] = panelClass.create();
291
292 manager = pluginServerClass.create();
293
294 manager.register({
295 name : 'Check',
296 embed : [{
297 panel : 'result',
298 title : 'Glemm',
299 onClick : {
300 template : 'about:blank',
301 action : 'toggle',
302 'default' : true
303 }
304 }]
305 });
306
307 b = p.actions().element().firstChild;
308 expect(b.hasAttribute("data-icon")).toBeFalsy();
309 expect(b.hasAttribute("cls")).toBeFalsy();
310 expect(b.getAttribute("title")).toEqual("Glemm");
311 expect(b.firstChild.classList.contains('button-icon')).toBeTruthy();
312 expect(b.firstChild.classList.contains('check')).toBeTruthy();
313 expect(b.firstChild.classList.contains('checked')).toBeTruthy();
314
315 manager.destroy();
316 KorAP.Panel["result"] = undefined;
317 });
318
319
Akron3d013802020-10-07 15:03:38 +0200320 it('should alert on plugin info (1)', function () {
321
322 let alertMsg;
323 spyOn(window, 'alert').and.callFake(function(msg) {
324 alertMsg = msg;
325 });
326
327 let p = KorAP.Panel["result"] = panelClass.create();
328
329 let manager = pluginServerClass.create();
330
331 manager.register({
332 name : 'Check',
333 embed : [{
334 panel : 'result',
335 title : 'Add',
336 onClick : {
337 template : 'about:blank',
338 action : 'setWidget'
339 }
340 }]
341 });
342
343 expect(alertMsg).toBeUndefined();
344
Akron37ea1192021-07-28 10:40:14 +0200345 let b = p.actions().element().firstChild;
Akron3d013802020-10-07 15:03:38 +0200346 b.click();
347
348 // This may only be temporary and should open the plugin window instead
349 p.element().querySelector("span.plugin").click();
350
351 expect(alertMsg).toEqual('Check');
352
353 manager.destroy();
354 KorAP.Panel["result"] = undefined;
355 });
356
357
358 it('should alert on plugin info (2)', function () {
359
360 let alertMsg;
361 spyOn(window, 'alert').and.callFake(function(msg) {
362 alertMsg = msg;
363 });
364
365 let p = KorAP.Panel["result"] = panelClass.create();
366
367 let manager = pluginServerClass.create();
368
369 manager.register({
370 name : 'Check',
371 desc : 'Simple Check plugin',
372 embed : [{
373 panel : 'result',
374 title : 'Add',
375 onClick : {
376 template : 'about:blank',
377 action : 'setWidget'
378 }
379 }]
380 });
381
382 expect(alertMsg).toBeUndefined();
383
Akron37ea1192021-07-28 10:40:14 +0200384 let b = p.actions().element().firstChild;
Akron3d013802020-10-07 15:03:38 +0200385 b.click();
386
387 // This may only be temporary and should open the plugin window instead
388 p.element().querySelector("span.plugin").click();
389
390 expect(alertMsg).toEqual("Check\n\nSimple Check plugin");
391
392 manager.destroy();
393 KorAP.Panel["result"] = undefined;
394 });
395
396
Akronfb11a962020-10-05 12:12:55 +0200397 it('should accept widget permissions', function () {
398 let p = KorAP.Panel["result"] = panelClass.create();
399
400 let manager = pluginServerClass.create();
401
402 manager.register({
403 name : 'Check',
404 embed : [{
405 panel : 'result',
406 title : 'Add',
Akron83a58bc2024-11-08 09:55:19 +0100407 desc : 'Add something',
Akronfb11a962020-10-05 12:12:55 +0200408 onClick : {
409 template : 'about:blank',
410 action : 'addWidget',
Akronce0d8822020-10-05 16:25:40 +0200411 permissions: ['scripts', 'forms', 'all']
Akronfb11a962020-10-05 12:12:55 +0200412 }
413 }]
414 });
415
Akron37ea1192021-07-28 10:40:14 +0200416 let b = p.actions().element().firstChild;
Akron83a58bc2024-11-08 09:55:19 +0100417 expect(b.lastChild.innerText).toEqual("Add");
418 expect(b.getAttribute("title")).toEqual("Add something");
Akronfb11a962020-10-05 12:12:55 +0200419 b.click();
420 expect(p.element().querySelectorAll("iframe").length).toEqual(1);
Marc Kupietz0d0dc6b2026-02-15 08:43:12 +0100421 expect(p.element().querySelector("iframe").getAttribute('sandbox')).toEqual('allow-forms allow-scripts');
Akronfb11a962020-10-05 12:12:55 +0200422 });
Akronb43c8c62018-07-04 18:27:28 +0200423 });
Marc Kupietz0d0dc6b2026-02-15 08:43:12 +0100424
Akronb43c8c62018-07-04 18:27:28 +0200425 describe('KorAP.Plugin.Widget', function () {
426 it('should be initializable', function () {
Akron22598cd2019-12-09 14:59:03 +0100427 expect(function () { widgetClass.create() }).toThrow(new Error("Service not well defined"));
Akron56a11af2018-07-27 18:28:45 +0200428
Akronbb891982020-10-05 16:07:18 +0200429 widget = widgetClass.create({"name" : "Test", "src":"https://example", "id":56});
Akronb43c8c62018-07-04 18:27:28 +0200430 expect(widget).toBeTruthy();
Akron56a11af2018-07-27 18:28:45 +0200431 expect(widget.id).toEqual(56);
432 expect(widget.name).toEqual("Test");
433 expect(widget.src).toEqual("https://example");
434 });
435
436 it('should create a view element', function () {
Akronbb891982020-10-05 16:07:18 +0200437 var widget = widgetClass.create({
438 "name":"Test",
439 "src":"https://example",
440 "id":56,
Akronce0d8822020-10-05 16:25:40 +0200441 "permissions":["scripts","forms"]
Akronbb891982020-10-05 16:07:18 +0200442 });
Akron56a11af2018-07-27 18:28:45 +0200443 var we = widget.element();
444
445 expect(we.tagName).toEqual("DIV");
446 expect(we.classList.contains('view')).toBeTruthy();
447 expect(we.classList.contains('widget')).toBeTruthy();
448
449 var iframe = we.firstChild;
450 expect(iframe.tagName).toEqual("IFRAME");
Marc Kupietz0d0dc6b2026-02-15 08:43:12 +0100451 expect(iframe.getAttribute("sandbox")).toEqual("allow-forms allow-scripts");
Akron56a11af2018-07-27 18:28:45 +0200452 expect(iframe.getAttribute("src")).toEqual("https://example");
453 expect(iframe.getAttribute("name")).toEqual("56");
Akronfb11a962020-10-05 12:12:55 +0200454
Akron56a11af2018-07-27 18:28:45 +0200455 var btn = we.lastChild;
456 expect(btn.classList.contains("button-group")).toBeTruthy();
457 expect(btn.classList.contains("button-view")).toBeTruthy();
458 expect(btn.classList.contains("widget")).toBeTruthy();
459
460 expect(btn.firstChild.tagName).toEqual("SPAN");
461 expect(btn.firstChild.classList.contains("button-icon")).toBeTruthy();
462 expect(btn.firstChild.classList.contains("close")).toBeTruthy();
463 expect(btn.firstChild.firstChild.tagName).toEqual("SPAN");
464
465 expect(btn.lastChild.tagName).toEqual("SPAN");
466 expect(btn.lastChild.classList.contains("button-icon")).toBeTruthy();
467 expect(btn.lastChild.classList.contains("plugin")).toBeTruthy();
468 expect(btn.lastChild.firstChild.tagName).toEqual("SPAN");
469 expect(btn.lastChild.textContent).toEqual("Test");
470 })
Akronfb11a962020-10-05 12:12:55 +0200471
Akron56a11af2018-07-27 18:28:45 +0200472 it('should be resizable', function () {
Akronbb891982020-10-05 16:07:18 +0200473 var widget = widgetClass.create({"name":"Test", "src":"https://example", "id":56});
Akron56a11af2018-07-27 18:28:45 +0200474 var iframe = widget.show();
475 expect(iframe.style.height).toEqual('0px');
476 widget.resize({ height : 9 });
477 expect(iframe.style.height).toEqual('9px');
Akronb43c8c62018-07-04 18:27:28 +0200478 });
Akron3d9ce5e2020-10-01 15:18:36 +0200479
480 it('should be minimizable', function () {
Akronbb891982020-10-05 16:07:18 +0200481 var widget = widgetClass.create({"name":"Test", "src":"https://example", "id":56});
Akron3d9ce5e2020-10-01 15:18:36 +0200482 var we = widget.element();
483 expect(we.classList.contains('show')).toBeTruthy();
484 widget.minimize();
485 expect(we.classList.contains('show')).toBeFalsy();
486 });
Akronb43c8c62018-07-04 18:27:28 +0200487 });
Akron2d0d96d2019-11-18 19:49:50 +0100488
Akron22598cd2019-12-09 14:59:03 +0100489 describe('KorAP.Plugin.Service', function () {
490 it('should be initializable', function () {
491 expect(function () { serviceClass.create() }).toThrow(new Error("Service not well defined"));
492
Akronbb891982020-10-05 16:07:18 +0200493 let service = serviceClass.create({"name":"Test", "src":"https://example", "id":56});
Akron22598cd2019-12-09 14:59:03 +0100494 expect(service).toBeTruthy();
495 expect(service.id).toEqual(56);
496 expect(service.name).toEqual("Test");
497 expect(service.src).toEqual("https://example");
498 });
499
500 it('should be loadable', function () {
Akronbb891982020-10-05 16:07:18 +0200501 let service = serviceClass.create({"name":"Test", "src":"https://example", "id":56});
Akron22598cd2019-12-09 14:59:03 +0100502 expect(service).toBeTruthy();
503
504 let i = service.load();
505 expect(i.tagName).toEqual("IFRAME");
506 expect(i.getAttribute("allowTransparency")).toEqual("true");
507 expect(i.getAttribute("frameborder")).toEqual(''+0);
508 expect(i.getAttribute("name")).toEqual(''+service.id);
509 expect(i.getAttribute("src")).toEqual(service.src);
510 });
Marc Kupietz0d0dc6b2026-02-15 08:43:12 +0100511
512 // Temporary
513 it('should grant same-origin for same-origin plugins', function () {
514 // about:blank inherits current origin
515 let service = serviceClass.create({
516 "name": "Test",
517 "src": window.location.origin + "/plugin.html",
518 "id": 1,
519 "permissions": ["same-origin"]
520 });
521 let iframe = service.load();
522 expect(iframe.getAttribute("sandbox")).toContain("allow-same-origin");
523 });
524 //Temporary
525 it('should deny same-origin for cross-origin plugins', function () {
526 let service = serviceClass.create({
527 "name": "Test",
528 "src": "https://evil.example.com/plugin.html",
529 "id": 2,
530 "permissions": ["same-origin"]
531 });
532 let iframe = service.load();
533 expect(iframe.getAttribute("sandbox")).not.toContain("allow-same-origin");
534 });
535
Akron22598cd2019-12-09 14:59:03 +0100536 });
537
Akron2d0d96d2019-11-18 19:49:50 +0100538 describe('KorAP.Plugin.QueryPanel', function () {
539 it('should establish a query plugin', function () {
540 var queryPanel = queryPanelClass.create();
541
542 var div = document.createElement('div');
543
544 div.appendChild(queryPanel.element());
545 KorAP.Panel = KorAP.Panel || {};
546 KorAP.Panel['query'] = queryPanel;
547
548 // Register plugin afterwards
549 var manager = pluginServerClass.create();
550
551 manager.register({
552 name : 'Check',
553 embed : [{
554 panel : 'query',
555 title : 'Translate',
556 onClick : {
557 template : 'test'
558 }
559 }]
560 });
561
562 expect(manager.buttonGroup('query').length).toEqual(0);
563
564 // Clean up
565 KorAP.Panel['query'] = undefined;
566 manager.destroy();
567 });
hebastaf6adf8d2019-11-26 14:04:10 +0100568
569 it('Plugin buttons should be cleared after adding to panel', function () {
570
571 // Register plugin first
572 KorAP.Plugin = pluginServerClass.create();
573
574 KorAP.Plugin.register({
575 name : 'Check',
576 embed : [{
577 panel : 'query',
578 title : 'Translate',
579 onClick : {
580 template : 'test'
581 }
582 }]
583 });
584
585
586 var queryPanel = queryPanelClass.create();
587 var div = document.createElement('div');
588
589 div.appendChild(queryPanel.element());
590 KorAP.Panel = KorAP.Panel || {};
591 KorAP.Panel['query'] = queryPanel;
592 expect(KorAP.Plugin.buttonGroup('query').length).toEqual(0);
593
594 // Clean up
595 KorAP.Panel['query'] = undefined;
596 KorAP.Plugin.destroy();
597 KorAP.Plugin = undefined;
598 });
Akron2d0d96d2019-11-18 19:49:50 +0100599 });
hebasta043e96f2019-11-28 12:33:00 +0100600
Akron45308ce2020-08-28 14:10:23 +0200601 describe('KorAP.Plugin.ResultPanel', function () {
hebasta043e96f2019-11-28 12:33:00 +0100602 it('Plugin is registered second: buttons should be added to panel', function () {
603
604 var resultPanel = resultPanelClass.create();
605 resultPanel.addAlignAction();
606 var div = document.createElement('div');
607
608 div.appendChild(resultPanel.element());
609 KorAP.Panel = KorAP.Panel || {};
610 KorAP.Panel['result'] = resultPanel;
611
612 // Register plugin afterwards
613 var manager = pluginServerClass.create();
614
615 manager.register({
616 name : 'ResultPlugin',
617 embed : [{
618 panel : 'result',
619 title : 'Dosomething',
620 onClick : {
621 template : 'test'
622 }
623 }]
624 });
625
626 expect(manager.buttonGroup('result').length).toEqual(0);
Akron37ea1192021-07-28 10:40:14 +0200627 expect(KorAP.Panel['result'].actions().element().innerHTML).toContain('Dosomething');
hebasta043e96f2019-11-28 12:33:00 +0100628
629 // Clean up
630 KorAP.Panel['result'] = undefined;
631 manager.destroy();
Akron45308ce2020-08-28 14:10:23 +0200632 });
hebasta043e96f2019-11-28 12:33:00 +0100633
634 it('Plugin is registered first: Buttons should be added to panel and cleared', function () {
635
636 // Register plugin first
637 KorAP.Plugin = pluginServerClass.create();
638
639 KorAP.Plugin.register({
640 name : 'ResultPlugin',
641 embed : [{
642 panel : 'result',
643 title : 'Dosomething',
644 onClick : {
645 template : 'test'
646 }
647 }]
648 });
649
650 expect(KorAP.Plugin.buttonGroup('result').length).toEqual(1);
651
652 var resultPanel = resultPanelClass.create();
653 var div = document.createElement('div');
654 div.appendChild(resultPanel.element());
655 KorAP.Panel = KorAP.Panel || {};
656 KorAP.Panel['result'] = resultPanel;
657 expect(KorAP.Plugin.buttonGroup('result').length).toEqual(0);
Akron37ea1192021-07-28 10:40:14 +0200658 expect(KorAP.Panel['result'].actions().element().innerHTML).toContain('Dosomething');
hebasta043e96f2019-11-28 12:33:00 +0100659
660 // Clean up
661 KorAP.Panel['result'] = undefined;
662 KorAP.Plugin.destroy();
663 KorAP.Plugin = undefined;
664 });
665 });
Akronfec66a32020-08-28 13:01:14 +0200666
667 describe('KorAP.Plugin communications', function () {
668 it('should receive messages', function () {
669 var manager = pluginServerClass.create();
Akronbb891982020-10-05 16:07:18 +0200670 var id = manager.addService({"name":'Example 1', "src":'about:blank'});
Akronfec66a32020-08-28 13:01:14 +0200671 expect(id).toMatch(/^id-/);
Akronfec66a32020-08-28 13:01:14 +0200672 var temp = KorAP.koralQuery;
673 KorAP.koralQuery = { "@type" : "koral:test" };
Akronfec66a32020-08-28 13:01:14 +0200674 let data = {
675 "originID" : id,
676 "action" : "get",
677 "key" : "KQ"
678 };
Akronfec66a32020-08-28 13:01:14 +0200679 manager._receiveMsg({
680 "data" : data
681 });
Akronfec66a32020-08-28 13:01:14 +0200682 manager.destroy();
Akronfec66a32020-08-28 13:01:14 +0200683 expect(data.value["@type"]).toEqual("koral:test");
Akronfec66a32020-08-28 13:01:14 +0200684 // Recreate initial state
685 KorAP.koralQuery = temp;
686 });
687
Akronfec66a32020-08-28 13:01:14 +0200688 it('should add to pipe', function () {
689 var manager = pluginServerClass.create();
Akronfec66a32020-08-28 13:01:14 +0200690 var temp = KorAP.Pipe;
691 KorAP.Pipe = pipeClass.create();
Akronfec66a32020-08-28 13:01:14 +0200692 expect(KorAP.Pipe.toString()).toEqual("");
693
Akronbb891982020-10-05 16:07:18 +0200694 var id = manager.addService({"name":'Example 2', "src":'about:blank'});
Akronfec66a32020-08-28 13:01:14 +0200695 expect(id).toMatch(/^id-/);
Akronfec66a32020-08-28 13:01:14 +0200696 manager._receiveMsg({
697 "data" : {
698 "originID" : id,
699 "action" : "pipe",
700 "job" : "add",
701 "service" : "https://pipe-service.de"
702 }
703 });
Akronfec66a32020-08-28 13:01:14 +0200704 expect(KorAP.Pipe.toString()).toEqual("https://pipe-service.de");
Akronfec66a32020-08-28 13:01:14 +0200705 manager._receiveMsg({
706 "data" : {
707 "originID" : id,
708 "action" : "pipe",
709 "job" : "add",
710 "service" : "https://pipe-service-2.de"
711 }
712 });
Akronfec66a32020-08-28 13:01:14 +0200713 expect(KorAP.Pipe.toString()).toEqual("https://pipe-service.de,https://pipe-service-2.de");
Akronfec66a32020-08-28 13:01:14 +0200714 manager._receiveMsg({
715 "data" : {
716 "originID" : id,
717 "action" : "pipe",
718 "job" : "del",
719 "service" : "https://pipe-service.de"
720 }
721 });
Akronfec66a32020-08-28 13:01:14 +0200722 expect(KorAP.Pipe.toString()).toEqual("https://pipe-service-2.de");
Akronfec66a32020-08-28 13:01:14 +0200723 manager.destroy();
Akronfec66a32020-08-28 13:01:14 +0200724 // Recreate initial state
725 KorAP.Pipe = temp;
726 });
Akron45308ce2020-08-28 14:10:23 +0200727
Akron26d57f22021-09-10 16:48:57 +0200728 it('should reply to query information requests (queryform)', function () {
Akron45308ce2020-08-28 14:10:23 +0200729 var manager = pluginServerClass.create();
Akronbb891982020-10-05 16:07:18 +0200730 var id = manager.addService({"name":'Service', "src":'about:blank'});
Akron45308ce2020-08-28 14:10:23 +0200731 expect(id).toMatch(/^id-/);
732 var temp = KorAP.vc;
733 // Create form for query form information
734 let f = document.createElement('form');
735 var qfield = f.addE('input');
736 qfield.setAttribute("id", "q-field");
737 qfield.value = "[orth=Baum]";
738 var qlfield = f.addE('select');
739 qlfield.setAttribute("id", "ql-field");
740 qlfield.addE('option').setAttribute('value', 'cosmas-2');
741 qlfield.addE('option').setAttribute('value', 'poliqarp');
742 qlfield.selectedIndex = 1;
743
744 KorAP.vc = vcClass.create().fromJson({
745 "key" : "title",
746 "type" : "type:regex",
747 "value" : "[^b]ee.+?",
748 "@type" : "koral:doc"
749 });
750 // console.log(KorAP.vc.toQuery());
751
752 document.body.appendChild(f);
753 let data = {
754 "originID" : id,
755 "action" : "get",
756 "key" : "QueryForm"
757 };
758 manager._receiveMsg({
759 "data" : data
760 });
761 manager.destroy();
762 expect(data.value["q"]).toEqual("[orth=Baum]");
763 expect(data.value["ql"]).toEqual("poliqarp");
764 expect(data.value["cq"]).toEqual("title = /[^b]ee.+?/");
Akron26d57f22021-09-10 16:48:57 +0200765
Akron45308ce2020-08-28 14:10:23 +0200766 // Recreate initial state
767 KorAP.vc = temp;
768 document.body.removeChild(f);
769 });
Akron26d57f22021-09-10 16:48:57 +0200770
Akrone03faf62024-11-14 11:51:04 +0100771 it('should send messages', function () {
772 let qel = document.createElement('input');
773 qel.setAttribute('id','q-field');
774
775 let qlel = document.createElement('select');
776 qlel.setAttribute('id','ql-field');
777 qlel.innerHTML = '<option value="poliqarp">Poliqarp</option><option value="cosmas2">Cosmas II</option><option value="annis">Annis QL</option><option value="cqp">CQP (neu)</option><option value="cql">CQL v1.2</option><option value="fcsql">FCSQL</option>';
778
779 document.body.appendChild(qel);
780 document.body.appendChild(qlel);
781
782 var manager = pluginServerClass.create();
783 var id = manager.addService({"name":'Example 1', "src":'about:blank'});
784 expect(id).toMatch(/^id-/);
785
786 let data = {
787 "originID" : id,
788 "action" : "set",
789 "key" : "QueryForm",
790 "value" : {
791 "q" : "test3",
792 "ql" : "cosmas2"
793 }
794 };
795
796 manager._receiveMsg({
797 "data" : data
798 });
799 manager.destroy();
800 expect(qel.value).toEqual("test3");
801 expect(qlel.value).toEqual("cosmas2");
802 // Recreate initial state
803
804 qel.remove();
805 qlel.remove();
806 });
807
808
Akron26d57f22021-09-10 16:48:57 +0200809 it('should reply to query information requests (pagination)', function () {
810 var manager = pluginServerClass.create();
811 var id = manager.addService({"name":'Service', "src":'about:blank'});
812 expect(id).toMatch(/^id-/);
813
814 // Create pagination element for pagination information
815 let p = document.createElement('div');
816 p.setAttribute('id', 'pagination')
817 p.setAttribute('data-page',3);
818 p.setAttribute('data-total',30);
819 p.setAttribute('data-count',25);
820
821 document.body.appendChild(p);
822
823 let data = {
824 "originID" : id,
825 "action" : "get",
826 "key" : "Pagination"
827 };
828 manager._receiveMsg({
829 "data" : data
830 });
831 manager.destroy();
832 expect(data.value["count"]).toEqual(25);
833 expect(data.value["page"]).toEqual(3);
834 expect(data.value["total"]).toEqual(30);
835
836 // Recreate initial state
837 document.body.removeChild(p);
838 });
Akronfec66a32020-08-28 13:01:14 +0200839 });
Akronb43c8c62018-07-04 18:27:28 +0200840});