@gravitee/ui-policy-studio-angular 7.7.1 → 7.8.0-fix-export-toogle-directive-2b05de7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/esm2020/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog-result.model.mjs +17 -0
  2. package/esm2020/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.mjs +60 -0
  3. package/esm2020/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.mjs +17 -5
  4. package/esm2020/lib/components/flows-menu/gio-ps-flows-menu.component.mjs +28 -3
  5. package/esm2020/lib/gio-policy-studio.component.mjs +15 -4
  6. package/esm2020/lib/gio-policy-studio.module.mjs +12 -2
  7. package/esm2020/lib/models/SaveOutput.mjs +1 -1
  8. package/esm2020/lib/models/flow/HttpMethod.mjs +27 -1
  9. package/esm2020/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.mjs +60 -0
  10. package/esm2020/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.mjs +48 -7
  11. package/esm2020/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.mjs +36 -7
  12. package/esm2020/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.mjs +4 -1
  13. package/esm2020/testing/lib/gio-policy-studio.harness.mjs +8 -1
  14. package/esm2020/testing/lib/models/SaveOutput.mjs +1 -1
  15. package/esm2020/testing/lib/models/flow/FlowExecution.fixture.mjs +43 -0
  16. package/esm2020/testing/lib/models/flow/HttpMethod.mjs +27 -1
  17. package/esm2020/testing/lib/models/flow/index-testing.mjs +2 -1
  18. package/fesm2015/gravitee-ui-policy-studio-angular-testing.mjs +207 -13
  19. package/fesm2015/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
  20. package/fesm2015/gravitee-ui-policy-studio-angular.mjs +142 -17
  21. package/fesm2015/gravitee-ui-policy-studio-angular.mjs.map +1 -1
  22. package/fesm2020/gravitee-ui-policy-studio-angular-testing.mjs +191 -13
  23. package/fesm2020/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
  24. package/fesm2020/gravitee-ui-policy-studio-angular.mjs +142 -14
  25. package/fesm2020/gravitee-ui-policy-studio-angular.mjs.map +1 -1
  26. package/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog-result.model.d.ts +2 -0
  27. package/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.d.ts +17 -0
  28. package/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.d.ts +1 -0
  29. package/lib/components/flows-menu/gio-ps-flows-menu.component.d.ts +5 -2
  30. package/lib/gio-policy-studio.component.d.ts +5 -2
  31. package/lib/gio-policy-studio.module.d.ts +18 -16
  32. package/lib/models/SaveOutput.d.ts +2 -1
  33. package/lib/models/flow/HttpMethod.d.ts +1 -0
  34. package/package.json +1 -1
  35. package/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.d.ts +13 -0
  36. package/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.d.ts +21 -0
  37. package/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.d.ts +18 -0
  38. package/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.d.ts +1 -0
  39. package/testing/lib/gio-policy-studio.harness.d.ts +2 -1
  40. package/testing/lib/models/SaveOutput.d.ts +2 -1
  41. package/testing/lib/models/flow/FlowExecution.fixture.d.ts +3 -0
  42. package/testing/lib/models/flow/HttpMethod.d.ts +1 -0
  43. package/testing/lib/models/flow/index-testing.d.ts +1 -0
@@ -5,6 +5,7 @@ import { DivHarness, SpanHarness } from '@gravitee/ui-particles-angular/testing'
5
5
  import { MatInputHarness } from '@angular/material/input/testing';
6
6
  import { MatSelectHarness } from '@angular/material/select/testing';
7
7
  import { GioFormTagsInputHarness } from '@gravitee/ui-particles-angular';
8
+ import { MatSlideToggleHarness } from '@angular/material/slide-toggle/testing';
8
9
 
9
10
  /*
10
11
  * Copyright (C) 2023 The Gravitee team (http://gravitee.io)
@@ -71,6 +72,48 @@ function fakeHttpFlow(modifier) {
71
72
  };
72
73
  }
73
74
 
75
+ /*
76
+ * Copyright (C) 2023 The Gravitee team (http://gravitee.io)
77
+ *
78
+ * Licensed under the Apache License, Version 2.0 (the "License");
79
+ * you may not use this file except in compliance with the License.
80
+ * You may obtain a copy of the License at
81
+ *
82
+ * http://www.apache.org/licenses/LICENSE-2.0
83
+ *
84
+ * Unless required by applicable law or agreed to in writing, software
85
+ * distributed under the License is distributed on an "AS IS" BASIS,
86
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
87
+ * See the License for the specific language governing permissions and
88
+ * limitations under the License.
89
+ */
90
+ function fakeBestMatchFlowExecution(modifier) {
91
+ const base = {
92
+ mode: 'BEST_MATCH',
93
+ matchRequired: false,
94
+ };
95
+ if (isFunction(modifier)) {
96
+ return modifier(base);
97
+ }
98
+ return {
99
+ ...base,
100
+ ...modifier,
101
+ };
102
+ }
103
+ function fakeDefaultFlowExecution(modifier) {
104
+ const base = {
105
+ mode: 'DEFAULT',
106
+ matchRequired: false,
107
+ };
108
+ if (isFunction(modifier)) {
109
+ return modifier(base);
110
+ }
111
+ return {
112
+ ...base,
113
+ ...modifier,
114
+ };
115
+ }
116
+
74
117
  /*
75
118
  * Copyright (C) 2022 The Gravitee team (http://gravitee.io)
76
119
  *
@@ -209,6 +252,9 @@ class GioPolicyStudioFlowsMenuHarness extends ComponentHarness {
209
252
  await (await flowsGroups.childLocatorFor(MatButtonHarness.with({ ancestor: '.list__flowsGroup__header__addBtn' }))()).click();
210
253
  }
211
254
  }
255
+ async openFlowExecutionConfig() {
256
+ await (await this.locatorFor(MatButtonHarness.with({ selector: '.header__configBtn_edit' }))())?.click();
257
+ }
212
258
  }
213
259
  GioPolicyStudioFlowsMenuHarness.hostSelector = 'gio-ps-flows-menu';
214
260
 
@@ -303,17 +349,19 @@ class GioPolicyStudioFlowProxyFormDialogHarness extends ComponentHarness {
303
349
  super(...arguments);
304
350
  this.getSaveBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__saveBtn' }));
305
351
  this.getCancelBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__cancelBtn' }));
352
+ this.nameInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName="name"]' }));
353
+ this.pathOperatorInput = this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="pathOperator"]' }));
354
+ this.pathInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName="path"]' }));
355
+ this.methodsInput = this.locatorFor(GioFormTagsInputHarness.with({ selector: '[formControlName="methods"]' }));
356
+ this.conditionInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName="condition"]' }));
306
357
  }
307
358
  async setFlowFormValues(flow) {
308
- const nameInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName="name"]' }))();
309
- const pathOperatorInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="pathOperator"]' }))();
310
- const pathInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName="path"]' }))();
311
- const methodsInput = await this.locatorFor(GioFormTagsInputHarness.with({ selector: '[formControlName="methods"]' }))();
312
- const conditionInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName="condition"]' }))();
313
359
  if (flow.name) {
360
+ const nameInput = await this.nameInput();
314
361
  await nameInput.setValue(flow.name);
315
362
  }
316
363
  if (flow.pathOperator) {
364
+ const pathOperatorInput = await this.pathOperatorInput();
317
365
  await pathOperatorInput.open();
318
366
  // Unselect all options before selecting the new one
319
367
  for (const option of await pathOperatorInput.getOptions()) {
@@ -324,18 +372,45 @@ class GioPolicyStudioFlowProxyFormDialogHarness extends ComponentHarness {
324
372
  await pathOperatorInput.clickOptions({ text: new RegExp(flow.pathOperator, 'i') });
325
373
  }
326
374
  if (flow.path) {
327
- await pathInput.setValue(flow.path);
375
+ const input = await this.pathInput();
376
+ await input.setValue(flow.path);
328
377
  }
329
378
  if (flow.methods) {
379
+ const methodsInput = await this.methodsInput();
330
380
  await methodsInput.removeTag('ALL');
331
381
  for await (const method of flow.methods) {
332
382
  await methodsInput.addTag(method);
333
383
  }
334
384
  }
335
385
  if (flow.condition) {
386
+ const conditionInput = await this.conditionInput();
336
387
  await conditionInput.setValue(flow.condition);
337
388
  }
338
389
  }
390
+ async getFlowFormValues() {
391
+ return {
392
+ name: await this.getFlowName(),
393
+ pathOperator: await this.getPathOperator(),
394
+ path: await this.getFlowPath(),
395
+ methods: await this.getMethods(),
396
+ condition: await this.getCondition(),
397
+ };
398
+ }
399
+ async getFlowName() {
400
+ return this.nameInput().then(input => input.getValue());
401
+ }
402
+ async getFlowPath() {
403
+ return this.pathInput().then(input => input.getValue());
404
+ }
405
+ async getPathOperator() {
406
+ return this.pathOperatorInput().then(input => input.getValueText());
407
+ }
408
+ async getMethods() {
409
+ return this.methodsInput().then(input => input.getTags());
410
+ }
411
+ async getCondition() {
412
+ return this.conditionInput().then(input => input.getValue());
413
+ }
339
414
  async save() {
340
415
  const button = await this.getSaveBtn();
341
416
  await button.click();
@@ -367,18 +442,21 @@ class GioPolicyStudioFlowMessageFormDialogHarness extends ComponentHarness {
367
442
  super(...arguments);
368
443
  this.getSaveBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__saveBtn' }));
369
444
  this.getCancelBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__cancelBtn' }));
445
+ this.nameInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName="name"]' }));
446
+ this.channelOperatorInput = this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="channelOperator"]' }));
447
+ this.channelInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName="channel"]' }));
448
+ this.operationsInput = this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="operations"]' }));
449
+ this.entrypointsInput = this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="entrypoints"]' }));
450
+ this.conditionInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName="condition"]' }));
370
451
  }
371
452
  async setFlowFormValues(flow) {
372
- const nameInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName="name"]' }))();
373
- const channelOperatorInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="channelOperator"]' }))();
374
- const channelInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName="channel"]' }))();
375
- const operationsInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="operations"]' }))();
376
- const entrypointsInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="entrypoints"]' }))();
377
- const conditionInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName="condition"]' }))();
378
453
  if (flow.name) {
454
+ const nameInput = await this.nameInput();
379
455
  await nameInput.setValue(flow.name);
380
456
  }
381
457
  if (flow.channelOperator) {
458
+ const channelOperatorInput = await this.channelOperatorInput();
459
+ const entrypointsInput = await this.entrypointsInput();
382
460
  await channelOperatorInput.open();
383
461
  // Unselect all options before selecting the new one
384
462
  for (const option of await entrypointsInput.getOptions()) {
@@ -389,9 +467,11 @@ class GioPolicyStudioFlowMessageFormDialogHarness extends ComponentHarness {
389
467
  await channelOperatorInput.clickOptions({ text: new RegExp(flow.channelOperator, 'i') });
390
468
  }
391
469
  if (flow.channel) {
470
+ const channelInput = await this.channelInput();
392
471
  await channelInput.setValue(flow.channel);
393
472
  }
394
473
  if (flow.operations) {
474
+ const operationsInput = await this.operationsInput();
395
475
  await parallel(() => (flow.operations ?? []).map(async (operation) => {
396
476
  await operationsInput.open();
397
477
  // Unselect all options before selecting the new one
@@ -404,6 +484,7 @@ class GioPolicyStudioFlowMessageFormDialogHarness extends ComponentHarness {
404
484
  }));
405
485
  }
406
486
  if (flow.entrypoints) {
487
+ const entrypointsInput = await this.entrypointsInput();
407
488
  await entrypointsInput.open();
408
489
  // Unselect all options before selecting the new one
409
490
  for (const option of await entrypointsInput.getOptions()) {
@@ -416,9 +497,28 @@ class GioPolicyStudioFlowMessageFormDialogHarness extends ComponentHarness {
416
497
  }));
417
498
  }
418
499
  if (flow.condition) {
500
+ const conditionInput = await this.conditionInput();
419
501
  await conditionInput.setValue(flow.condition);
420
502
  }
421
503
  }
504
+ async getName() {
505
+ return this.nameInput().then(input => input.getValue());
506
+ }
507
+ async getChannelOperator() {
508
+ return this.channelOperatorInput().then(input => input.getValueText());
509
+ }
510
+ async getChannel() {
511
+ return this.channelInput().then(input => input.getValue());
512
+ }
513
+ async getOperations() {
514
+ return this.operationsInput().then(input => input.getValueText());
515
+ }
516
+ async getEntrypoints() {
517
+ return this.entrypointsInput().then(input => input.getValueText());
518
+ }
519
+ async getCondition() {
520
+ return this.conditionInput().then(input => input.getValue());
521
+ }
422
522
  async save() {
423
523
  const button = await this.getSaveBtn();
424
524
  await button.click();
@@ -427,9 +527,81 @@ class GioPolicyStudioFlowMessageFormDialogHarness extends ComponentHarness {
427
527
  const button = await this.getCancelBtn();
428
528
  await button.click();
429
529
  }
530
+ async getFormValues() {
531
+ const name = await this.getName();
532
+ const channelOperator = await this.getChannelOperator();
533
+ const channel = await this.getChannel();
534
+ const entrypoints = (await this.getEntrypoints()).split(',');
535
+ const operations = (await this.getOperations()).split(',');
536
+ const condition = await this.getCondition();
537
+ return {
538
+ name,
539
+ channel,
540
+ channelOperator,
541
+ entrypoints,
542
+ operations,
543
+ condition,
544
+ };
545
+ }
430
546
  }
431
547
  GioPolicyStudioFlowMessageFormDialogHarness.hostSelector = 'gio-ps-flow-message-form-dialog';
432
548
 
549
+ /*
550
+ * Copyright (C) 2022 The Gravitee team (http://gravitee.io)
551
+ *
552
+ * Licensed under the Apache License, Version 2.0 (the "License");
553
+ * you may not use this file except in compliance with the License.
554
+ * You may obtain a copy of the License at
555
+ *
556
+ * http://www.apache.org/licenses/LICENSE-2.0
557
+ *
558
+ * Unless required by applicable law or agreed to in writing, software
559
+ * distributed under the License is distributed on an "AS IS" BASIS,
560
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
561
+ * See the License for the specific language governing permissions and
562
+ * limitations under the License.
563
+ */
564
+ class GioPolicyStudioFlowExecutionFormDialogHarness extends ComponentHarness {
565
+ constructor() {
566
+ super(...arguments);
567
+ this.getSaveBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__saveBtn' }));
568
+ this.getCancelBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__cancelBtn' }));
569
+ }
570
+ async setFlowFormValues(flowExecution) {
571
+ const modeInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName="mode"]' }))();
572
+ const matchRequiredInput = await this.locatorFor(MatSlideToggleHarness.with({ selector: '[formControlName="matchRequired"]' }))();
573
+ if (flowExecution.mode) {
574
+ await modeInput.open();
575
+ // Unselect all options before selecting the new one
576
+ for (const option of await modeInput.getOptions()) {
577
+ if (await option.isSelected()) {
578
+ await option.click();
579
+ }
580
+ }
581
+ const flowModeToValue = {
582
+ BEST_MATCH: 'Best match',
583
+ DEFAULT: 'Default',
584
+ };
585
+ await modeInput.clickOptions({ text: new RegExp(flowModeToValue[flowExecution.mode], 'i') });
586
+ }
587
+ if (flowExecution.matchRequired) {
588
+ await matchRequiredInput.check();
589
+ }
590
+ else {
591
+ await matchRequiredInput.uncheck();
592
+ }
593
+ }
594
+ async save() {
595
+ const button = await this.getSaveBtn();
596
+ await button.click();
597
+ }
598
+ async cancel() {
599
+ const button = await this.getCancelBtn();
600
+ await button.click();
601
+ }
602
+ }
603
+ GioPolicyStudioFlowExecutionFormDialogHarness.hostSelector = 'gio-ps-flow-execution-form-dialog';
604
+
433
605
  /*
434
606
  * Copyright (C) 2022 The Gravitee team (http://gravitee.io)
435
607
  *
@@ -526,6 +698,12 @@ class GioPolicyStudioHarness extends ComponentHarness {
526
698
  }
527
699
  throw new Error('No selector found for this flow. Needed to select Message or Proxy flow form dialog.');
528
700
  }
701
+ async setFlowExecutionConfig(flowExecution) {
702
+ await (await this.menuHarness()).openFlowExecutionConfig();
703
+ const flowExecutionDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowExecutionFormDialogHarness)();
704
+ await flowExecutionDialog.setFlowFormValues(flowExecution);
705
+ await flowExecutionDialog.save();
706
+ }
529
707
  }
530
708
  GioPolicyStudioHarness.hostSelector = 'gio-policy-studio';
531
709
 
@@ -549,5 +727,5 @@ GioPolicyStudioHarness.hostSelector = 'gio-policy-studio';
549
727
  * Generated bundle index. Do not edit.
550
728
  */
551
729
 
552
- export { GioPolicyStudioHarness, fakeChannelFlow, fakeHttpFlow, fakePlan };
730
+ export { GioPolicyStudioHarness, fakeBestMatchFlowExecution, fakeChannelFlow, fakeDefaultFlowExecution, fakeHttpFlow, fakePlan };
553
731
  //# sourceMappingURL=gravitee-ui-policy-studio-angular-testing.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"gravitee-ui-policy-studio-angular-testing.mjs","sources":["../../../projects/ui-policy-studio-angular/src/lib/models/flow/Flow.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/Plan.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/models/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flows-menu/gio-ps-flows-menu.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-details/gio-ps-flow-details.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/gio-policy-studio.harness.ts","../../../projects/ui-policy-studio-angular/src/public-testing-api.ts","../../../projects/ui-policy-studio-angular/src/gravitee-ui-policy-studio-angular-testing.ts"],"sourcesContent":["/*\n * Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { isFunction } from 'lodash';\n\nimport { Flow } from './Flow';\nimport { ChannelSelector, HttpSelector } from './Selector';\n\nexport function fakeChannelFlow(modifier?: Partial<Flow> | ((baseApi: Flow) => Flow)): Flow {\n const channelSelector: ChannelSelector = {\n type: 'CHANNEL',\n channel: 'channel',\n channelOperator: 'EQUALS',\n entrypoints: ['webhook'],\n operations: ['PUBLISH'],\n };\n\n const base: Flow = {\n name: 'Flow name',\n selectors: [channelSelector],\n request: [],\n response: [],\n subscribe: [],\n publish: [],\n enabled: true,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n\nexport function fakeHttpFlow(modifier?: Partial<Flow> | ((baseApi: Flow) => Flow)): Flow {\n const httpSelector: HttpSelector = {\n type: 'HTTP',\n path: '/path',\n pathOperator: 'EQUALS',\n methods: ['GET'],\n };\n\n const base: Flow = {\n name: 'Flow name',\n selectors: [httpSelector],\n request: [],\n response: [],\n subscribe: [],\n publish: [],\n enabled: true,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport * from './Flow.fixture';\n","/*\n * Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { isFunction } from 'lodash';\n\nimport { Plan } from './Plan';\n\nexport function fakePlan(modifier?: Partial<Plan> | ((base: Plan) => Plan)): Plan {\n const base: Plan = {\n id: 'plan-id',\n name: 'Keyless plan',\n flows: [],\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n","/*\n * Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport * from './Plan.fixture';\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport * from './flow/index-testing';\nexport * from './plan/index-testing';\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentHarness, parallel } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\nimport { DivHarness } from '@gravitee/ui-particles-angular/testing';\n\nexport class GioPolicyStudioFlowsMenuHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flows-menu';\n\n private locateFlowsGroups = this.locatorForAll(DivHarness.with({ selector: '.list__flowsGroup' }));\n private locateFlowByText = (text: string | RegExp) =>\n this.locatorForOptional(DivHarness.with({ selector: '.list__flowsGroup__flow', text }));\n\n public locateGroupByText = (text: string | RegExp) => this.locatorForOptional(DivHarness.with({ selector: '.list__flowsGroup', text }));\n\n private locateSelectedFlow = this.locatorForOptional(DivHarness.with({ selector: '.list__flowsGroup__flow.selected' }));\n\n public async getAllFlowsGroups(): Promise<\n {\n name: string | null;\n flows: {\n name: string | null;\n isSelected: boolean;\n infos: string | null;\n }[];\n }[]\n > {\n const flowsGroups = await this.locateFlowsGroups();\n\n return parallel(() =>\n flowsGroups.map(async flowsGroup => {\n const flowsGroupName = await flowsGroup.getText({ childSelector: '.list__flowsGroup__header__label' });\n\n const flowsDiv = await flowsGroup.childLocatorForAll(DivHarness.with({ selector: '.list__flowsGroup__flow' }))();\n\n const flowsInfos = parallel(() =>\n flowsDiv.map(async flowDiv => {\n return {\n name: await flowDiv.getText({ childSelector: '.list__flowsGroup__flow__name' }),\n infos: await flowDiv.getText({ childSelector: '.list__flowsGroup__flow__infos' }),\n isSelected: await flowDiv.host().then(host => host.hasClass('selected')),\n };\n }),\n );\n\n return {\n name: flowsGroupName,\n flows: await flowsInfos,\n };\n }),\n );\n }\n\n public async getSelectedFlow(): Promise<{ name: string | null } | null> {\n const selectedFlow = await this.locateSelectedFlow();\n\n return selectedFlow ? { name: await selectedFlow.getText({ childSelector: '.list__flowsGroup__flow__name' }) } : null;\n }\n\n /**\n * Select a flow by it's text content\n */\n public async selectFlow(flowText: string | RegExp): Promise<void> {\n const flowsGroups = await this.locateFlowByText(flowText)();\n\n if (flowsGroups) {\n await flowsGroups.host().then(host => host.click());\n }\n }\n\n public async addFlow(groupName: string | RegExp): Promise<void> {\n const flowsGroups = await this.locateGroupByText(groupName)();\n\n if (flowsGroups) {\n await (await flowsGroups.childLocatorFor(MatButtonHarness.with({ ancestor: '.list__flowsGroup__header__addBtn' }))()).click();\n }\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentHarness, parallel } from '@angular/cdk/testing';\nimport { DivHarness, SpanHarness } from '@gravitee/ui-particles-angular/testing';\n\nexport class GioPolicyStudioDetailsInfoBarHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-details-info-bar';\n\n public async getInfos(): Promise<Record<string, (string | null)[]>> {\n const infosDiv = await this.locatorForAll(DivHarness.with({ selector: '.info' }))();\n\n const allKeyValue = await parallel(() =>\n infosDiv.map(async info => {\n const label = await info.childLocatorFor(SpanHarness.with({ selector: '.info__label' }))();\n const value = await info.childLocatorForAll(SpanHarness.with({ selector: '.info__value' }))();\n return { label: await label.getText(), value: await parallel(() => value.map(v => v.getText())) };\n }),\n );\n\n return allKeyValue.reduce((acc, curr) => {\n if (curr.label) {\n return { ...acc, [curr.label]: curr.value };\n }\n return acc;\n }, {} as Record<string, (string | null)[]>);\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentHarness } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\n\nimport { GioPolicyStudioDetailsInfoBarHarness } from '../flow-details-info-bar/gio-ps-flow-details-info-bar.harness';\n\nexport class GioPolicyStudioDetailsHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-details';\n\n public async isDisplayEmptyFlow(): Promise<boolean> {\n const hostText = await (await this.host()).text();\n return hostText.includes('No flows yet');\n }\n\n public async getFlowInfos(): Promise<Record<string, (string | null)[]>> {\n return await (await this.locatorFor(GioPolicyStudioDetailsInfoBarHarness)()).getInfos();\n }\n\n public async matchText(matcher: RegExp): Promise<boolean> {\n const hostText = await (await this.host()).text();\n return matcher.test(hostText);\n }\n\n public async clickEditFlowBtn(): Promise<void> {\n const editFlowBtn = await this.locatorFor(MatButtonHarness.with({ selector: '.header__configBtn__edit' }))();\n await editFlowBtn.click();\n }\n\n public async clickDeleteFlowBtn(): Promise<void> {\n const deleteFlowBtn = await this.locatorFor(MatButtonHarness.with({ selector: '.header__configBtn__delete' }))();\n await deleteFlowBtn.click();\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentHarness } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\nimport { MatInputHarness } from '@angular/material/input/testing';\nimport { MatSelectHarness } from '@angular/material/select/testing';\nimport { GioFormTagsInputHarness } from '@gravitee/ui-particles-angular';\n\nexport class GioPolicyStudioFlowProxyFormDialogHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-proxy-form-dialog';\n\n private getSaveBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__saveBtn' }));\n private getCancelBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__cancelBtn' }));\n\n public async setFlowFormValues(flow: {\n name?: string;\n pathOperator?: string;\n path?: string;\n methods?: string[];\n condition?: string;\n }): Promise<void> {\n const nameInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"name\"]' }))();\n const pathOperatorInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"pathOperator\"]' }))();\n const pathInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"path\"]' }))();\n const methodsInput = await this.locatorFor(GioFormTagsInputHarness.with({ selector: '[formControlName=\"methods\"]' }))();\n const conditionInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"condition\"]' }))();\n\n if (flow.name) {\n await nameInput.setValue(flow.name);\n }\n if (flow.pathOperator) {\n await pathOperatorInput.open();\n\n // Unselect all options before selecting the new one\n for (const option of await pathOperatorInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n await pathOperatorInput.clickOptions({ text: new RegExp(flow.pathOperator, 'i') });\n }\n if (flow.path) {\n await pathInput.setValue(flow.path);\n }\n if (flow.methods) {\n await methodsInput.removeTag('ALL');\n for await (const method of flow.methods) {\n await methodsInput.addTag(method);\n }\n }\n if (flow.condition) {\n await conditionInput.setValue(flow.condition);\n }\n }\n\n public async save(): Promise<void> {\n const button = await this.getSaveBtn();\n await button.click();\n }\n\n public async cancel(): Promise<void> {\n const button = await this.getCancelBtn();\n await button.click();\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentHarness, parallel } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\nimport { MatInputHarness } from '@angular/material/input/testing';\nimport { MatSelectHarness } from '@angular/material/select/testing';\n\nexport class GioPolicyStudioFlowMessageFormDialogHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-message-form-dialog';\n\n private getSaveBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__saveBtn' }));\n private getCancelBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__cancelBtn' }));\n\n public async setFlowFormValues(flow: {\n name?: string;\n channelOperator?: string;\n channel?: string;\n operations?: string[];\n entrypoints?: string[];\n condition?: string;\n }): Promise<void> {\n const nameInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"name\"]' }))();\n const channelOperatorInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"channelOperator\"]' }))();\n const channelInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"channel\"]' }))();\n const operationsInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"operations\"]' }))();\n const entrypointsInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"entrypoints\"]' }))();\n const conditionInput = await this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"condition\"]' }))();\n\n if (flow.name) {\n await nameInput.setValue(flow.name);\n }\n if (flow.channelOperator) {\n await channelOperatorInput.open();\n // Unselect all options before selecting the new one\n for (const option of await entrypointsInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n await channelOperatorInput.clickOptions({ text: new RegExp(flow.channelOperator, 'i') });\n }\n if (flow.channel) {\n await channelInput.setValue(flow.channel);\n }\n if (flow.operations) {\n await parallel(() =>\n (flow.operations ?? []).map(async operation => {\n await operationsInput.open();\n // Unselect all options before selecting the new one\n for (const option of await operationsInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n await operationsInput.clickOptions({ text: new RegExp(operation, 'i') });\n }),\n );\n }\n if (flow.entrypoints) {\n await entrypointsInput.open();\n // Unselect all options before selecting the new one\n for (const option of await entrypointsInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n await parallel(() =>\n (flow.entrypoints ?? []).map(async entrypoint => {\n await entrypointsInput.clickOptions({ text: new RegExp(entrypoint, 'i') });\n }),\n );\n }\n if (flow.condition) {\n await conditionInput.setValue(flow.condition);\n }\n }\n\n public async save(): Promise<void> {\n const button = await this.getSaveBtn();\n await button.click();\n }\n\n public async cancel(): Promise<void> {\n const button = await this.getCancelBtn();\n await button.click();\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentHarness } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\n\nimport { ChannelSelector, ConditionSelector, Flow, HttpSelector } from './models';\nimport { GioPolicyStudioFlowsMenuHarness } from './components/flows-menu/gio-ps-flows-menu.harness';\nimport { GioPolicyStudioDetailsHarness } from './components/flow-details/gio-ps-flow-details.harness';\nimport { GioPolicyStudioFlowProxyFormDialogHarness } from './components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness';\nimport { GioPolicyStudioFlowMessageFormDialogHarness } from './components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness';\n\nexport class GioPolicyStudioHarness extends ComponentHarness {\n public static hostSelector = 'gio-policy-studio';\n\n private menuHarness = this.locatorFor(GioPolicyStudioFlowsMenuHarness);\n\n private detailsHarness = this.locatorFor(GioPolicyStudioDetailsHarness);\n\n /**\n * Add a flow to a plan or to \"Common flows\"\n *\n * @param groupName Plan name where to add the flow. You also can define \"Common flows\" to add a flow to this group.\n * @param flow Flow to add\n */\n public async addFlow(groupName: string, flow: Flow): Promise<void> {\n await (await this.menuHarness()).addFlow(new RegExp(groupName, 'i'));\n\n await this.setFlowFormDialog(flow);\n }\n\n /**\n * Edit a flow configuration\n *\n * @param flowName Flow name to edit\n * @param flow\n */\n public async editFlowConfig(flowName: string, flow: Partial<Flow>): Promise<void> {\n (await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));\n await (await this.detailsHarness()).clickEditFlowBtn();\n\n await this.setFlowFormDialog(flow);\n }\n\n public async deleteFlow(flowName: string): Promise<void> {\n (await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));\n await (await this.detailsHarness()).clickDeleteFlowBtn();\n }\n\n public async selectFlowInMenu(flowName: string): Promise<void> {\n await (await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));\n }\n\n public async getFlowsMenu(): Promise<\n {\n name: string | null;\n flows: {\n name: string | null;\n isSelected: boolean;\n infos: string | null;\n }[];\n }[]\n > {\n return (await this.menuHarness()).getAllFlowsGroups();\n }\n\n public async getSelectedFlowInfos(): Promise<Record<string, (string | null)[]>> {\n return await (await this.detailsHarness()).getFlowInfos();\n }\n\n public async save(): Promise<void> {\n await (await this.locatorFor(MatButtonHarness.with({ text: /Save/ }))()).click();\n }\n\n private async setFlowFormDialog(flow: Partial<Flow>) {\n const channelSelector = flow.selectors?.find(s => s.type === 'CHANNEL') as ChannelSelector | undefined;\n const httpSelector = flow.selectors?.find(s => s.type === 'HTTP') as HttpSelector | undefined;\n const conditionSelector = flow.selectors?.find(s => s.type === 'CONDITION') as ConditionSelector | undefined;\n\n if (!!channelSelector && !!httpSelector) {\n throw new Error('Channel and HTTP selectors are not be used together.');\n }\n\n if (channelSelector) {\n const flowFormNewDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowMessageFormDialogHarness)();\n\n const toChannelOperator = {\n STARTS_WITH: 'Starts with',\n EQUALS: 'Equals',\n };\n\n await flowFormNewDialog.setFlowFormValues({\n name: flow.name,\n channel: channelSelector?.channel,\n channelOperator: toChannelOperator[channelSelector.channelOperator],\n entrypoints: channelSelector?.entrypoints,\n operations: channelSelector?.operations,\n condition: conditionSelector?.condition,\n });\n\n await flowFormNewDialog.save();\n return;\n }\n\n if (httpSelector) {\n const flowFormNewDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowProxyFormDialogHarness)();\n\n await flowFormNewDialog.setFlowFormValues({\n name: flow.name,\n path: httpSelector?.path,\n pathOperator: httpSelector?.pathOperator,\n methods: httpSelector?.methods,\n condition: conditionSelector?.condition,\n });\n\n await flowFormNewDialog.save();\n return;\n }\n\n throw new Error('No selector found for this flow. Needed to select Message or Proxy flow form dialog.');\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport * from './lib/models/index-testing';\n\nexport * from './lib/gio-policy-studio.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-testing-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gravitee-ui-policy-studio-angular-testing.mjs","sources":["../../../projects/ui-policy-studio-angular/src/lib/models/flow/Flow.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/FlowExecution.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/flow/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/Plan.fixture.ts","../../../projects/ui-policy-studio-angular/src/lib/models/plan/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/models/index-testing.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flows-menu/gio-ps-flows-menu.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-details/gio-ps-flow-details.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.ts","../../../projects/ui-policy-studio-angular/src/lib/gio-policy-studio.harness.ts","../../../projects/ui-policy-studio-angular/src/public-testing-api.ts","../../../projects/ui-policy-studio-angular/src/gravitee-ui-policy-studio-angular-testing.ts"],"sourcesContent":["/*\n * Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { isFunction } from 'lodash';\n\nimport { Flow } from './Flow';\nimport { ChannelSelector, HttpSelector } from './Selector';\n\nexport function fakeChannelFlow(modifier?: Partial<Flow> | ((baseApi: Flow) => Flow)): Flow {\n const channelSelector: ChannelSelector = {\n type: 'CHANNEL',\n channel: 'channel',\n channelOperator: 'EQUALS',\n entrypoints: ['webhook'],\n operations: ['PUBLISH'],\n };\n\n const base: Flow = {\n name: 'Flow name',\n selectors: [channelSelector],\n request: [],\n response: [],\n subscribe: [],\n publish: [],\n enabled: true,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n\nexport function fakeHttpFlow(modifier?: Partial<Flow> | ((baseApi: Flow) => Flow)): Flow {\n const httpSelector: HttpSelector = {\n type: 'HTTP',\n path: '/path',\n pathOperator: 'EQUALS',\n methods: ['GET'],\n };\n\n const base: Flow = {\n name: 'Flow name',\n selectors: [httpSelector],\n request: [],\n response: [],\n subscribe: [],\n publish: [],\n enabled: true,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n","/*\n * Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { isFunction } from 'lodash';\n\nimport { FlowExecution } from './FlowExecution';\n\nexport function fakeBestMatchFlowExecution(modifier?: Partial<FlowExecution> | ((baseApi: FlowExecution) => FlowExecution)): FlowExecution {\n const base: FlowExecution = {\n mode: 'BEST_MATCH',\n matchRequired: false,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n\nexport function fakeDefaultFlowExecution(modifier?: Partial<FlowExecution> | ((baseApi: FlowExecution) => FlowExecution)): FlowExecution {\n const base: FlowExecution = {\n mode: 'DEFAULT',\n matchRequired: false,\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport * from './Flow.fixture';\nexport * from './FlowExecution.fixture';\n","/*\n * Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { isFunction } from 'lodash';\n\nimport { Plan } from './Plan';\n\nexport function fakePlan(modifier?: Partial<Plan> | ((base: Plan) => Plan)): Plan {\n const base: Plan = {\n id: 'plan-id',\n name: 'Keyless plan',\n flows: [],\n };\n\n if (isFunction(modifier)) {\n return modifier(base);\n }\n\n return {\n ...base,\n ...modifier,\n };\n}\n","/*\n * Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport * from './Plan.fixture';\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport * from './flow/index-testing';\nexport * from './plan/index-testing';\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentHarness, parallel } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\nimport { DivHarness } from '@gravitee/ui-particles-angular/testing';\n\nexport class GioPolicyStudioFlowsMenuHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flows-menu';\n\n private locateFlowsGroups = this.locatorForAll(DivHarness.with({ selector: '.list__flowsGroup' }));\n private locateFlowByText = (text: string | RegExp) =>\n this.locatorForOptional(DivHarness.with({ selector: '.list__flowsGroup__flow', text }));\n\n public locateGroupByText = (text: string | RegExp) => this.locatorForOptional(DivHarness.with({ selector: '.list__flowsGroup', text }));\n\n private locateSelectedFlow = this.locatorForOptional(DivHarness.with({ selector: '.list__flowsGroup__flow.selected' }));\n\n public async getAllFlowsGroups(): Promise<\n {\n name: string | null;\n flows: {\n name: string | null;\n isSelected: boolean;\n infos: string | null;\n }[];\n }[]\n > {\n const flowsGroups = await this.locateFlowsGroups();\n\n return parallel(() =>\n flowsGroups.map(async flowsGroup => {\n const flowsGroupName = await flowsGroup.getText({ childSelector: '.list__flowsGroup__header__label' });\n\n const flowsDiv = await flowsGroup.childLocatorForAll(DivHarness.with({ selector: '.list__flowsGroup__flow' }))();\n\n const flowsInfos = parallel(() =>\n flowsDiv.map(async flowDiv => {\n return {\n name: await flowDiv.getText({ childSelector: '.list__flowsGroup__flow__name' }),\n infos: await flowDiv.getText({ childSelector: '.list__flowsGroup__flow__infos' }),\n isSelected: await flowDiv.host().then(host => host.hasClass('selected')),\n };\n }),\n );\n\n return {\n name: flowsGroupName,\n flows: await flowsInfos,\n };\n }),\n );\n }\n\n public async getSelectedFlow(): Promise<{ name: string | null } | null> {\n const selectedFlow = await this.locateSelectedFlow();\n\n return selectedFlow ? { name: await selectedFlow.getText({ childSelector: '.list__flowsGroup__flow__name' }) } : null;\n }\n\n /**\n * Select a flow by it's text content\n */\n public async selectFlow(flowText: string | RegExp): Promise<void> {\n const flowsGroups = await this.locateFlowByText(flowText)();\n\n if (flowsGroups) {\n await flowsGroups.host().then(host => host.click());\n }\n }\n\n public async addFlow(groupName: string | RegExp): Promise<void> {\n const flowsGroups = await this.locateGroupByText(groupName)();\n\n if (flowsGroups) {\n await (await flowsGroups.childLocatorFor(MatButtonHarness.with({ ancestor: '.list__flowsGroup__header__addBtn' }))()).click();\n }\n }\n\n public async openFlowExecutionConfig(): Promise<void> {\n await (await this.locatorFor(MatButtonHarness.with({ selector: '.header__configBtn_edit' }))())?.click();\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentHarness, parallel } from '@angular/cdk/testing';\nimport { DivHarness, SpanHarness } from '@gravitee/ui-particles-angular/testing';\n\nexport class GioPolicyStudioDetailsInfoBarHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-details-info-bar';\n\n public async getInfos(): Promise<Record<string, (string | null)[]>> {\n const infosDiv = await this.locatorForAll(DivHarness.with({ selector: '.info' }))();\n\n const allKeyValue = await parallel(() =>\n infosDiv.map(async info => {\n const label = await info.childLocatorFor(SpanHarness.with({ selector: '.info__label' }))();\n const value = await info.childLocatorForAll(SpanHarness.with({ selector: '.info__value' }))();\n return { label: await label.getText(), value: await parallel(() => value.map(v => v.getText())) };\n }),\n );\n\n return allKeyValue.reduce((acc, curr) => {\n if (curr.label) {\n return { ...acc, [curr.label]: curr.value };\n }\n return acc;\n }, {} as Record<string, (string | null)[]>);\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentHarness } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\n\nimport { GioPolicyStudioDetailsInfoBarHarness } from '../flow-details-info-bar/gio-ps-flow-details-info-bar.harness';\n\nexport class GioPolicyStudioDetailsHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-details';\n\n public async isDisplayEmptyFlow(): Promise<boolean> {\n const hostText = await (await this.host()).text();\n return hostText.includes('No flows yet');\n }\n\n public async getFlowInfos(): Promise<Record<string, (string | null)[]>> {\n return await (await this.locatorFor(GioPolicyStudioDetailsInfoBarHarness)()).getInfos();\n }\n\n public async matchText(matcher: RegExp): Promise<boolean> {\n const hostText = await (await this.host()).text();\n return matcher.test(hostText);\n }\n\n public async clickEditFlowBtn(): Promise<void> {\n const editFlowBtn = await this.locatorFor(MatButtonHarness.with({ selector: '.header__configBtn__edit' }))();\n await editFlowBtn.click();\n }\n\n public async clickDeleteFlowBtn(): Promise<void> {\n const deleteFlowBtn = await this.locatorFor(MatButtonHarness.with({ selector: '.header__configBtn__delete' }))();\n await deleteFlowBtn.click();\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentHarness } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\nimport { MatInputHarness } from '@angular/material/input/testing';\nimport { MatSelectHarness } from '@angular/material/select/testing';\nimport { GioFormTagsInputHarness } from '@gravitee/ui-particles-angular';\n\nexport type GioPolicyStudioFlowProxyHarnessData = {\n name: string;\n pathOperator: string;\n path: string;\n methods: string[];\n condition: string;\n};\n\nexport class GioPolicyStudioFlowProxyFormDialogHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-proxy-form-dialog';\n\n private getSaveBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__saveBtn' }));\n private getCancelBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__cancelBtn' }));\n private nameInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"name\"]' }));\n private pathOperatorInput = this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"pathOperator\"]' }));\n private pathInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"path\"]' }));\n private methodsInput = this.locatorFor(GioFormTagsInputHarness.with({ selector: '[formControlName=\"methods\"]' }));\n private conditionInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"condition\"]' }));\n\n public async setFlowFormValues(flow: {\n name?: string;\n pathOperator?: string;\n path?: string;\n methods?: string[];\n condition?: string;\n }): Promise<void> {\n if (flow.name) {\n const nameInput = await this.nameInput();\n await nameInput.setValue(flow.name);\n }\n if (flow.pathOperator) {\n const pathOperatorInput = await this.pathOperatorInput();\n await pathOperatorInput.open();\n\n // Unselect all options before selecting the new one\n for (const option of await pathOperatorInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n await pathOperatorInput.clickOptions({ text: new RegExp(flow.pathOperator, 'i') });\n }\n if (flow.path) {\n const input = await this.pathInput();\n await input.setValue(flow.path);\n }\n if (flow.methods) {\n const methodsInput = await this.methodsInput();\n await methodsInput.removeTag('ALL');\n for await (const method of flow.methods) {\n await methodsInput.addTag(method);\n }\n }\n if (flow.condition) {\n const conditionInput = await this.conditionInput();\n await conditionInput.setValue(flow.condition);\n }\n }\n\n public async getFlowFormValues(): Promise<GioPolicyStudioFlowProxyHarnessData> {\n return {\n name: await this.getFlowName(),\n pathOperator: await this.getPathOperator(),\n path: await this.getFlowPath(),\n methods: await this.getMethods(),\n condition: await this.getCondition(),\n };\n }\n\n public async getFlowName(): Promise<string> {\n return this.nameInput().then(input => input.getValue());\n }\n\n public async getFlowPath(): Promise<string> {\n return this.pathInput().then(input => input.getValue());\n }\n\n public async getPathOperator(): Promise<string> {\n return this.pathOperatorInput().then(input => input.getValueText());\n }\n\n public async getMethods(): Promise<string[]> {\n return this.methodsInput().then(input => input.getTags());\n }\n\n public async getCondition(): Promise<string> {\n return this.conditionInput().then(input => input.getValue());\n }\n\n public async save(): Promise<void> {\n const button = await this.getSaveBtn();\n await button.click();\n }\n\n public async cancel(): Promise<void> {\n const button = await this.getCancelBtn();\n await button.click();\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentHarness, parallel } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\nimport { MatInputHarness } from '@angular/material/input/testing';\nimport { MatSelectHarness } from '@angular/material/select/testing';\n\nexport type GioPolicyStudioFlowMessageHarnessData = {\n name: string;\n channelOperator: string;\n channel: string;\n entrypoints: string[];\n operations: string[];\n condition: string;\n};\n\nexport class GioPolicyStudioFlowMessageFormDialogHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-message-form-dialog';\n\n private getSaveBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__saveBtn' }));\n private getCancelBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__cancelBtn' }));\n private nameInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"name\"]' }));\n private channelOperatorInput = this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"channelOperator\"]' }));\n private channelInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"channel\"]' }));\n private operationsInput = this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"operations\"]' }));\n private entrypointsInput = this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"entrypoints\"]' }));\n private conditionInput = this.locatorFor(MatInputHarness.with({ selector: '[formControlName=\"condition\"]' }));\n\n public async setFlowFormValues(flow: {\n name?: string;\n channelOperator?: string;\n channel?: string;\n operations?: string[];\n entrypoints?: string[];\n condition?: string;\n }): Promise<void> {\n if (flow.name) {\n const nameInput = await this.nameInput();\n await nameInput.setValue(flow.name);\n }\n if (flow.channelOperator) {\n const channelOperatorInput = await this.channelOperatorInput();\n const entrypointsInput = await this.entrypointsInput();\n await channelOperatorInput.open();\n // Unselect all options before selecting the new one\n for (const option of await entrypointsInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n await channelOperatorInput.clickOptions({ text: new RegExp(flow.channelOperator, 'i') });\n }\n if (flow.channel) {\n const channelInput = await this.channelInput();\n await channelInput.setValue(flow.channel);\n }\n if (flow.operations) {\n const operationsInput = await this.operationsInput();\n await parallel(() =>\n (flow.operations ?? []).map(async operation => {\n await operationsInput.open();\n // Unselect all options before selecting the new one\n for (const option of await operationsInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n await operationsInput.clickOptions({ text: new RegExp(operation, 'i') });\n }),\n );\n }\n if (flow.entrypoints) {\n const entrypointsInput = await this.entrypointsInput();\n await entrypointsInput.open();\n // Unselect all options before selecting the new one\n for (const option of await entrypointsInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n await parallel(() =>\n (flow.entrypoints ?? []).map(async entrypoint => {\n await entrypointsInput.clickOptions({ text: new RegExp(entrypoint, 'i') });\n }),\n );\n }\n if (flow.condition) {\n const conditionInput = await this.conditionInput();\n await conditionInput.setValue(flow.condition);\n }\n }\n\n public async getName(): Promise<string> {\n return this.nameInput().then(input => input.getValue());\n }\n\n public async getChannelOperator(): Promise<string> {\n return this.channelOperatorInput().then(input => input.getValueText());\n }\n\n public async getChannel(): Promise<string> {\n return this.channelInput().then(input => input.getValue());\n }\n\n public async getOperations(): Promise<string> {\n return this.operationsInput().then(input => input.getValueText());\n }\n\n public async getEntrypoints(): Promise<string> {\n return this.entrypointsInput().then(input => input.getValueText());\n }\n\n public async getCondition(): Promise<string> {\n return this.conditionInput().then(input => input.getValue());\n }\n\n public async save(): Promise<void> {\n const button = await this.getSaveBtn();\n await button.click();\n }\n\n public async cancel(): Promise<void> {\n const button = await this.getCancelBtn();\n await button.click();\n }\n\n public async getFormValues(): Promise<GioPolicyStudioFlowMessageHarnessData> {\n const name = await this.getName();\n const channelOperator = await this.getChannelOperator();\n const channel = await this.getChannel();\n const entrypoints = (await this.getEntrypoints()).split(',');\n const operations = (await this.getOperations()).split(',');\n const condition = await this.getCondition();\n return {\n name,\n channel,\n channelOperator,\n entrypoints,\n operations,\n condition,\n };\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentHarness } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\nimport { MatSelectHarness } from '@angular/material/select/testing';\nimport { MatSlideToggleHarness } from '@angular/material/slide-toggle/testing';\n\nimport { FlowMode } from '../../models';\n\nexport class GioPolicyStudioFlowExecutionFormDialogHarness extends ComponentHarness {\n public static hostSelector = 'gio-ps-flow-execution-form-dialog';\n\n private getSaveBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__saveBtn' }));\n private getCancelBtn = this.locatorFor(MatButtonHarness.with({ selector: '.actions__cancelBtn' }));\n\n public async setFlowFormValues(flowExecution: { mode?: FlowMode; matchRequired?: boolean }): Promise<void> {\n const modeInput = await this.locatorFor(MatSelectHarness.with({ selector: '[formControlName=\"mode\"]' }))();\n const matchRequiredInput = await this.locatorFor(MatSlideToggleHarness.with({ selector: '[formControlName=\"matchRequired\"]' }))();\n\n if (flowExecution.mode) {\n await modeInput.open();\n\n // Unselect all options before selecting the new one\n for (const option of await modeInput.getOptions()) {\n if (await option.isSelected()) {\n await option.click();\n }\n }\n const flowModeToValue: Record<FlowMode, string> = {\n BEST_MATCH: 'Best match',\n DEFAULT: 'Default',\n };\n\n await modeInput.clickOptions({ text: new RegExp(flowModeToValue[flowExecution.mode], 'i') });\n }\n\n if (flowExecution.matchRequired) {\n await matchRequiredInput.check();\n } else {\n await matchRequiredInput.uncheck();\n }\n }\n\n public async save(): Promise<void> {\n const button = await this.getSaveBtn();\n await button.click();\n }\n\n public async cancel(): Promise<void> {\n const button = await this.getCancelBtn();\n await button.click();\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentHarness } from '@angular/cdk/testing';\nimport { MatButtonHarness } from '@angular/material/button/testing';\n\nimport { ChannelSelector, ConditionSelector, Flow, FlowExecution, HttpSelector } from './models';\nimport { GioPolicyStudioFlowsMenuHarness } from './components/flows-menu/gio-ps-flows-menu.harness';\nimport { GioPolicyStudioDetailsHarness } from './components/flow-details/gio-ps-flow-details.harness';\nimport { GioPolicyStudioFlowProxyFormDialogHarness } from './components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness';\nimport { GioPolicyStudioFlowMessageFormDialogHarness } from './components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness';\nimport { GioPolicyStudioFlowExecutionFormDialogHarness } from './components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness';\n\nexport class GioPolicyStudioHarness extends ComponentHarness {\n public static hostSelector = 'gio-policy-studio';\n\n private menuHarness = this.locatorFor(GioPolicyStudioFlowsMenuHarness);\n\n private detailsHarness = this.locatorFor(GioPolicyStudioDetailsHarness);\n\n /**\n * Add a flow to a plan or to \"Common flows\"\n *\n * @param groupName Plan name where to add the flow. You also can define \"Common flows\" to add a flow to this group.\n * @param flow Flow to add\n */\n public async addFlow(groupName: string, flow: Flow): Promise<void> {\n await (await this.menuHarness()).addFlow(new RegExp(groupName, 'i'));\n\n await this.setFlowFormDialog(flow);\n }\n\n /**\n * Edit a flow configuration\n *\n * @param flowName Flow name to edit\n * @param flow\n */\n public async editFlowConfig(flowName: string, flow: Partial<Flow>): Promise<void> {\n (await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));\n await (await this.detailsHarness()).clickEditFlowBtn();\n\n await this.setFlowFormDialog(flow);\n }\n\n public async deleteFlow(flowName: string): Promise<void> {\n (await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));\n await (await this.detailsHarness()).clickDeleteFlowBtn();\n }\n\n public async selectFlowInMenu(flowName: string): Promise<void> {\n await (await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));\n }\n\n public async getFlowsMenu(): Promise<\n {\n name: string | null;\n flows: {\n name: string | null;\n isSelected: boolean;\n infos: string | null;\n }[];\n }[]\n > {\n return (await this.menuHarness()).getAllFlowsGroups();\n }\n\n public async getSelectedFlowInfos(): Promise<Record<string, (string | null)[]>> {\n return await (await this.detailsHarness()).getFlowInfos();\n }\n\n public async save(): Promise<void> {\n await (await this.locatorFor(MatButtonHarness.with({ text: /Save/ }))()).click();\n }\n\n private async setFlowFormDialog(flow: Partial<Flow>) {\n const channelSelector = flow.selectors?.find(s => s.type === 'CHANNEL') as ChannelSelector | undefined;\n const httpSelector = flow.selectors?.find(s => s.type === 'HTTP') as HttpSelector | undefined;\n const conditionSelector = flow.selectors?.find(s => s.type === 'CONDITION') as ConditionSelector | undefined;\n\n if (!!channelSelector && !!httpSelector) {\n throw new Error('Channel and HTTP selectors are not be used together.');\n }\n\n if (channelSelector) {\n const flowFormNewDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowMessageFormDialogHarness)();\n\n const toChannelOperator = {\n STARTS_WITH: 'Starts with',\n EQUALS: 'Equals',\n };\n\n await flowFormNewDialog.setFlowFormValues({\n name: flow.name,\n channel: channelSelector?.channel,\n channelOperator: toChannelOperator[channelSelector.channelOperator],\n entrypoints: channelSelector?.entrypoints,\n operations: channelSelector?.operations,\n condition: conditionSelector?.condition,\n });\n\n await flowFormNewDialog.save();\n return;\n }\n\n if (httpSelector) {\n const flowFormNewDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowProxyFormDialogHarness)();\n\n await flowFormNewDialog.setFlowFormValues({\n name: flow.name,\n path: httpSelector?.path,\n pathOperator: httpSelector?.pathOperator,\n methods: httpSelector?.methods,\n condition: conditionSelector?.condition,\n });\n\n await flowFormNewDialog.save();\n return;\n }\n\n throw new Error('No selector found for this flow. Needed to select Message or Proxy flow form dialog.');\n }\n\n public async setFlowExecutionConfig(flowExecution: FlowExecution): Promise<void> {\n await (await this.menuHarness()).openFlowExecutionConfig();\n\n const flowExecutionDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowExecutionFormDialogHarness)();\n await flowExecutionDialog.setFlowFormValues(flowExecution);\n await flowExecutionDialog.save();\n }\n}\n","/*\n * Copyright (C) 2022 The Gravitee team (http://gravitee.io)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport * from './lib/models/index-testing';\n\nexport * from './lib/gio-policy-studio.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-testing-api';\n"],"names":[],"mappings":"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"}