Skip to content

Commit 07744f0

Browse files
authored
MQE-690: Create a custom action to assert that elements are sorted properly
- Method create in new MagentoAssert class/module.
1 parent 4ada037 commit 07744f0

File tree

7 files changed

+113
-3
lines changed

7 files changed

+113
-3
lines changed

dev/tests/verification/Resources/AssertTest.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class AssertTestCest
4949
$createData2 = new DataPersistenceHandler($UniquePerson);
5050
$createData2->createEntity();
5151
$grabTextFrom1 = $I->grabTextFrom(".copyright>span");
52+
$I->assertArrayIsSorted(["1", "2", "3", "4", "5"], "asc");
5253
$I->comment("asserts without variable replacement");
5354
$I->assertArrayHasKey("apple", ['orange' => 2, 'apple' => 1], "pass");
5455
$I->assertArrayNotHasKey("kiwi", ['orange' => 2, 'apple' => 1], "pass");

dev/tests/verification/TestModule/Test/AssertTest.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
</before>
1515
<createData entity="UniquePerson" stepKey="createData2"/>
1616
<grabTextFrom selector=".copyright>span" stepKey="grabTextFrom1"/>
17+
18+
19+
<!-- custom asserts -->
20+
<assertArrayIsSorted sortOrder="asc" stepKey="assertSorted1">
21+
<array>[1,2,3,4,5]</array>
22+
</assertArrayIsSorted>
23+
1724
<!-- asserts without variable replacement -->
1825
<comment stepKey="c1" userInput="asserts without variable replacement"/>
1926
<assertArrayHasKey stepKey="assertArrayHasKey" message="pass">

etc/di.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<!-- Entity value gets replaced in Dom.php before reading $xml -->
1010
<!DOCTYPE config [
11-
<!ENTITY commonTestActions "acceptPopup|actionGroup|amOnPage|amOnUrl|amOnSubdomain|appendField|assertArraySubset|assertElementContainsAttribute|attachFile|cancelPopup|checkOption|clearField|click|clickWithLeftButton|clickWithRightButton|closeAdminNotification|closeTab|comment|conditionalClick|createData|deleteData|updateData|getData|dontSee|dontSeeJsError|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInFormFields|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|entity|executeJS|executeInSelenium|fillField|formatMoney|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|loadSessionSnapshot|loginAsAdmin|magentoCLI|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|mSetLocale|mResetLocale|openNewTab|pauseExecution|parseFloat|performOn|pressKey|reloadPage|resetCookie|submitForm|resizeWindow|saveSessionSnapshot|scrollTo|scrollToTopOfPage|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|submitForm|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForLoadingMaskToDisappear|waitForPageLoad|waitForText|assertArrayHasKey|assertArrayNotHasKey|assertArraySubset|assertContains|assertCount|assertEmpty|assertEquals|assertFalse|assertFileExists|assertFileNotExists|assertGreaterOrEquals|assertGreaterThan|assertGreaterThanOrEqual|assertInstanceOf|assertInternalType|assertIsEmpty|assertLessOrEquals|assertLessThan|assertLessThanOrEqual|assertNotContains|assertNotEmpty|assertNotEquals|assertNotInstanceOf|assertNotNull|assertNotRegExp|assertNotSame|assertNull|assertRegExp|assertSame|assertStringStartsNotWith|assertStringStartsWith|assertTrue|expectException|fail|dontSeeFullUrlEquals|dontSee|dontSeeFullUrlMatches|dontSeeInFullUrl|seeFullUrlEquals|seeFullUrlMatches|seeInFullUrl|grabFromFullUrl">
11+
<!ENTITY commonTestActions "acceptPopup|actionGroup|amOnPage|amOnUrl|amOnSubdomain|appendField|assertArrayIsSorted|assertArraySubset|assertElementContainsAttribute|attachFile|cancelPopup|checkOption|clearField|click|clickWithLeftButton|clickWithRightButton|closeAdminNotification|closeTab|comment|conditionalClick|createData|deleteData|updateData|getData|dontSee|dontSeeJsError|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInFormFields|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|entity|executeJS|executeInSelenium|fillField|formatMoney|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|loadSessionSnapshot|loginAsAdmin|magentoCLI|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|mSetLocale|mResetLocale|openNewTab|pauseExecution|parseFloat|performOn|pressKey|reloadPage|resetCookie|submitForm|resizeWindow|saveSessionSnapshot|scrollTo|scrollToTopOfPage|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|submitForm|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForLoadingMaskToDisappear|waitForPageLoad|waitForText|assertArrayHasKey|assertArrayNotHasKey|assertArraySubset|assertContains|assertCount|assertEmpty|assertEquals|assertFalse|assertFileExists|assertFileNotExists|assertGreaterOrEquals|assertGreaterThan|assertGreaterThanOrEqual|assertInstanceOf|assertInternalType|assertIsEmpty|assertLessOrEquals|assertLessThan|assertLessThanOrEqual|assertNotContains|assertNotEmpty|assertNotEquals|assertNotInstanceOf|assertNotNull|assertNotRegExp|assertNotSame|assertNull|assertRegExp|assertSame|assertStringStartsNotWith|assertStringStartsWith|assertTrue|expectException|fail|dontSeeFullUrlEquals|dontSee|dontSeeFullUrlMatches|dontSeeInFullUrl|seeFullUrlEquals|seeFullUrlMatches|seeInFullUrl|grabFromFullUrl">
1212
]>
1313

1414
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../src/Magento/FunctionalTestingFramework/ObjectManager/etc/config.xsd">
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\FunctionalTestingFramework\Module;
8+
9+
/**
10+
* Class MagentoAssert
11+
*
12+
* Contains all custom assert functions to be used in tests.
13+
*
14+
* @package Magento\FunctionalTestingFramework\Module
15+
*/
16+
class MagentoAssert extends \Codeception\Module
17+
{
18+
/**
19+
* Asserts that all items in the array are sorted by given direction. Can be given int, string, double, dates.
20+
* Converts given date strings to epoch for comparison.
21+
*
22+
* @param array $data
23+
* @param string $sortOrder
24+
* @return void
25+
*/
26+
public function assertArrayIsSorted(array $data, $sortOrder = "asc")
27+
{
28+
$elementTotal = count($data);
29+
$message = null;
30+
31+
// If value can be converted to a date and it isn't 1.1 number (strtotime is overzealous)
32+
if (strtotime($data[0]) !== false && !is_numeric($data[0])) {
33+
$message = "Array of dates converted to unix timestamp for comparison";
34+
$data = array_map('strtotime', $data);
35+
} else {
36+
$data = array_map('strtolower', $data);
37+
}
38+
39+
if ($sortOrder = "asc") {
40+
for ($i = 1; $i < $elementTotal; $i++) {
41+
// $i >= $i-1
42+
$this->assertLessThanOrEqual($data[$i], $data[$i-1], $message);
43+
}
44+
} else {
45+
for ($i = 1; $i < $elementTotal; $i++) {
46+
// $i <= $i-1
47+
$this->assertGreaterThanOrEqual($data[$i], $data[$i-1], $message);
48+
}
49+
}
50+
}
51+
}

src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ public function _failed(TestInterface $test, $fail)
523523
{
524524
$this->debugWebDriverLogs($test);
525525

526-
if ($this->pngReport == null && $this->htmlReport == null) {
526+
if ($this->pngReport === null && $this->htmlReport === null) {
527527
$this->saveScreenshot();
528528
}
529529

@@ -546,4 +546,4 @@ public function saveScreenshot()
546546
$this->_saveScreenshot($this->pngReport = $outputDir . mb_strcut($filename, 0, 245, 'utf-8') . '.fail.png');
547547
$this->_savePageSource($this->htmlReport = $outputDir . mb_strcut($filename, 0, 244, 'utf-8') . '.fail.html');
548548
}
549-
}
549+
}

src/Magento/FunctionalTestingFramework/Test/etc/Actions/customActions.xsd

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<xs:element type="mResetLocaleType" name="mResetLocale" minOccurs="0" maxOccurs="unbounded"/>
2222
<xs:element type="scrollToTopOfPageType" name="scrollToTopOfPage" minOccurs="0" maxOccurs="unbounded"/>
2323
<xs:element type="clearFieldType" name="clearField" minOccurs="0" maxOccurs="unbounded"/>
24+
<xs:element type="assertArrayIsSortedType" name="assertArrayIsSorted" minOccurs="0" maxOccurs="unbounded"/>
2425
</xs:choice>
2526
</xs:group>
2627

@@ -197,4 +198,41 @@
197198
</xs:extension>
198199
</xs:simpleContent>
199200
</xs:complexType>
201+
202+
<xs:complexType name="assertArrayIsSortedType">
203+
<xs:annotation>
204+
<xs:documentation>
205+
Asserts that array is sorted according to sort direction.
206+
</xs:documentation>
207+
</xs:annotation>
208+
<xs:sequence>
209+
<xs:element name="array" type="arrayType"/>
210+
</xs:sequence>
211+
<xs:attribute name="sortOrder" type="sortEnum" use="required"/>
212+
<xs:attributeGroup ref="commonActionAttributes"/>
213+
</xs:complexType>
214+
215+
<xs:complexType name="arrayType">
216+
<xs:simpleContent>
217+
<xs:extension base="xs:string">
218+
<xs:annotation>
219+
<xs:documentation>
220+
Array to be asserted for proper sorting. Must be in parameterArray format (ex. [1,2,3,4,5] or [alpha, brontosaurus, zebra]).
221+
</xs:documentation>
222+
</xs:annotation>
223+
</xs:extension>
224+
</xs:simpleContent>
225+
</xs:complexType>
226+
227+
<xs:simpleType name="sortEnum" final="restriction">
228+
<xs:annotation>
229+
<xs:documentation>
230+
Sort direction.
231+
</xs:documentation>
232+
</xs:annotation>
233+
<xs:restriction base="xs:string">
234+
<xs:enumeration value="asc"/>
235+
<xs:enumeration value="desc"/>
236+
</xs:restriction>
237+
</xs:simpleType>
200238
</xs:schema>

src/Magento/FunctionalTestingFramework/Util/TestGenerator.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ private function generateStepsPhp($stepsObject, $hookObject = false)
423423
$dependentSelector = null;
424424
$visible = null;
425425
$command = null;
426+
$sortOrder = null;
426427

427428
$assertExpected = null;
428429
$assertActual = null;
@@ -441,6 +442,10 @@ private function generateStepsPhp($stepsObject, $hookObject = false)
441442
$attribute = $customActionAttributes['attribute'];
442443
}
443444

445+
if (isset($customActionAttributes['sortOrder'])) {
446+
$sortOrder = $customActionAttributes['sortOrder'];
447+
}
448+
444449
if (isset($customActionAttributes['userInput']) && isset($customActionAttributes['url'])) {
445450
$input = $this->addUniquenessFunctionCall($customActionAttributes['userInput']);
446451
$url = $this->addUniquenessFunctionCall($customActionAttributes['url']);
@@ -794,6 +799,14 @@ private function generateStepsPhp($stepsObject, $hookObject = false)
794799
$testSteps .= $dataPersistenceHandlerFunctionCall;
795800
$testSteps .= $getEntityFunctionCall;
796801
break;
802+
case "assertArrayIsSorted":
803+
$testSteps .= $this->wrapFunctionCall(
804+
$actor,
805+
$actionName,
806+
$parameterArray,
807+
$this->wrapWithDoubleQuotes($sortOrder)
808+
);
809+
break;
797810
case "seeCurrentUrlEquals":
798811
case "seeCurrentUrlMatches":
799812
case "dontSeeCurrentUrlEquals":

0 commit comments

Comments
 (0)