From e9d8ede9ec8122a5c94af49568dbd49c3bb51f8c Mon Sep 17 00:00:00 2001 From: Karl Date: Fri, 14 Oct 2016 11:43:59 +0200 Subject: [PATCH 1/3] =?UTF-8?q?MetaGer.php=20Methoden=20zu=20gro=C3=9Fen?= =?UTF-8?q?=20teilen=20abgedeckt,=20Result.php=20angefangen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetaGer.php | 6 +- app/Models/Result.php | 16 +++-- app/Models/Searchengine.php | 4 +- config/sumas.xml.example | 2 +- database/factories/ModelFactory.php | 29 ++++++--- tests/MetaGerPhpTest.php | 90 +++++++++++++++++++++------ tests/ResultPhpTest.php | 96 +++++++++++++++++++++++++++++ tests/testSumas.xml | 4 +- 8 files changed, 203 insertions(+), 44 deletions(-) create mode 100644 tests/ResultPhpTest.php diff --git a/app/MetaGer.php b/app/MetaGer.php index 32ca3f63..af0efac5 100644 --- a/app/MetaGer.php +++ b/app/MetaGer.php @@ -393,7 +393,7 @@ class MetaGer */ foreach ($sumas as $suma) { if ($this->sumaIsSelected($suma, $request) - || ($this->isBildersuche() + || (!$this->isBildersuche() && $this->sumaIsAdsuche($suma, $overtureEnabled)) && (!$this->sumaIsDisabled($suma))) { if ($this->sumaIsOverture($suma)) { @@ -536,7 +536,7 @@ class MetaGer public function isBildersuche() { - return $this->fokus !== "bilder"; + return $this->fokus === "bilder"; } public function sumaIsAdsuche($suma, $overtureEnabled) @@ -973,7 +973,7 @@ class MetaGer public function rankAll() { foreach ($this->engines as $engine) { - $engine->rank($this); + $engine->rank($this->getQ()); } } diff --git a/app/Models/Result.php b/app/Models/Result.php index 73d0579f..388c83df 100644 --- a/app/Models/Result.php +++ b/app/Models/Result.php @@ -69,12 +69,10 @@ class Result * + 0.02 * Sourcerank (20 - Position in Ergebnisliste des Suchanbieters) * * Engine-Boost */ - public function rank(\App\MetaGer $metager) + public function rank($eingabe) { $rank = 0; - $eingabe = $metager->getQ(); - # Boost für Source Ranking $rank += ($this->sourceRank * 0.02); @@ -130,7 +128,7 @@ class Result $tmpLink = str_replace(urlencode($char), "", $tmpLink); } } - if (strlen($this->descr) > 80 && strlen($link) > 0) { + if (strlen($this->descr) > 0/*80*/ && strlen($link) > 0) { return $count / ((strlen($link)) * 60); # ??? } else { return 0; @@ -249,7 +247,7 @@ class Result * "http://www.foo.bar.de/test?ja=1" -> "foo.bar.de" * gebracht. */ - private function getStrippedHost($link) + public function getStrippedHost($link) { if (strpos($link, "http") !== 0) { $link = "http://" . $link; @@ -265,13 +263,13 @@ class Result * "http://www.foo.bar.de/test?ja=1" -> "foo.bar.de/test" * gebracht. */ - private function getStrippedLink($link) + public function getStrippedLink($link) { if (strpos($link, "http") !== 0) { $link = "http://" . $link; } - $host = $this->strippedHost; + $host = $this->getStrippedHost($link); $path = @parse_url($link, PHP_URL_PATH); return $host . $path; } @@ -281,7 +279,7 @@ class Result * "http://www.foo.bar.de/test?ja=1" -> "bar.de" * gebracht. */ - private function getStrippedDomain($link) + public function getStrippedDomain($link) { if (preg_match("/([^\.]*\.[^\.]*)$/si", $link, $match)) { return $match[1]; @@ -291,7 +289,7 @@ class Result } # Erstellt aus einem Link einen Proxy-Link für unseren Proxy-Service - private function generateProxyLink($link) + public function generateProxyLink($link) { if (!$link) { return ""; diff --git a/app/Models/Searchengine.php b/app/Models/Searchengine.php index 60946a9f..3c6e28ec 100644 --- a/app/Models/Searchengine.php +++ b/app/Models/Searchengine.php @@ -118,10 +118,10 @@ abstract class Searchengine } # Ruft die Ranking-Funktion aller Ergebnisse auf. - public function rank(\App\MetaGer $metager) + public function rank($eingabe) { foreach ($this->results as $result) { - $result->rank($metager); + $result->rank($eingabe); } } diff --git a/config/sumas.xml.example b/config/sumas.xml.example index 82b8416d..978a5c9e 100644 --- a/config/sumas.xml.example +++ b/config/sumas.xml.example @@ -5,7 +5,7 @@ name="suchmaschine" host="www.suchmaschine.de" skript="/suche/" - formData="sprache=de&sortieren=true&&queue=<<QUERY>>" + formData="sprache=de&sortieren=true&queue=<<QUERY>>" package="suchmaschine" displayName="Meine Suchmaschine" homepage="www.suchmaschine.de/welcome" diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index e0dc8694..e9b6e811 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -9,15 +9,28 @@ | you a convenient way to create models for testing and seeding your | database. Just tell the factory how a default model should look. | -*/ - -$factory->define(App\User::class, function (Faker\Generator $faker) { - static $password; + */ +$factory->define(app\Models\parserSkripte\Base::class, function (Faker\Generator $faker) { return [ - 'name' => $faker->name, - 'email' => $faker->unique()->safeEmail, - 'password' => $password ?: $password = bcrypt('secret'), - 'remember_token' => str_random(10), + "provider" => null, + "titel" => "Hotels in L'Alpe-d'Huez", + "link" => "http://r.search.yahoo.com/cbclk/dWU9QUIxMzdDQTVGRUE1NDk4QiZ1dD0xNDc2NDMwMTM0MDY3JnVvPTUzNjEzNzI2OTYmbHQ9MiZlcz01LmtfeFdJR1BTOWpkdU95/RV=2/RE=1476458934/RO=10/RU=http%3a%2f%2f1616540.r.msn.com%2f%3fld%3dd3L21YyadK5JKikZbdYGL_WTVUCUwdKsA4ixeD_Iy-fyOol49ZUDwtvNaQrgo9_hrBZE29ZA8_kcVZvUh8zA3VBZsCAZK8rx10IhFt_RT45dthIWzATMhQpwXLvlSEiWjbX3oR-mghf0LQjcyYIqYSxSurjZ0%26u%3dhttp%253a%252f%252fwww.booking.com%252fcity%252ffr%252fl-alpe-d-huez.de.html%253faid%253d349014%2526label%253dmsn-w0pcQaojEix%2al5%2ajWskE5Q-5361372696%2526utm_campaign%253dFrance%2526utm_medium%253dcpc%2526utm_source%253dbing%2526utm_term%253dw0pcQaojEix%2al5%2ajWskE5Q/RK=0/RS=OWBpMcIG_XjwGHTMqrfc7GScvPg-", + "anzeigeLink" => "www.booking.com", + "descr" => "Schnell und sicher ein Hotel buchen. Alle Hotels mit Spezial-Angeboten.", + "gefVon" => "Yahoo", + "sourceRank" => 0, + "partnershop" => false, + "image" => "", + "proxyLink" => "https://proxy.suma-ev.de/cgi-bin/nph-proxy.cgi/en/I0/http/r.search.yahoo.com/cbclk/dWU9QUIxMzdDQTVGRUE1NDk4QiZ1dD0xNDc2NDMwMTM0MDY3JnVvPTUzNjEzNzI2OTYmbHQ9MiZlcz01LmtfeFdJR1BTOWpkdU95/RV=2/RE=1476458934/RO=10/RU=http%3a%2f%2f1616540.r.msn.com%2f%3fld%3dd3L21YyadK5JKikZbdYGL_WTVUCUwdKsA4ixeD_Iy-fyOol49ZUDwtvNaQrgo9_hrBZE29ZA8_kcVZvUh8zA3VBZsCAZK8rx10IhFt_RT45dthIWzATMhQpwXLvlSEiWjbX3oR-mghf0LQjcyYIqYSxSurjZ0%26u%3dhttp%253a%252f%252fwww.booking.com%252fcity%252ffr%252fl-alpe-d-huez.de.html%253faid%253d349014%2526label%253dmsn-w0pcQaojEix%2al5%2ajWskE5Q-5361372696%2526utm_campaign%253dFrance%2526utm_medium%253dcpc%2526utm_source%253dbing%2526utm_term%253dw0pcQaojEix%2al5%2ajWskE5Q/RK=0/RS=OWBpMcIG_XjwGHTMqrfc7GScvPg-", + "engineBoost" => 1.2, + "valid" => true, + "host" => "r.search.yahoo.com", + "strippedHost" => "booking.com", + "strippedDomain" => "booking.com", + "strippedLink" => "booking.com", + "rank" => 0, + "price" => 0, + "additionalInformation" => [], ]; }); diff --git a/tests/MetaGerPhpTest.php b/tests/MetaGerPhpTest.php index 59d4c77e..30558f4c 100644 --- a/tests/MetaGerPhpTest.php +++ b/tests/MetaGerPhpTest.php @@ -14,12 +14,19 @@ class MetaGerPhpTest extends TestCase { $this->fullRunTest(); $this->specialSearchTest(); - $this->createSearchEnginesTest(); + $this->specialSumaTest(); $this->linkGeneratorTest(); #$this->getHostCountTest(); $this->addLinkTest(); $this->adjustFocusTest(); $this->checkCanNotSitesearchTest(); + $this->isBildersucheTest(); + $this->loadMiniSucherTest(); + $this->getImageProxyLinkTest(); + $this->showQuicktipsTest(); + # Brauchen Engine Dummy + #$this->popAdTest(); + #$this->productsTest(); } public function fullRunTest() @@ -77,11 +84,6 @@ class MetaGerPhpTest extends TestCase $this->assertEquals("i want phrase", $metager->getPhrases()[0]); } - public function createSearchEnginesTest() - { - $this->specialSumaTest(); - } - public function addLinkTest() { $metager = new MetaGer(); @@ -109,22 +111,22 @@ class MetaGerPhpTest extends TestCase $metager = new Metager(); $request = new Request(['eingabe' => 'test']); $metager->parseFormData($request); - $this->linkCallbackTester($metager, "generateSearchLink", ["news"], - '/^.*?eingabe=test&focus=news&out=results$/'); - $this->linkCallbackTester($metager, "generateQuicktipLink", [], - '/\/qt/'); - $this->linkCallbackTester($metager, "generateSiteSearchLink", ["wolf.de"], - '/^.*?eingabe=test\+site%3Awolf.de&focus=web$/'); - $this->linkCallbackTester($metager, "generateRemovedHostLink", ["wolf.de"], - '/^.*?eingabe=test\+-host%3Awolf.de$/'); - $this->linkCallbackTester($metager, "generateRemovedDomainLink", ["wolf.de"], - '/^.*?eingabe=test\+-domain%3Awolf.de$/'); + $this->containCallbackTester($metager, "generateSearchLink", ["news"], + 'focus=news'); + $this->containCallbackTester($metager, "generateQuicktipLink", [], + '/qt'); + $this->containCallbackTester($metager, "generateSiteSearchLink", ["wolf.de"], + 'site%3Awolf.de'); + $this->containCallbackTester($metager, "generateRemovedHostLink", ["wolf.de"], + '-host%3Awolf.de'); + $this->containCallbackTester($metager, "generateRemovedDomainLink", ["wolf.de"], + '-domain%3Awolf.de'); } - public function linkCallbackTester($metager, $funcName, $input, $expectedOutput) + public function containCallbackTester($object, $funcName, $input, $expectedInOutput) { - $output = call_user_func_array(array($metager, $funcName), $input); - $this->assertRegExp($expectedOutput, $output); + $output = call_user_func_array(array($object, $funcName), $input); + $this->assertContains($expectedInOutput, $output); } public function getHostCountTest() @@ -158,4 +160,54 @@ class MetaGerPhpTest extends TestCase $enabledSearchengines = simplexml_load_file("tests/testSumas.xml")->xpath("suma"); # Eine spezielle test sumas.xml $this->assertFalse($metager->checkCanNotSitesearch($enabledSearchengines)); } + + public function isBildersucheTest() + { + $metager = new MetaGer(); + $request = new Request(["focus" => "bilder"]); + $metager->parseFormData($request); + $this->assertTrue($metager->isBildersuche()); + } + + public function loadMiniSucherTest() + { + $metager = new MetaGer(); + $sumas = simplexml_load_file("tests/testSumas.xml"); + $subcollections = ["minism1", "minism2"]; + $minisucher = $metager->loadMiniSucher($sumas, $subcollections); + $this->assertContains("rows=10", $minisucher["formData"]->__toString()); + $this->assertContains("fq=subcollection:%28minism1+OR+minism2%29", $minisucher["formData"]->__toString()); + } + + public function getImageProxyLinkTest() + { + $metager = new MetaGer(); + $this->containCallbackTester($metager, "getImageProxyLink", ["www.bilder.de/bild1.png"], "url=www.bilder.de%2Fbild1.png"); + } + + public function showQuicktipsTest() + { + $metager = new MetaGer(); + $request = new Request(["quicktips" => "yo"]); + $metager->parseFormData($request); + $this->assertFalse($metager->showQuicktips()); + } + + public function popAdTest() + { + $metager = new MetaGer(); + $this->assertNull($metager->popAd()); + $engines = []; + $engines[] = factory(app\Models\parserSkripte\Base::class)->make([], null); + $metager->combineResults($engines); + $ad = $metager->popAd(); + $this->assertNull($metager->popAd()); + } + + public function productsTest() + { + $metager = new MetaGer(); + $metager->hasProducts(); + $metager->getProducts(); + } } diff --git a/tests/ResultPhpTest.php b/tests/ResultPhpTest.php new file mode 100644 index 00000000..9c0292a8 --- /dev/null +++ b/tests/ResultPhpTest.php @@ -0,0 +1,96 @@ +rankingTest(); + $this->isValidTest(); + $this->linkGeneratorsTest(); + } + + public function getDummyResult() + { + $provider = file_get_contents("tests/testSumas.xml"); + $titel = "Titel"; + $link = "link.de"; + $anzeigeLink = "link.de/anzeige"; + $descr = "Beschreibung: i want phrase"; + $gefVon = ""; + $sourceRank = 1; + return new Result($provider, $titel, $link, $anzeigeLink, $descr, $gefVon, $sourceRank); + } + + public function getDummyMetaGer() + { + $metager = new MetaGer(); + $request = $this->createDummyRequest(); + $metager->parseFormData($request); + $metager->checkSpecialSearches($request); + return $metager; + } + + public function createDummyRequest() + { + $query = []; + $query["eingabe"] = 'suchwort -blackword -host:blackhost -domain:blackdomain site:wantsite "i want phrase"'; + $query["focus"] = "angepasst"; + $query["encoding"] = "utf8"; + $query["lang"] = "all"; + $query["time"] = "1000"; + $query["sprueche"] = "on"; + $query["resultCount"] = "20"; + $query["tab"] = "on"; + $query["onenewspage"] = "on"; + + return new Request($query); + } + + public function rankingTest() + { + $result = $this->getDummyResult(); + $result->rank("link"); # 0.38, 0.38512820512820511 mit url-boost auch bei description länge > 0 statt > 80 + $this->assertEquals(0.4, $result->getRank(), "Not within Range of Actual Value", 0.1); + $result->rank("titel"); # 0.38419999999999999 + $this->assertEquals(0.4, $result->getRank(), "Not within Range of Actual Value", 0.1); + $result->rank("beschreibung"); # 0.38280000000000003 + $this->assertEquals(0.4, $result->getRank(), "Not within Range of Actual Value", 0.1); + $result->rank("baum"); # 0.38 + $this->assertEquals(0.4, $result->getRank(), "Not within Range of Actual Value", 0.1); + } + + public function isValidTest() + { + $result = $this->getDummyResult(); + $metager = $this->getDummyMetaGer(); + $this->assertTrue($result->isValid($metager)); + } + + public function linkGeneratorsTest() + { + $result = $this->getDummyResult(); + $this->equalCallbackTester($result, "getStrippedHost", ["http://www.foo.bar.de/test?ja=1"], + 'foo.bar.de'); + $this->equalCallbackTester($result, "getStrippedLink", ["http://www.foo.bar.de/test?ja=1"], + 'foo.bar.de/test'); + $this->equalCallbackTester($result, "getStrippedDomain", ["http://www.foo.bar.de/test?ja=1"], + 'bar.de'); + $this->equalCallbackTester($result, "generateProxyLink", ["news"], + 'focus=news'); + } + + public function equalCallbackTester($object, $funcName, $input, $expectedInOutput) + { + $output = call_user_func_array(array($object, $funcName), $input); + $this->assertEquals($expectedInOutput, $output); + } +} diff --git a/tests/testSumas.xml b/tests/testSumas.xml index ca208af4..617705fb 100644 --- a/tests/testSumas.xml +++ b/tests/testSumas.xml @@ -1,10 +1,10 @@ Date: Wed, 19 Oct 2016 10:05:13 +0200 Subject: [PATCH 2/3] Result.php jetzt komplett durchgetestet und repariert --- app/Models/Result.php | 56 +++++++++++++++++++++++++++-------------- tests/ResultPhpTest.php | 4 +-- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/app/Models/Result.php b/app/Models/Result.php index 388c83df..68d1d989 100644 --- a/app/Models/Result.php +++ b/app/Models/Result.php @@ -249,13 +249,8 @@ class Result */ public function getStrippedHost($link) { - if (strpos($link, "http") !== 0) { - $link = "http://" . $link; - } - - $link = @parse_url($link, PHP_URL_HOST); - $link = preg_replace("/^www\./si", "", $link); - return $link; + $match = $this->getUrlElements($link); + return $match['host']; } /* Entfernt "http://", "www" und Parameter von einem Link @@ -265,13 +260,8 @@ class Result */ public function getStrippedLink($link) { - if (strpos($link, "http") !== 0) { - $link = "http://" . $link; - } - - $host = $this->getStrippedHost($link); - $path = @parse_url($link, PHP_URL_PATH); - return $host . $path; + $match = $this->getUrlElements($link); + return $match['host'] . $match['path']; } /* Liest aus einem Link die Domain. @@ -281,11 +271,8 @@ class Result */ public function getStrippedDomain($link) { - if (preg_match("/([^\.]*\.[^\.]*)$/si", $link, $match)) { - return $match[1]; - } else { - return $link; - } + $match = $this->getUrlElements($link); + return $match['domain']; } # Erstellt aus einem Link einen Proxy-Link für unseren Proxy-Service @@ -302,6 +289,37 @@ class Result } + /* Liest aus einer URL alle Informationen aus + * https://max:muster@www.example.site.page.com:8080/index/indexer/list.html?p1=A&p2=B#ressource + * (?:((?:http)|(?:https))(?::\/\/))? - https:// => [1] = http / https + * (?:(\w+):(\w+)@)? - username:password@ => [2] = username, [3] = password + * (?:(www)(?:\.))? - www. => [4] = www + * ((?:(?:\w+\.)+)?(\w+\.\w+)) - example.site.page.com => [5] = example.site.page.com, [6] = page.com + * (?:(?::)(\d+))? - :8080 => [7] = 8080 + * ((?:(?:\/\w+)+)(?:\.\w+)?)? - /index/indexer/list.html => [8] = /index/indexer/list.html + * (\?\w+=\w+(?:&\w+=\w+)*)? - ?p1=A&p2=B => [9] = ?p1=A&p2=B + * (?:(?:#)(\w+))? - #ressource => [10] = ressource + */ + public function getUrlElements($url) + { + if (!preg_match("/(?:((?:http)|(?:https))(?::\/\/))?(?:(\w+):(\w+)@)?(?:(www)(?:\.))?((?:(?:\w+\.)+)?(\w+\.\w+))(?:(?::)(\d+))?((?:(?:\/\w+)+)(?:\.\w+)?)?(\?\w+=\w+(?:&\w+=\w+)*)?(?:(?:#)(\w+))?/", $url, $match)) { + return; + } else { + $re = []; + if (isset($match[1])) {$re['schema'] = $match[1];}; + if (isset($match[2])) {$re['username'] = $match[2];}; + if (isset($match[3])) {$re['password'] = $match[3];}; + if (isset($match[4])) {$re['web'] = $match[4];}; + if (isset($match[5])) {$re['host'] = $match[5];}; + if (isset($match[6])) {$re['domain'] = $match[6];}; + if (isset($match[7])) {$re['port'] = $match[7];}; + if (isset($match[8])) {$re['path'] = $match[8];}; + if (isset($match[9])) {$re['query'] = $match[9];}; + if (isset($match[10])) {$re['fragment'] = $match[10];}; + return $re; + } + } + # Getter public function getRank() diff --git a/tests/ResultPhpTest.php b/tests/ResultPhpTest.php index 9c0292a8..518556eb 100644 --- a/tests/ResultPhpTest.php +++ b/tests/ResultPhpTest.php @@ -84,8 +84,8 @@ class ResultPhpTest extends TestCase 'foo.bar.de/test'); $this->equalCallbackTester($result, "getStrippedDomain", ["http://www.foo.bar.de/test?ja=1"], 'bar.de'); - $this->equalCallbackTester($result, "generateProxyLink", ["news"], - 'focus=news'); + $this->equalCallbackTester($result, "generateProxyLink", ["http://www.foo.bar.de/test?ja=1"], + 'https://proxy.suma-ev.de/cgi-bin/nph-proxy.cgi/en/I0/http/www.foo.bar.de/test?ja=1'); } public function equalCallbackTester($object, $funcName, $input, $expectedInOutput) -- GitLab From 2062081ee5e7feb09149239674e0bc8ba60f8895 Mon Sep 17 00:00:00 2001 From: Karl Date: Wed, 19 Oct 2016 13:35:02 +0200 Subject: [PATCH 3/3] =?UTF-8?q?Nicht=20triviale=20Tests=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/MetaGer.php | 2 +- app/Models/Result.php | 20 +++--- app/Models/Searchengine.php | 13 ++-- tests/MetaGerPhpTest.php | 53 ++++++++++++--- tests/ResultPhpTest.php | 35 ++++++++-- tests/SearchenginePhpTest.php | 119 ++++++++++++++++++++++++++++++++++ tests/testSumas.xml | 21 +----- tests/testSumas2.xml | 6 ++ 8 files changed, 220 insertions(+), 49 deletions(-) create mode 100644 tests/SearchenginePhpTest.php create mode 100644 tests/testSumas2.xml diff --git a/app/MetaGer.php b/app/MetaGer.php index af0efac5..1d761d3f 100644 --- a/app/MetaGer.php +++ b/app/MetaGer.php @@ -878,8 +878,8 @@ class MetaGer $this->searchCheckSitesearch($site); $this->searchCheckHostBlacklist(); $this->searchCheckDomainBlacklist(); - $this->searchCheckStopwords(); $this->searchCheckPhrase(); + $this->searchCheckStopwords(); } public function searchCheckSitesearch($site) diff --git a/app/Models/Result.php b/app/Models/Result.php index 68d1d989..0822a2e4 100644 --- a/app/Models/Result.php +++ b/app/Models/Result.php @@ -306,16 +306,16 @@ class Result return; } else { $re = []; - if (isset($match[1])) {$re['schema'] = $match[1];}; - if (isset($match[2])) {$re['username'] = $match[2];}; - if (isset($match[3])) {$re['password'] = $match[3];}; - if (isset($match[4])) {$re['web'] = $match[4];}; - if (isset($match[5])) {$re['host'] = $match[5];}; - if (isset($match[6])) {$re['domain'] = $match[6];}; - if (isset($match[7])) {$re['port'] = $match[7];}; - if (isset($match[8])) {$re['path'] = $match[8];}; - if (isset($match[9])) {$re['query'] = $match[9];}; - if (isset($match[10])) {$re['fragment'] = $match[10];}; + if (isset($match[1])) {$re['schema'] = $match[1];} else { $re['schema'] = "";}; + if (isset($match[2])) {$re['username'] = $match[2];} else { $re['username'] = "";}; + if (isset($match[3])) {$re['password'] = $match[3];} else { $re['password'] = "";}; + if (isset($match[4])) {$re['web'] = $match[4];} else { $re['web'] = "";}; + if (isset($match[5])) {$re['host'] = $match[5];} else { $re['host'] = "";}; + if (isset($match[6])) {$re['domain'] = $match[6];} else { $re['domain'] = "";}; + if (isset($match[7])) {$re['port'] = $match[7];} else { $re['port'] = "";}; + if (isset($match[8])) {$re['path'] = $match[8];} else { $re['path'] = "";}; + if (isset($match[9])) {$re['query'] = $match[9];} else { $re['query'] = "";}; + if (isset($match[10])) {$re['fragment'] = $match[10];} else { $re['fragment'] = "";}; return $re; } } diff --git a/app/Models/Searchengine.php b/app/Models/Searchengine.php index 3c6e28ec..003ba4ae 100644 --- a/app/Models/Searchengine.php +++ b/app/Models/Searchengine.php @@ -13,9 +13,9 @@ abstract class Searchengine { use DispatchesJobs; - protected $ch; # Curl Handle zum erhalten der Ergebnisse - protected $getString = ""; # Der String für die Get-Anfrage - protected $engine; # Die ursprüngliche Engine XML + public $ch; # Curl Handle zum erhalten der Ergebnisse + public $getString = ""; # Der String für die Get-Anfrage + public $engine; # Die ursprüngliche Engine XML public $enabled = true; # true, wenn die Suchmaschine nicht explizit disabled ist public $results = []; # Die geladenen Ergebnisse public $ads = []; # Die geladenen Werbungen @@ -34,8 +34,8 @@ abstract class Searchengine public $hash; # Der Hash-Wert dieser Suchmaschine public $fp; # Wird für Artefakte benötigt - protected $socketNumber = null; # Wird für Artefakte benötigt - protected $counter = 0; # Wird eventuell für Artefakte benötigt + public $socketNumber = null; # Wird für Artefakte benötigt + public $counter = 0; # Wird eventuell für Artefakte benötigt public $write_time = 0; # Wird eventuell für Artefakte benötigt public $connection_time = 0; # Wird eventuell für Artefakte benötigt @@ -59,6 +59,8 @@ abstract class Searchengine $this->cacheDuration = 60; } + $this->enabled = true; + # Eine Suchmaschine kann automatisch temporär deaktiviert werden, wenn es Verbindungsprobleme gab: if (isset($this->disabled) && strtotime($this->disabled) <= time()) { # In diesem Fall ist der Timeout der Suchmaschine abgelaufen. @@ -142,6 +144,7 @@ abstract class Searchengine $xml = simplexml_load_file($sumaFile); unset($xml->xpath("//sumas/suma[@name='" . $this->name . "']")['0']['disabled']); $xml->saveXML($sumaFile); + $this->enabled = true; } public function closeFp() diff --git a/tests/MetaGerPhpTest.php b/tests/MetaGerPhpTest.php index 30558f4c..ef013d80 100644 --- a/tests/MetaGerPhpTest.php +++ b/tests/MetaGerPhpTest.php @@ -5,11 +5,6 @@ use Illuminate\Http\Request; class MetaGerPhpTest extends TestCase { - /** - * A basic test example. - * - * @return void - */ public function test() { $this->fullRunTest(); @@ -78,10 +73,33 @@ class MetaGerPhpTest extends TestCase $metager->parseFormData($request); $metager->checkSpecialSearches($request); $this->assertEquals("wantsite", $metager->getSite()); - $this->assertEquals("blackhost", $metager->getUserHostBlacklist()[0]); - $this->assertEquals("blackdomain", $metager->getUserDomainBlacklist()[0]); - $this->assertEquals("blackword", $metager->getStopWords()[0]); - $this->assertEquals("i want phrase", $metager->getPhrases()[0]); + $this->assertContains("blackhost", $metager->getUserHostBlacklist()); + $this->assertContains("blackdomain", $metager->getUserDomainBlacklist()); + $this->assertContains("blackword", $metager->getStopWords()); + $this->assertContains("i want phrase", $metager->getPhrases()); + + $metager = new MetaGer(); + $request = new Request(['eingabe' => '-site:peter:test -blackword-test -host:blackhost-test.de.nz/test ich suche nach -host:blackhost:blackhost2.cote/t?p=5 "peter ist obst-garten und -bauern"']); + $metager->parseFormData($request); + $metager->checkSpecialSearches($request); + $this->assertEquals("peter:test", $metager->getSite()); + $this->assertContains("blackhost:blackhost2.cote/t?p=5", $metager->getUserHostBlacklist()); + $this->assertContains("blackhost-test.de.nz/test", $metager->getUserHostBlacklist()); + $this->assertContains("blackword-test", $metager->getStopWords()); + $this->assertNotContains("bauern", $metager->getStopWords()); + $this->assertContains("peter ist obst-garten und -bauern", $metager->getPhrases()); + + $metager = new MetaGer(); + $request = new Request(['eingabe' => '-host:-domain:test']); + $metager->parseFormData($request); + $metager->checkSpecialSearches($request); + $this->assertContains("-domain:test", $metager->getUserHostBlacklist()); + + $metager = new MetaGer(); + $request = new Request(['eingabe' => '"-host:-domain:test"']); + $metager->parseFormData($request); + $metager->checkSpecialSearches($request); + $this->assertContains("-host:-domain:test", $metager->getPhrases()); } public function addLinkTest() @@ -152,6 +170,15 @@ class MetaGerPhpTest extends TestCase $enabledSearchengines = $sumas; $metager->adjustFocus($sumas, $enabledSearchengines); $this->assertEquals("bilder", $metager->getFokus()); + + $metager = new MetaGer(); + $request = new Request(["focus" => "web"]); + $metager->parseFormData($request); + $this->assertEquals("web", $metager->getFokus()); + $sumas = simplexml_load_file("tests/testSumas2.xml")->xpath("suma"); # Eine spezielle test sumas.xml + $enabledSearchengines = array_slice($sumas, 0, 1); + $metager->adjustFocus($sumas, $enabledSearchengines); + $this->assertEquals("bilder", $metager->getFokus()); } public function checkCanNotSitesearchTest() @@ -159,6 +186,14 @@ class MetaGerPhpTest extends TestCase $metager = new MetaGer(); $enabledSearchengines = simplexml_load_file("tests/testSumas.xml")->xpath("suma"); # Eine spezielle test sumas.xml $this->assertFalse($metager->checkCanNotSitesearch($enabledSearchengines)); + + $metager = new MetaGer(); + $request = $this->createDummyRequest(); + $metager->parseFormData($request); + $metager->checkSpecialSearches($request); + $this->assertEquals("wantsite", $metager->getSite()); + $enabledSearchengines = simplexml_load_file("tests/testSumas2.xml")->xpath("suma"); # Eine spezielle test sumas.xml + $this->assertTrue($metager->checkCanNotSitesearch($enabledSearchengines)); } public function isBildersucheTest() diff --git a/tests/ResultPhpTest.php b/tests/ResultPhpTest.php index 518556eb..272923d3 100644 --- a/tests/ResultPhpTest.php +++ b/tests/ResultPhpTest.php @@ -6,11 +6,6 @@ use Illuminate\Http\Request; class ResultPhpTest extends TestCase { - /** - * A basic test example. - * - * @return void - */ public function test() { $this->rankingTest(); @@ -73,6 +68,27 @@ class ResultPhpTest extends TestCase $result = $this->getDummyResult(); $metager = $this->getDummyMetaGer(); $this->assertTrue($result->isValid($metager)); + + $metager = new MetaGer(); + $request = new Request(['eingabe' => 'test -host:host.domain.de -domain:domain.de']); + $metager->parseFormData($request); + $metager->checkSpecialSearches($request); + + $provider = file_get_contents("tests/testSumas.xml"); + $titel = "Titel"; + $link = "host.domain.de"; + $anzeigeLink = "host.domain.de/ergebnis/1?p=2"; + $descr = "Beschreibung: i want phrase"; + $gefVon = ""; + $sourceRank = 1; + + $result = new Result($provider, $titel, $link, $anzeigeLink, $descr, $gefVon, $sourceRank); + $this->assertFalse($result->isValid($metager)); + + $link = "domain.de/ergebnis/1?p=2"; + + $result = new Result($provider, $titel, $link, $anzeigeLink, $descr, $gefVon, $sourceRank); + $this->assertFalse($result->isValid($metager)); } public function linkGeneratorsTest() @@ -86,6 +102,15 @@ class ResultPhpTest extends TestCase 'bar.de'); $this->equalCallbackTester($result, "generateProxyLink", ["http://www.foo.bar.de/test?ja=1"], 'https://proxy.suma-ev.de/cgi-bin/nph-proxy.cgi/en/I0/http/www.foo.bar.de/test?ja=1'); + + $url = "https://leya:organa@www.han.solo.de/unterseite/document.htm?param1=2¶m2=1#siebzehn"; + + $this->equalCallbackTester($result, "getStrippedHost", [$url], + 'han.solo.de'); + $this->equalCallbackTester($result, "getStrippedDomain", [$url], + 'solo.de'); + $this->equalCallbackTester($result, "getStrippedLink", [$url], + 'han.solo.de/unterseite/document.htm'); } public function equalCallbackTester($object, $funcName, $input, $expectedInOutput) diff --git a/tests/SearchenginePhpTest.php b/tests/SearchenginePhpTest.php new file mode 100644 index 00000000..9659212d --- /dev/null +++ b/tests/SearchenginePhpTest.php @@ -0,0 +1,119 @@ +constructionTest(); + $this->enablingTest(); + } + + public function constructionTest() + { + $engines = simplexml_load_file("tests/testSumas.xml")->xpath("suma"); + $metager = new MetaGer(); + $request = new Request(["focus" => "web"]); + $metager->parseFormData($request); + $searchengine = new Bing($engines[0], $metager); + + $this->assertEquals('', + $searchengine->engine); + $this->assertEquals(true, + $searchengine->enabled); + $this->assertEquals('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1', + $searchengine->useragent); + $this->assertEquals(null, + $searchengine->ip); + $this->assertEquals('Meine Suchmaschine', + $searchengine->gefVon); + #$this->assertEquals('0.68813000 1476867147', $searchengine->startTime); + $this->assertEquals('/suche/?sprache=de&sortieren=true&queue=&rows=<>&fq=subcollection:<>', + $searchengine->getString); # Enthält auch Testen von generateGetString(), urlEncode() und getOvertureAffilData() (nicht in der aktuellen Version) + $this->assertEquals('b1ac991618a8ffc0dab6b9bbb913841e', + $searchengine->hash); + $this->assertEquals('86a9106ae65537651a8e456835b316ab', + $searchengine->resultHash); + $this->assertEquals(true, + $searchengine->canCache); + $this->assertEquals('minism', + $searchengine->name); + $this->assertEquals('www.suchmaschine.de', + $searchengine->host); + $this->assertEquals('/suche/', + $searchengine->skript); + $this->assertEquals('sprache=de&sortieren=true&queue=<>&rows=<>&fq=subcollection:<>', + $searchengine->formData); + $this->assertEquals('suchmaschine', + $searchengine->package); + $this->assertEquals('Meine Suchmaschine', + $searchengine->displayName); + $this->assertEquals('443', + $searchengine->port); + $this->assertEquals('Latin1', + $searchengine->inputEncoding); + $this->assertEquals('1', + $searchengine->userSelectable); + $this->assertEquals('bilder', + $searchengine->type); + $this->assertEquals('1.2', + $searchengine->engineBoost); + $this->assertEquals('$#!#$', + $searchengine->additionalHeaders); + $this->assertEquals(null, + $searchengine->disabled); + $this->assertEquals('1', + $searchengine->hasSiteSearch); + $this->assertEquals('60', + $searchengine->cacheDuration); + } + + public function enablingTest() + { + $engines = simplexml_load_file("tests/testSumas.xml")->xpath("suma"); + $engines[0]['disabled'] = 'next Monday'; + $metager = new MetaGer(); + $request = new Request(["focus" => "web"]); + $metager->parseFormData($request); + $searchengine = new Bing($engines[0], $metager); + + $this->assertFalse($searchengine->isEnabled()); + $searchengine->enable("tests/testSumas.xml", "enable suma test"); + $this->assertTrue($searchengine->isEnabled()); + + $engines = simplexml_load_file("tests/testSumas.xml")->xpath("suma"); + $metager = new MetaGer(); + $request = new Request(["focus" => "web"]); + $metager->parseFormData($request); + $searchengine = new Bing($engines[0], $metager); + + $this->assertTrue($searchengine->isEnabled()); + } + + /* + abstract public function loadResults($result); + private function setStatistic($key, $val) + protected function getHost() + getNext(MetaGer $metager, $result) + startSearch(\App\MetaGer $metager) + rank($eingabe) + + closeFp() + getSocket() + retrieveResults(MetaGer $metager) + shutdown() + getCurlInfo() + getCurlErrors() + addCurlHandle($mh) + removeCurlHandle($mh) + */ + + public function equalCallbackTester($object, $funcName, $input, $expectedInOutput) + { + $output = call_user_func_array(array($object, $funcName), $input); + $this->assertEquals($expectedInOutput, $output); + } +} diff --git a/tests/testSumas.xml b/tests/testSumas.xml index 617705fb..b7608ca1 100644 --- a/tests/testSumas.xml +++ b/tests/testSumas.xml @@ -1,21 +1,4 @@ - - \ No newline at end of file + + diff --git a/tests/testSumas2.xml b/tests/testSumas2.xml new file mode 100644 index 00000000..6684ccd5 --- /dev/null +++ b/tests/testSumas2.xml @@ -0,0 +1,6 @@ + + + + + + -- GitLab