d5-testing-library 1.8.0-alpha.1 → 1.8.0-alpha.3

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.
@@ -0,0 +1,7 @@
1
+ import {
2
+ FormEdit
3
+ } from "./chunk-2DQ5YCRB.mjs";
4
+ import "./chunk-F57G2ZDW.mjs";
5
+ export {
6
+ FormEdit as default
7
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ ListForm
3
+ } from "./chunk-MH6NCS6F.mjs";
4
+ import "./chunk-F57G2ZDW.mjs";
5
+ export {
6
+ ListForm as default
7
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ TreeView
3
+ } from "./chunk-R25O5O4T.mjs";
4
+ import "./chunk-MH6NCS6F.mjs";
5
+ import "./chunk-F57G2ZDW.mjs";
6
+ export {
7
+ TreeView as default
8
+ };
@@ -3,7 +3,7 @@ import {
3
3
  FormField,
4
4
  click,
5
5
  wait
6
- } from "./chunk-JITTN2NY.mjs";
6
+ } from "./chunk-F57G2ZDW.mjs";
7
7
 
8
8
  // src/pageObjects/elements/Forms/FormEdit.ts
9
9
  import { By } from "selenium-webdriver";
@@ -1114,15 +1114,15 @@ async function classDependencyInjector(formType) {
1114
1114
  let SubFormFactoryClass;
1115
1115
  switch (formType) {
1116
1116
  case "1" /* LIST */:
1117
- SubFormFactoryClass = (await import("./ListForm-R7WQIGBI.mjs")).default;
1117
+ SubFormFactoryClass = (await import("./ListForm-KXMIP4EA.mjs")).default;
1118
1118
  break;
1119
1119
  case "3" /* TREE */:
1120
- SubFormFactoryClass = (await import("./TreeView-STUAAR65.mjs")).default;
1120
+ SubFormFactoryClass = (await import("./TreeView-5QQREFJ6.mjs")).default;
1121
1121
  break;
1122
1122
  case "2" /* EDIT */:
1123
1123
  case "99" /* FREE_FORM */:
1124
1124
  case "4" /* REPORT */:
1125
- SubFormFactoryClass = (await import("./FormEdit-XOCYARDX.mjs")).default;
1125
+ SubFormFactoryClass = (await import("./FormEdit-2USHOJID.mjs")).default;
1126
1126
  break;
1127
1127
  default:
1128
1128
  throw new Error(`Unsupported form type ${formType}`);
@@ -16,7 +16,7 @@ import {
16
16
  wait,
17
17
  waitElementIsClickable,
18
18
  waitElementIsVisible
19
- } from "./chunk-JITTN2NY.mjs";
19
+ } from "./chunk-F57G2ZDW.mjs";
20
20
 
21
21
  // src/pageObjects/elements/Table/Table.ts
22
22
  import { By as By5 } from "selenium-webdriver";
@@ -94,10 +94,12 @@ var DX_DATA_ROW_CLASS = "dx-data-row";
94
94
  var Row = class extends AbstractElementWithParent {
95
95
  index;
96
96
  getColumnBy;
97
- constructor(parentCssSelector, index, driver, getColumnBy) {
97
+ fixedTableContentCssSelector;
98
+ constructor(parentCssSelector, fixedTableContentCssSelector, index, driver, getColumnBy) {
98
99
  super(parentCssSelector, getCssRowByIndexSelector(index), driver);
99
100
  this.index = index;
100
101
  this.getColumnBy = getColumnBy;
102
+ this.fixedTableContentCssSelector = fixedTableContentCssSelector;
101
103
  }
102
104
  _getCell({ index, name, title }) {
103
105
  return new Cell(
@@ -147,12 +149,11 @@ var Row = class extends AbstractElementWithParent {
147
149
  return result;
148
150
  }
149
151
  async clickInlineButton(buttonClass) {
150
- const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
151
152
  const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
152
153
  this.index
153
154
  )}"] .${buttonClass}`;
154
155
  const button = await fixElementStaleError(
155
- By3.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`),
156
+ By3.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`),
156
157
  this.driver
157
158
  );
158
159
  return click(button, this.driver);
@@ -239,10 +240,12 @@ var Column = class extends AbstractElementWithParent {
239
240
  var Table = class extends AbstractElementWithParent {
240
241
  formName;
241
242
  headerCssSelector;
242
- constructor(parentCssSelector, headerCssSelector, formName, driver) {
243
+ fixedTableContentCssSelector;
244
+ constructor(parentCssSelector, headerCssSelector, fixedTableContentCssSelector, formName, driver) {
243
245
  super(parentCssSelector, `#${createTableId(formName)}`, driver);
244
246
  this.formName = formName;
245
247
  this.headerCssSelector = headerCssSelector;
248
+ this.fixedTableContentCssSelector = fixedTableContentCssSelector;
246
249
  }
247
250
  getColumnBy = (args) => {
248
251
  if (args.title) {
@@ -251,7 +254,7 @@ var Table = class extends AbstractElementWithParent {
251
254
  return this.getColumnByName(args.name);
252
255
  };
253
256
  getRowByIndex(index) {
254
- return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
257
+ return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.driver, this.getColumnBy);
255
258
  }
256
259
  getColumnByIndex(index) {
257
260
  return new Column({
@@ -283,7 +286,13 @@ var Table = class extends AbstractElementWithParent {
283
286
  const rows = await this.driver.findElements(By5.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
284
287
  const result = [];
285
288
  rows.forEach((_, index) => {
286
- const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
289
+ const newRow = new Row(
290
+ this.getFullCssSelector(),
291
+ this.fixedTableContentCssSelector,
292
+ index,
293
+ this.driver,
294
+ this.getColumnBy
295
+ );
287
296
  result.push(newRow);
288
297
  });
289
298
  return result;
@@ -463,10 +472,105 @@ var FormToolbar = class extends AbstractElementWithParent {
463
472
  }
464
473
  };
465
474
 
475
+ // src/pageObjects/elements/Filters/FilterOperation.ts
476
+ import { By as By7 } from "selenium-webdriver";
477
+ var FILTER_OPERATIONS = [
478
+ "=",
479
+ "<>",
480
+ "<",
481
+ ">",
482
+ "<=",
483
+ ">=",
484
+ "contains",
485
+ "between",
486
+ "isanyof",
487
+ "isnotanyof",
488
+ "isblank",
489
+ "isnotblank",
490
+ "startwith",
491
+ "bywords"
492
+ ];
493
+ var BUTTON_OPERATION_WIDGET = "operation-widget";
494
+ var OPERATIONS_WIDGET_POPUP = "operation-type-widget-popup";
495
+ var getWidgetInPopupSelector = (operationName) => `.dx-list-item [data-operation="${operationName}"]`;
496
+ var FilterOperation = class extends AbstractElementWithParent {
497
+ _testId;
498
+ constructor({ parentCssSelector, filterTestID, driver }) {
499
+ super(parentCssSelector, `${byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`)}`, driver);
500
+ this._testId = filterTestID;
501
+ }
502
+ async initOperationWidget() {
503
+ const widgetButtonEl = await this.getElement();
504
+ await waitElementIsClickable({
505
+ element: widgetButtonEl,
506
+ errorMessage: "Widget operation is not clickable",
507
+ driver: this.driver
508
+ });
509
+ const clickableElement = await widgetButtonEl.findElement(By7.className("dx-icon"));
510
+ await click(clickableElement, this.driver);
511
+ try {
512
+ const widgetPopupEl = await this.driver.findElement(By7.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
513
+ await waitElementIsVisible({
514
+ element: widgetPopupEl,
515
+ errorMessage: `Operation widget popup is not visible`,
516
+ driver: this.driver
517
+ });
518
+ } catch (_) {
519
+ throw `Operation widget popup is not visible`;
520
+ }
521
+ }
522
+ async setOperation(operationName) {
523
+ if (!FILTER_OPERATIONS.includes(operationName)) {
524
+ throw new Error(`Operation with name "${operationName}" is not correct.`);
525
+ }
526
+ await this.initOperationWidget();
527
+ const operationEl = await fixElementStaleError(By7.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
528
+ await click(operationEl, this.driver);
529
+ await wait(
530
+ async () => {
531
+ const currOperationName = await this.getAttribute("data-operation");
532
+ if (operationName === "isblank")
533
+ return true;
534
+ return currOperationName === operationName;
535
+ },
536
+ this.driver,
537
+ "Operation is not changed"
538
+ );
539
+ }
540
+ async getOperation() {
541
+ const result = await this.getAttribute("data-operation");
542
+ if (!result)
543
+ throw new Error("Operation not found");
544
+ return result;
545
+ }
546
+ async setIsBlank(value) {
547
+ const currValue = await this.getIsBlank();
548
+ if (currValue !== value) {
549
+ await this.setOperation("isblank");
550
+ await wait(
551
+ async () => {
552
+ const currIsBlank = await this.getIsBlank();
553
+ return currIsBlank === value;
554
+ },
555
+ this.driver,
556
+ "Operation is not changed"
557
+ );
558
+ }
559
+ }
560
+ async getIsBlank() {
561
+ const result = await this.getAttribute("data-hasblank");
562
+ return result === "true";
563
+ }
564
+ };
565
+
466
566
  // src/pageObjects/elements/Filters/FormFilterField.ts
467
567
  var FormFilterField = class extends AbstractEditor {
568
+ formName;
569
+ name;
468
570
  constructor(parentCssSelector, formName, name, driver) {
469
571
  super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
572
+ this.formName = formName;
573
+ this.name = name;
470
574
  }
471
575
  /**
472
576
  * Возвращает значение в поле
@@ -502,15 +606,64 @@ var FormFilterField = class extends AbstractEditor {
502
606
  async remove(itemText) {
503
607
  return super.remove(itemText);
504
608
  }
609
+ /**
610
+ * Инициализация операции фильтра
611
+ */
612
+ async initOperation() {
613
+ return new FilterOperation({
614
+ parentCssSelector: this.parentCssSelector,
615
+ filterTestID: createLayoutFilterTestId(this.formName, this.name)
616
+ });
617
+ }
618
+ /**
619
+ * Устанавливает операцию для фильтра
620
+ * @example
621
+ * await form.formFilter('TagBox').setOperation("=");
622
+ */
623
+ async setOperation(operationName) {
624
+ const filterOperation = await this.initOperation();
625
+ await filterOperation.setOperation(operationName);
626
+ }
627
+ /**
628
+ * Возвращает операцию фильтра
629
+ * @example
630
+ * expect(await form.formFilter('NumberFld').getOperation()).toBe("=");
631
+ */
632
+ async getOperation() {
633
+ const filterOperation = await this.initOperation();
634
+ return await filterOperation.getOperation();
635
+ }
636
+ /**
637
+ * Устанавливает операцию 'isblank' для фильтра
638
+ * @example
639
+ * await form.formFilter('TagBox').setIsBlank(true);
640
+ */
641
+ async setIsBlank(value) {
642
+ const filterOperation = await this.initOperation();
643
+ await filterOperation.setIsBlank(value);
644
+ }
645
+ /**
646
+ * Возвращает true|false, если операция 'isblank' установлена для фильтра
647
+ * @example
648
+ * expect(await form.formFilter('NumberFld').getIsBlank()).toBe(false);
649
+ */
650
+ async getIsBlank() {
651
+ const filterOperation = await this.initOperation();
652
+ return await filterOperation.getIsBlank();
653
+ }
505
654
  };
506
655
 
507
656
  // src/pageObjects/elements/Filters/FilterPanel.ts
508
- import { By as By7 } from "selenium-webdriver";
657
+ import { By as By8 } from "selenium-webdriver";
509
658
 
510
659
  // src/pageObjects/elements/Filters/PanelFilterField.ts
511
660
  var PanelFilterField = class extends AbstractEditor {
661
+ formName;
662
+ name;
512
663
  constructor(parentCssSelector, formName, name, driver) {
513
664
  super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
665
+ this.formName = formName;
666
+ this.name = name;
514
667
  }
515
668
  /**
516
669
  * Возвращает значение в поле
@@ -546,6 +699,51 @@ var PanelFilterField = class extends AbstractEditor {
546
699
  async remove(itemText) {
547
700
  return super.remove(itemText);
548
701
  }
702
+ /**
703
+ * Инициализация операции фильтра
704
+ */
705
+ async initOperation() {
706
+ return new FilterOperation({
707
+ parentCssSelector: this.parentCssSelector,
708
+ filterTestID: createDocFilterTestId(this.formName, this.name)
709
+ });
710
+ }
711
+ /**
712
+ * Устанавливает операцию для фильтра
713
+ * @example
714
+ * await form.filterPanel.filterField('TagBox').setOperation("=");
715
+ */
716
+ async setOperation(operationName) {
717
+ const filterOperation = await this.initOperation();
718
+ await filterOperation.setOperation(operationName);
719
+ }
720
+ /**
721
+ * Возвращает операцию фильтра
722
+ * @example
723
+ * expect(await form.filterPanel.filterField('NumberFld').getOperation()).toBe("=");
724
+ */
725
+ async getOperation() {
726
+ const filterOperation = await this.initOperation();
727
+ return await filterOperation.getOperation();
728
+ }
729
+ /**
730
+ * Устанавливает операцию 'isblank' для фильтра
731
+ * @example
732
+ * await form.filterPanel.filterField('TagBox').setIsBlank(true);
733
+ */
734
+ async setIsBlank(value) {
735
+ const filterOperation = await this.initOperation();
736
+ await filterOperation.setIsBlank(value);
737
+ }
738
+ /**
739
+ * Возвращает true|false, если операция 'isblank' установлена для фильтра
740
+ * @example
741
+ * expect(await form.filterPanel.filterField('NumberFld').getIsBlank()).toBe(false);
742
+ */
743
+ async getIsBlank() {
744
+ const filterOperation = await this.initOperation();
745
+ return await filterOperation.getIsBlank();
746
+ }
549
747
  };
550
748
 
551
749
  // src/pageObjects/elements/Filters/FilterPanel.ts
@@ -560,7 +758,7 @@ var FilterPanel = class extends AbstractElement {
560
758
  async filterPanelButtons() {
561
759
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
562
760
  const el = await this.getElement();
563
- return el.findElements(By7.css(selector));
761
+ return el.findElements(By8.css(selector));
564
762
  }
565
763
  constructor(formName, driver) {
566
764
  super(driver, drawerSelector(formName));
@@ -593,13 +791,13 @@ var FilterPanel = class extends AbstractElement {
593
791
  await this.driver.sleep(300);
594
792
  }
595
793
  async close() {
596
- const btn = await this.driver.findElement(By7.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
794
+ const btn = await this.driver.findElement(By8.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
597
795
  await click(btn, this.driver);
598
796
  }
599
797
  };
600
798
 
601
799
  // src/pageObjects/elements/Filters/ColumnFilter.ts
602
- import { By as By8 } from "selenium-webdriver";
800
+ import { By as By9 } from "selenium-webdriver";
603
801
 
604
802
  // src/pageObjects/elements/Filters/HeaderFilterField.ts
605
803
  var HeaderFilterField = class extends AbstractEditor {
@@ -639,11 +837,11 @@ var ColumnFilter = class extends AbstractElement {
639
837
  }
640
838
  async getApplyButton() {
641
839
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
642
- return this.driver.findElement(By8.css(selector));
840
+ return this.driver.findElement(By9.css(selector));
643
841
  }
644
842
  async getCancelButton() {
645
843
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
646
- return this.driver.findElement(By8.css(selector));
844
+ return this.driver.findElement(By9.css(selector));
647
845
  }
648
846
  async apply() {
649
847
  const btn = await this.getApplyButton();
@@ -657,17 +855,34 @@ var ColumnFilter = class extends AbstractElement {
657
855
  const columnEl = await this._column.getElement();
658
856
  const actions = this.driver.actions({ async: true });
659
857
  await actions.move({ origin: columnEl }).perform();
660
- const elements = await columnEl.findElements(By8.css(HEADER_FILTER_ICON));
661
- const headerFilterIcon = elements[1];
662
- await waitElementIsVisible({
663
- element: headerFilterIcon,
664
- driver: this.driver,
665
- errorMessage: `HeaderFilter "${this._name}" is not visible`
666
- });
858
+ const elements = await columnEl.findElements(By9.css(HEADER_FILTER_ICON));
859
+ let headerFilterIcon = null;
860
+ await wait(
861
+ async () => {
862
+ let result = false;
863
+ for (let element of elements) {
864
+ if (await element.isDisplayed()) {
865
+ headerFilterIcon = element;
866
+ result = true;
867
+ break;
868
+ }
869
+ }
870
+ return result;
871
+ },
872
+ this.driver,
873
+ `HeaderFilter "${this._name}" is not visible`
874
+ );
667
875
  if (!headerFilterIcon)
668
876
  throw new Error(`HeaderFilter "${this._name}" is not visible`);
669
877
  await headerFilterIcon.click();
670
- return new HeaderFilterField("", this._formName, this._name, this.driver);
878
+ const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
879
+ const filterEl = await filter.getElement();
880
+ await waitElementIsVisible({
881
+ element: filterEl,
882
+ driver: this.driver,
883
+ errorMessage: `Header filter is not visible`
884
+ });
885
+ return filter;
671
886
  }
672
887
  /**
673
888
  * Возвращает значение в поле
@@ -712,16 +927,49 @@ var ColumnFilter = class extends AbstractElement {
712
927
  await filter.remove(itemText);
713
928
  return this.apply();
714
929
  }
930
+ // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
931
+ async initOperation() {
932
+ await this.initFilter();
933
+ return new FilterOperation({
934
+ parentCssSelector: HEADER_FILTER_CONTAINER,
935
+ filterTestID: createHeaderFilterTestId(this._formName, this._name)
936
+ });
937
+ }
938
+ // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
939
+ async setOperation(operationName) {
940
+ const filterOperation = await this.initOperation();
941
+ await filterOperation.setOperation(operationName);
942
+ await this.apply();
943
+ }
944
+ // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
945
+ async getOperation() {
946
+ const filterOperation = await this.initOperation();
947
+ return await filterOperation.getOperation();
948
+ }
949
+ // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
950
+ async setIsBlank(value) {
951
+ const filterOperation = await this.initOperation();
952
+ await filterOperation.setIsBlank(value);
953
+ await this.apply();
954
+ }
955
+ // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
956
+ async getIsBlank() {
957
+ const filterOperation = await this.initOperation();
958
+ return await filterOperation.getIsBlank();
959
+ }
715
960
  };
716
961
 
717
962
  // src/pageObjects/elements/Forms/ListForm.ts
718
963
  var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
964
+ var FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
719
965
  var ListForm = class extends Form {
720
966
  headerCssSelector;
967
+ fixedTableContentCssSelector;
721
968
  constructor(driver) {
722
969
  super(driver);
723
970
  this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
724
971
  this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
972
+ this.fixedTableContentCssSelector = FIXED_DATAGRID_CONTENT_CSS_SELECTOR;
725
973
  }
726
974
  /**
727
975
  * Находит таблицу
@@ -731,7 +979,13 @@ var ListForm = class extends Form {
731
979
  * expect(listForm.table());
732
980
  */
733
981
  table() {
734
- return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
982
+ return new Table(
983
+ this.containerCssSelector,
984
+ this.headerCssSelector,
985
+ this.fixedTableContentCssSelector,
986
+ this.formName,
987
+ this.driver
988
+ );
735
989
  }
736
990
  /**
737
991
  * Находит таблицу
@@ -1,14 +1,16 @@
1
1
  import {
2
2
  ListForm
3
- } from "./chunk-WUPIBFH7.mjs";
3
+ } from "./chunk-MH6NCS6F.mjs";
4
4
 
5
5
  // src/pageObjects/elements/Forms/TreeView.ts
6
6
  var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
7
+ var FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-treelist-content.dx-treelist-content-fixed";
7
8
  var TreeView = class extends ListForm {
8
9
  constructor(driver) {
9
10
  super(driver);
10
11
  this.popupContainerCssSelector = `.popup .wrapper-tree-view-${this.formName}`;
11
12
  this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
13
+ this.fixedTableContentCssSelector = FIXED_TREELIST_CONTENT_CSS_SELECTOR;
12
14
  }
13
15
  };
14
16