From 769e4642bc4bd4c95d62bd6c6ca9d6135141c2c5 Mon Sep 17 00:00:00 2001 From: elwafa Date: Sat, 22 Feb 2025 13:11:42 +0200 Subject: [PATCH 1/2] feat(extractor): Add HTMLExtractor to PHP SDK for structured HTML data extraction - Implemented `HTMLExtractor.php` to define HTML extraction rules in the Volt-Test PHP SDK. - Supports: - CSS selectors for targeting specific elements. - Extracting text content from nested elements. - Extracting attributes (e.g., `value`, `href`, `src`). - Added `toArray()` method for serialization, ensuring consistency with existing extractors. - Aligns with the existing `JsonExtractor`, `RegexExtractor`, `HeaderExtractor`, and `CookieExtractor`. --- src/Extractors/HtmlExtractor.php | 55 ++++++++++++++++++++++++++++ src/Step.php | 9 +++++ tests/Units/HtmlExtractorTest.php | 61 +++++++++++++++++++++++++++++++ tests/Units/StepTest.php | 31 ++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 src/Extractors/HtmlExtractor.php create mode 100644 tests/Units/HtmlExtractorTest.php diff --git a/src/Extractors/HtmlExtractor.php b/src/Extractors/HtmlExtractor.php new file mode 100644 index 0000000..83ce044 --- /dev/null +++ b/src/Extractors/HtmlExtractor.php @@ -0,0 +1,55 @@ +variableName = $variableName; + $this->selector = $selector; + $this->attribute = $attribute; + } + + public function toArray(): array + { + if (! $this->validate()) { + throw new VoltTestException('Invalid HTML Extractor'); + } + + return [ + 'variable_name' => $this->variableName, + 'selector' => $this->selector, + 'attribute' => $this->attribute, + 'type' => 'html', + ]; + } + + public function validate(): bool + { + if (trim($this->variableName) === '') { + return false; + } + + // Check for empty or whitespace-only selector + if (trim($this->selector) === '') { + return false; + } + + // Check for empty or whitespace-only attribute + if ($this->attribute !== null && trim($this->attribute) === '') { + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/src/Step.php b/src/Step.php index 6eb29a5..009bf55 100644 --- a/src/Step.php +++ b/src/Step.php @@ -10,6 +10,7 @@ use VoltTest\Extractors\CookieExtractor; use VoltTest\Extractors\Extractor; use VoltTest\Extractors\HeaderExtractor; +use VoltTest\Extractors\HtmlExtractor; use VoltTest\Extractors\JsonExtractor; use VoltTest\Extractors\RegexExtractor; use VoltTest\Validators\StatusValidator; @@ -191,6 +192,14 @@ public function extractFromRegex(string $variableName, string $selector): self return $this; } + + public function extractFromHtml(string $variableName, string $selector, ?string $attribute = null): self + { + $htmlExtractor = new HtmlExtractor($variableName, $selector, $attribute); + $this->extracts[] = $htmlExtractor; + return $this; + } + public function validateStatus(string $name, int $expected): self { $this->validations[] = new StatusValidator($name, $expected); diff --git a/tests/Units/HtmlExtractorTest.php b/tests/Units/HtmlExtractorTest.php new file mode 100644 index 0000000..491db13 --- /dev/null +++ b/tests/Units/HtmlExtractorTest.php @@ -0,0 +1,61 @@ +htmlExtractor = new \VoltTest\Extractors\HtmlExtractor('testVar', 'div#test', 'data-id'); + } + + public function testToArray(): void + { + $expected = [ + 'variable_name' => 'testVar', + 'selector' => 'div#test', + 'attribute' => 'data-id', + 'type' => 'html', + ]; + $this->assertEquals($expected, $this->htmlExtractor->toArray()); + } + + public function testValidate(): void + { + $this->assertTrue($this->htmlExtractor->validate()); + } + + public function testEmptyVariableName(): void + { + $extractor = new \VoltTest\Extractors\HtmlExtractor('', 'div#test', 'data-id'); + $this->assertFalse($extractor->validate()); + } + + public function testEmptySelector(): void + { + $extractor = new \VoltTest\Extractors\HtmlExtractor('testVar', '', 'data-id'); + $this->assertFalse($extractor->validate()); + } + + public function testEmptyAttribute(): void + { + $extractor = new \VoltTest\Extractors\HtmlExtractor('testVar', 'div#test', ''); + $this->assertFalse($extractor->validate()); + } + + public function testNullAttribute(): void + { + $extractor = new \VoltTest\Extractors\HtmlExtractor('testVar', 'div#test', null); + $this->assertTrue($extractor->validate()); + } + + public function testEmptyAttributeWithNullSelector(): void + { + $this->expectException(\VoltTest\Exceptions\VoltTestException::class); + $extractor = new \VoltTest\Extractors\HtmlExtractor('testVar', 'div#date', ''); + $extractor->toArray(); + + } +} \ No newline at end of file diff --git a/tests/Units/StepTest.php b/tests/Units/StepTest.php index 8419b1e..8bb9fb4 100644 --- a/tests/Units/StepTest.php +++ b/tests/Units/StepTest.php @@ -117,6 +117,37 @@ public function testExtractFromJson(): void $this->assertEquals('json', $extract['type']); } + public function testExtractFromHtml(): void + { + $this->step->get(self::TEST_URL) + ->extractFromHtml('userId', 'div#user-id'); + $stepArray = $this->step->toArray(); + $extract = $stepArray['extract'][0]; + $this->assertEquals('userId', $extract['variable_name']); + $this->assertEquals('div#user-id', $extract['selector']); + $this->assertEquals('html', $extract['type']); + } + + + public function testExtractFromHtmlWithAttribute(): void + { + $this->step->get(self::TEST_URL) + ->extractFromHtml('userId', 'div#user-id', 'data-id'); + $stepArray = $this->step->toArray(); + $extract = $stepArray['extract'][0]; + $this->assertEquals('userId', $extract['variable_name']); + $this->assertEquals('div#user-id', $extract['selector']); + $this->assertEquals('html', $extract['type']); + } + + public function testExtractFromHtmlThrowsException(): void + { + $this->expectException(VoltTestException::class); + $this->step->get(self::TEST_URL) + ->extractFromHtml('userId', '#div#user-id', ''); + $this->step->toArray(); + } + public function testInvalidJsonPathThrowsException(): void { $this->expectException(InvalidJsonPathException::class); From befe7bc0b8a2e6880dce52e2f6e762da07a4222f Mon Sep 17 00:00:00 2001 From: elwafa Date: Sat, 22 Feb 2025 13:14:02 +0200 Subject: [PATCH 2/2] modify the import --- tests/Units/HtmlExtractorTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Units/HtmlExtractorTest.php b/tests/Units/HtmlExtractorTest.php index 491db13..e6d0dfc 100644 --- a/tests/Units/HtmlExtractorTest.php +++ b/tests/Units/HtmlExtractorTest.php @@ -2,7 +2,9 @@ namespace Tests\Units; -class HtmlExtractorTest extends \PHPUnit\Framework\TestCase +use PHPUnit\Framework\TestCase; + +class HtmlExtractorTest extends TestCase { private \VoltTest\Extractors\HtmlExtractor $htmlExtractor;