X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fseekat;a=blobdiff_plain;f=tests%2Fapi.php;h=2ba9d045f788acf98ce465885d0376727d2baeeb;hp=fc0e26aab99271e12056f72d2a1057972ffde391;hb=2451d97f1cb7b97e445b4dd839835b8673a4d0fc;hpb=3958595e9ff27162ae918db1453ddecd4840d481 diff --git a/tests/api.php b/tests/api.php index fc0e26a..2ba9d04 100644 --- a/tests/api.php +++ b/tests/api.php @@ -2,89 +2,213 @@ use seekat\API; use React\Promise\PromiseInterface; +use seekat\API\Links\ { + function first, function last, function next, function prev +}; describe("API", function() { - it("should return API on property access", function() { - expect($this->api->users)->to->be->instanceof(API::class); - }); + describe("Interface", function() { + it("should return API on property access", function() { + expect($this->api->users)->to->be->instanceof(API::class); + }); - it("should return a clone on property access", function() { - expect($this->api->users)->to->not->equal($this->api); - }); + it("should return a clone on property access", function() { + expect($this->api->users)->to->not->equal($this->api); + }); - it("should return PromiseInterface on function call", function() { - expect($this->api->users->m6w6())->to->be->instanceof(PromiseInterface::class); + it("should return PromiseInterface on function call", function() { + expect($this->api->users->m6w6())->to->be->instanceof(PromiseInterface::class); + }); }); - it("should successfully request /users/m6w6", function() { - $this->api->users->m6w6()->then(function($json) use(&$m6w6) { - $m6w6 = $json; - })->otherwise(function($error) use(&$errors) { - $errors[] = (string) $error; + describe("Requests", function() { + + it("should successfully request /users/m6w6", function() { + $this->api->users->m6w6()->then(function($json) use(&$m6w6) { + $m6w6 = $json; + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); + + $this->api->send(); + + expect($errors)->to->be->empty; + expect($m6w6->login)->to->loosely->equal("m6w6"); }); - $this->api->send(); + it("should export an array of data, url, type, links and headers", function() { + $this->api->users->m6w6()->then(function($json) use(&$m6w6) { + $m6w6 = $json; + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); - expect($errors)->to->be->empty; - expect($m6w6->login)->to->loosely->equal("m6w6"); - }); + $this->api->send(); - it("should return the count of followers when accessing /users/m6w6->followers", function() { - $this->api->users->m6w6()->then(function($m6w6) use(&$followers) { - $followers = $m6w6->followers; - })->otherwise(function($error) use(&$errors) { - $errors[] = (string) $error; + expect($errors)->to->be->empty(); + expect($m6w6->export())->to->be->an("array")->and->contain->keys([ + "data", "url", "type", "links", "headers" + ]); }); - $this->api->send(); + it("should return the count of followers when accessing /users/m6w6->followers", function() { + $this->api->users->m6w6()->then(function($m6w6) use(&$followers) { + $followers = $m6w6->followers; + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); - expect($errors)->to->be->empty(); - expect($followers->export())->to->be->an("integer"); - }); + $this->api->send(); - it("should fetch followers_url when accessing /users/m6w6->followers_url", function() { - $this->api->users->m6w6()->then(function($m6w6) use(&$followers, &$errors) { - $m6w6->followers_url()->then(function($json) use(&$followers) { - $followers = $json; - })->otherwise(function($error) use(&$errors) { + expect($errors)->to->be->empty(); + expect($followers->export()["data"])->to->be->an("integer"); + }); + + it("should fetch followers_url when accessing /users/m6w6->followers_url", function() { + $this->api->users->m6w6()->then(function($m6w6) use(&$followers, &$errors) { + $m6w6->followers_url()->then(function($json) use(&$followers) { + $followers = $json; + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); + }, function($error) use(&$errors) { $errors[] = (string) $error; }); - })->otherwise(function($error) use(&$errors) { - $errors[] = (string) $error; + + $this->api->send(); + + expect($errors)->to->be->empty; + expect($followers->export()["data"])->to->be->an("array"); + expect(count($followers))->to->be->above(0); }); - $this->api->send(); + it("should provide access to array indices", function() { + $this->api->users->m6w6()->then(function($m6w6) use(&$followers, &$errors) { + $m6w6->followers_url()->then(function($json) use(&$followers) { + $followers = $json; + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); + + $this->api->send(); + + expect($errors)->to->be->empty; + expect($followers->{0})->to->be->an("object"); + expect($followers->export()["data"][0])->to->be->an("object"); + }); + + it("should handle a few requests in parallel", function() { + $this->api->users->m6w6()->then(function($m6w6) use(&$count, &$errors) { + foreach ($m6w6 as $key => $val) { + switch ($key) { + case "html_url": + case "avatar_url": + break; + default: + if (substr($key, -4) === "_url") { + $val->get()->then(function() use(&$count) { + ++$count; + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); + } + } + } + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); + + $this->api->send(); + + expect($errors)->to->be->empty; + expect($count)->to->be->above(2); + }); - expect($errors)->to->be->empty; - expect($followers->export())->to->be->an("array"); - expect(count($followers))->to->be->above(0); }); - it("should handle a few requests in parallel", function() { - $this->api->users->m6w6()->then(function($m6w6) use(&$count, &$errors) { - foreach ($m6w6 as $key => $val) { - switch ($key) { - case "html_url": - case "avatar_url": - break; - default: - if (substr($key, -4) === "_url") { - $val->get()->then(function() use(&$count) { - ++$count; - })->otherwise(function($error) use(&$errors) { - $errors[] = (string) $error; - }); - } + describe("Cache", function() { + it("should cache successive calls", function() { + $cache = new API\Call\Cache\Service\Hollow(); + $this->api->users->m6w6(null, null, $cache)->then(function($json) use(&$m6w6) { + $m6w6 = $json; + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); + + $this->api->send(); + + $data = $cache->getStorage(); + $this->api->users->m6w6(null, null, $cache)->then(function($json) use(&$m6w6_) { + $m6w6_ = $json; + }, function($error) use(&$errors) { + $errors[] = (string) $error; + }); + + $this->api->send(); + + expect($errors)->to->be->empty; + expect($m6w6->login)->to->loosely->equal("m6w6"); + expect($m6w6_->login)->to->loosely->equal("m6w6"); + expect($data)->to->equal($cache->getStorage()); + expect(count($cache->getStorage()))->to->equal(1); + }); + xit("should refresh stale cache entries"); + }); + + describe("Generators", function() { + it("should iterate over a generator of promises", function() { + ($this->api)(function($api) use(&$gists_count, &$files_count) { + $gists = yield $api->users->m6w6->gists(); + $gists_count = count($gists); + foreach ($gists as $gist) { + $files_count += count($gist->files); } - } - })->otherwise(function($error) use(&$errors) { - $errors[] = (string) $error; + }); + expect($gists_count)->to->be->above(0); + expect($files_count)->to->be->at->least($gists_count); + }); + it("should iterate over a generator of promises with links", function() { + ($this->api)(function($api) use(&$repos, &$first, &$next, &$last, &$prev) { + $repos = yield $api->users->m6w6->repos(["per_page" => 1]); + $last = yield last($repos); + $prev = yield prev($last); + $next = yield next($prev); + $first = yield first($prev); + return -123; + })->done(function($value) use(&$result) { + $result = $value; + }); + + expect($result)->to->equal(-123); + expect($repos->export()["data"])->to->loosely->equal($first->export()["data"]); + expect($last->export()["data"])->to->loosely->equal($next->export()["data"]); }); + }); - $this->api->send(); + describe("Errors", function() { + it("should handle cancellation gracefully", function() { + $this->api->users->m6w6()->then(function($value) use(&$result) { + $result = $value; + }, function($error) use(&$message) { + $message = \seekat\Exception\message($error); + })->cancel(); + expect($result)->to->be->empty(); + expect($message)->to->equal("Cancelled"); + }); - expect($errors)->to->be->empty; - expect($count)->to->be->above(2); + it("should handle request errors gracefully", function() { + $this->api->generate->a404()->then(function($value) use(&$result) { + $result = $value; + }, function($error) use(&$message) { + $message = \seekat\Exception\message($error); + }); + $this->api->send(); + expect($result)->to->be->empty(); + expect($message)->to->equal("Not Found"); + }); }); });