blob: cabeae935b8ca3dd7d7974e82df1874dd54f1485 [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();
14 var id = manager.addWidget(panel, 'Example 1', '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
42 var id = manager.addService('Example 1', 'about:blank');
43 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();
56 var id = manager.addWidget(panel, 'Example 2', 'about:blank');
57 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 });
116
117 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 });
Akronb43c8c62018-07-04 18:27:28 +0200153 });
Akron2d0d96d2019-11-18 19:49:50 +0100154
Akronb43c8c62018-07-04 18:27:28 +0200155 describe('KorAP.Plugin.Widget', function () {
156 it('should be initializable', function () {
Akron22598cd2019-12-09 14:59:03 +0100157 expect(function () { widgetClass.create() }).toThrow(new Error("Service not well defined"));
Akron56a11af2018-07-27 18:28:45 +0200158
159 widget = widgetClass.create("Test", "https://example", 56);
Akronb43c8c62018-07-04 18:27:28 +0200160 expect(widget).toBeTruthy();
Akron56a11af2018-07-27 18:28:45 +0200161 expect(widget.id).toEqual(56);
162 expect(widget.name).toEqual("Test");
163 expect(widget.src).toEqual("https://example");
164 });
165
166 it('should create a view element', function () {
167 var widget = widgetClass.create("Test", "https://example", 56);
168 var we = widget.element();
169
170 expect(we.tagName).toEqual("DIV");
171 expect(we.classList.contains('view')).toBeTruthy();
172 expect(we.classList.contains('widget')).toBeTruthy();
173
174 var iframe = we.firstChild;
175 expect(iframe.tagName).toEqual("IFRAME");
hebasta78913242020-03-30 13:39:20 +0200176 expect(iframe.getAttribute("sandbox")).toEqual("allow-scripts allow-forms");
Akron56a11af2018-07-27 18:28:45 +0200177 expect(iframe.getAttribute("src")).toEqual("https://example");
178 expect(iframe.getAttribute("name")).toEqual("56");
179
180 var btn = we.lastChild;
181 expect(btn.classList.contains("button-group")).toBeTruthy();
182 expect(btn.classList.contains("button-view")).toBeTruthy();
183 expect(btn.classList.contains("widget")).toBeTruthy();
184
185 expect(btn.firstChild.tagName).toEqual("SPAN");
186 expect(btn.firstChild.classList.contains("button-icon")).toBeTruthy();
187 expect(btn.firstChild.classList.contains("close")).toBeTruthy();
188 expect(btn.firstChild.firstChild.tagName).toEqual("SPAN");
189
190 expect(btn.lastChild.tagName).toEqual("SPAN");
191 expect(btn.lastChild.classList.contains("button-icon")).toBeTruthy();
192 expect(btn.lastChild.classList.contains("plugin")).toBeTruthy();
193 expect(btn.lastChild.firstChild.tagName).toEqual("SPAN");
194 expect(btn.lastChild.textContent).toEqual("Test");
195 })
196
197 it('should be resizable', function () {
198 var widget = widgetClass.create("Test", "https://example", 56);
199 var iframe = widget.show();
200 expect(iframe.style.height).toEqual('0px');
201 widget.resize({ height : 9 });
202 expect(iframe.style.height).toEqual('9px');
Akronb43c8c62018-07-04 18:27:28 +0200203 });
Akron3d9ce5e2020-10-01 15:18:36 +0200204
205 it('should be minimizable', function () {
206 var widget = widgetClass.create("Test", "https://example", 56);
207 var we = widget.element();
208 expect(we.classList.contains('show')).toBeTruthy();
209 widget.minimize();
210 expect(we.classList.contains('show')).toBeFalsy();
211 });
Akronb43c8c62018-07-04 18:27:28 +0200212 });
Akron2d0d96d2019-11-18 19:49:50 +0100213
Akron22598cd2019-12-09 14:59:03 +0100214 describe('KorAP.Plugin.Service', function () {
215 it('should be initializable', function () {
216 expect(function () { serviceClass.create() }).toThrow(new Error("Service not well defined"));
217
218 let service = serviceClass.create("Test", "https://example", 56);
219 expect(service).toBeTruthy();
220 expect(service.id).toEqual(56);
221 expect(service.name).toEqual("Test");
222 expect(service.src).toEqual("https://example");
223 });
224
225 it('should be loadable', function () {
226 let service = serviceClass.create("Test", "https://example", 56);
227 expect(service).toBeTruthy();
228
229 let i = service.load();
230 expect(i.tagName).toEqual("IFRAME");
231 expect(i.getAttribute("allowTransparency")).toEqual("true");
232 expect(i.getAttribute("frameborder")).toEqual(''+0);
233 expect(i.getAttribute("name")).toEqual(''+service.id);
234 expect(i.getAttribute("src")).toEqual(service.src);
235 });
236 });
237
Akron2d0d96d2019-11-18 19:49:50 +0100238 describe('KorAP.Plugin.QueryPanel', function () {
239 it('should establish a query plugin', function () {
240 var queryPanel = queryPanelClass.create();
241
242 var div = document.createElement('div');
243
244 div.appendChild(queryPanel.element());
245 KorAP.Panel = KorAP.Panel || {};
246 KorAP.Panel['query'] = queryPanel;
247
248 // Register plugin afterwards
249 var manager = pluginServerClass.create();
250
251 manager.register({
252 name : 'Check',
253 embed : [{
254 panel : 'query',
255 title : 'Translate',
256 onClick : {
257 template : 'test'
258 }
259 }]
260 });
261
262 expect(manager.buttonGroup('query').length).toEqual(0);
263
264 // Clean up
265 KorAP.Panel['query'] = undefined;
266 manager.destroy();
267 });
hebastaf6adf8d2019-11-26 14:04:10 +0100268
269 it('Plugin buttons should be cleared after adding to panel', function () {
270
271 // Register plugin first
272 KorAP.Plugin = pluginServerClass.create();
273
274 KorAP.Plugin.register({
275 name : 'Check',
276 embed : [{
277 panel : 'query',
278 title : 'Translate',
279 onClick : {
280 template : 'test'
281 }
282 }]
283 });
284
285
286 var queryPanel = queryPanelClass.create();
287 var div = document.createElement('div');
288
289 div.appendChild(queryPanel.element());
290 KorAP.Panel = KorAP.Panel || {};
291 KorAP.Panel['query'] = queryPanel;
292 expect(KorAP.Plugin.buttonGroup('query').length).toEqual(0);
293
294 // Clean up
295 KorAP.Panel['query'] = undefined;
296 KorAP.Plugin.destroy();
297 KorAP.Plugin = undefined;
298 });
Akron2d0d96d2019-11-18 19:49:50 +0100299 });
hebasta043e96f2019-11-28 12:33:00 +0100300
Akron45308ce2020-08-28 14:10:23 +0200301 describe('KorAP.Plugin.ResultPanel', function () {
hebasta043e96f2019-11-28 12:33:00 +0100302 it('Plugin is registered second: buttons should be added to panel', function () {
303
304 var resultPanel = resultPanelClass.create();
305 resultPanel.addAlignAction();
306 var div = document.createElement('div');
307
308 div.appendChild(resultPanel.element());
309 KorAP.Panel = KorAP.Panel || {};
310 KorAP.Panel['result'] = resultPanel;
311
312 // Register plugin afterwards
313 var manager = pluginServerClass.create();
314
315 manager.register({
316 name : 'ResultPlugin',
317 embed : [{
318 panel : 'result',
319 title : 'Dosomething',
320 onClick : {
321 template : 'test'
322 }
323 }]
324 });
325
326 expect(manager.buttonGroup('result').length).toEqual(0);
327 expect(KorAP.Panel['result'].actions.element().innerHTML).toContain('Dosomething');
328
329 // Clean up
330 KorAP.Panel['result'] = undefined;
331 manager.destroy();
Akron45308ce2020-08-28 14:10:23 +0200332 });
hebasta043e96f2019-11-28 12:33:00 +0100333
334 it('Plugin is registered first: Buttons should be added to panel and cleared', function () {
335
336 // Register plugin first
337 KorAP.Plugin = pluginServerClass.create();
338
339 KorAP.Plugin.register({
340 name : 'ResultPlugin',
341 embed : [{
342 panel : 'result',
343 title : 'Dosomething',
344 onClick : {
345 template : 'test'
346 }
347 }]
348 });
349
350 expect(KorAP.Plugin.buttonGroup('result').length).toEqual(1);
351
352 var resultPanel = resultPanelClass.create();
353 var div = document.createElement('div');
354 div.appendChild(resultPanel.element());
355 KorAP.Panel = KorAP.Panel || {};
356 KorAP.Panel['result'] = resultPanel;
357 expect(KorAP.Plugin.buttonGroup('result').length).toEqual(0);
358 expect(KorAP.Panel['result'].actions.element().innerHTML).toContain('Dosomething');
359
360 // Clean up
361 KorAP.Panel['result'] = undefined;
362 KorAP.Plugin.destroy();
363 KorAP.Plugin = undefined;
364 });
365 });
Akronfec66a32020-08-28 13:01:14 +0200366
367 describe('KorAP.Plugin communications', function () {
368 it('should receive messages', function () {
369 var manager = pluginServerClass.create();
Akronfec66a32020-08-28 13:01:14 +0200370 var id = manager.addService('Example 1', 'about:blank');
371 expect(id).toMatch(/^id-/);
Akronfec66a32020-08-28 13:01:14 +0200372 var temp = KorAP.koralQuery;
373 KorAP.koralQuery = { "@type" : "koral:test" };
Akronfec66a32020-08-28 13:01:14 +0200374 let data = {
375 "originID" : id,
376 "action" : "get",
377 "key" : "KQ"
378 };
Akronfec66a32020-08-28 13:01:14 +0200379 manager._receiveMsg({
380 "data" : data
381 });
Akronfec66a32020-08-28 13:01:14 +0200382 manager.destroy();
Akronfec66a32020-08-28 13:01:14 +0200383 expect(data.value["@type"]).toEqual("koral:test");
Akronfec66a32020-08-28 13:01:14 +0200384 // Recreate initial state
385 KorAP.koralQuery = temp;
386 });
387
Akronfec66a32020-08-28 13:01:14 +0200388 it('should add to pipe', function () {
389 var manager = pluginServerClass.create();
Akronfec66a32020-08-28 13:01:14 +0200390 var temp = KorAP.Pipe;
391 KorAP.Pipe = pipeClass.create();
Akronfec66a32020-08-28 13:01:14 +0200392 expect(KorAP.Pipe.toString()).toEqual("");
393
394 var id = manager.addService('Example 2', 'about:blank');
395 expect(id).toMatch(/^id-/);
Akronfec66a32020-08-28 13:01:14 +0200396 manager._receiveMsg({
397 "data" : {
398 "originID" : id,
399 "action" : "pipe",
400 "job" : "add",
401 "service" : "https://pipe-service.de"
402 }
403 });
Akronfec66a32020-08-28 13:01:14 +0200404 expect(KorAP.Pipe.toString()).toEqual("https://pipe-service.de");
Akronfec66a32020-08-28 13:01:14 +0200405 manager._receiveMsg({
406 "data" : {
407 "originID" : id,
408 "action" : "pipe",
409 "job" : "add",
410 "service" : "https://pipe-service-2.de"
411 }
412 });
Akronfec66a32020-08-28 13:01:14 +0200413 expect(KorAP.Pipe.toString()).toEqual("https://pipe-service.de,https://pipe-service-2.de");
Akronfec66a32020-08-28 13:01:14 +0200414 manager._receiveMsg({
415 "data" : {
416 "originID" : id,
417 "action" : "pipe",
418 "job" : "del",
419 "service" : "https://pipe-service.de"
420 }
421 });
Akronfec66a32020-08-28 13:01:14 +0200422 expect(KorAP.Pipe.toString()).toEqual("https://pipe-service-2.de");
Akronfec66a32020-08-28 13:01:14 +0200423 manager.destroy();
Akronfec66a32020-08-28 13:01:14 +0200424 // Recreate initial state
425 KorAP.Pipe = temp;
426 });
Akron45308ce2020-08-28 14:10:23 +0200427
428 it('should reply to query information requests', function () {
429 var manager = pluginServerClass.create();
430 var id = manager.addService('Service', 'about:blank');
431 expect(id).toMatch(/^id-/);
432 var temp = KorAP.vc;
433 // Create form for query form information
434 let f = document.createElement('form');
435 var qfield = f.addE('input');
436 qfield.setAttribute("id", "q-field");
437 qfield.value = "[orth=Baum]";
438 var qlfield = f.addE('select');
439 qlfield.setAttribute("id", "ql-field");
440 qlfield.addE('option').setAttribute('value', 'cosmas-2');
441 qlfield.addE('option').setAttribute('value', 'poliqarp');
442 qlfield.selectedIndex = 1;
443
444 KorAP.vc = vcClass.create().fromJson({
445 "key" : "title",
446 "type" : "type:regex",
447 "value" : "[^b]ee.+?",
448 "@type" : "koral:doc"
449 });
450 // console.log(KorAP.vc.toQuery());
451
452 document.body.appendChild(f);
453 let data = {
454 "originID" : id,
455 "action" : "get",
456 "key" : "QueryForm"
457 };
458 manager._receiveMsg({
459 "data" : data
460 });
461 manager.destroy();
462 expect(data.value["q"]).toEqual("[orth=Baum]");
463 expect(data.value["ql"]).toEqual("poliqarp");
464 expect(data.value["cq"]).toEqual("title = /[^b]ee.+?/");
465 // Recreate initial state
466 KorAP.vc = temp;
467 document.body.removeChild(f);
468 });
Akronfec66a32020-08-28 13:01:14 +0200469 });
Akronb43c8c62018-07-04 18:27:28 +0200470});