Site-Proximo/openfoodfacts-php-0.2.3/tests/ApiFoodCacheTest.php
2020-08-22 11:34:59 +02:00

178 lines
5.5 KiB
PHP

<?php
use GuzzleHttp\Exception\ServerException;
use OpenFoodFacts\FilesystemTrait;
use PHPUnit\Framework\TestCase;
use OpenFoodFacts\Api;
use OpenFoodFacts\Collection;
use OpenFoodFacts\Document\FoodDocument;
use OpenFoodFacts\Document;
use OpenFoodFacts\Exception\{
ProductNotFoundException,
BadRequestException
};
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Cache\Psr16Cache;
use Symfony\Component\Console\Logger\ConsoleLogger;
class ApiFoodCacheTest extends TestCase
{
use FilesystemTrait;
/**
* @var Api
*/
private $api;
protected function setUp()
{
@rmdir('tests/tmp');
@mkdir('tests/tmp');
@mkdir('tests/tmp/cache');
$log = new Logger('name');
$log->pushHandler(new StreamHandler('log/test.log'));
$psr6Cache = new FilesystemAdapter(sprintf('testrun_%u', rand(0, 1000)), 10, 'tests/tmp/cache');
$cache = new Psr16Cache($psr6Cache);
$httpClient = new GuzzleHttp\Client([
// "http_errors" => false, // MUST not use as it crashes error handling
'Connection' => 'close',
CURLOPT_FORBID_REUSE => true,
CURLOPT_FRESH_CONNECT => true,
'defaults' => [
'headers' => [
'CURLOPT_USERAGENT' => 'OFF - PHP - SDK - Unit Test',
],
],
]);
$api = new Api('food', 'fr-en', $log, $httpClient, $cache);
$this->assertInstanceOf(Api::class, $api);
$this->api = $api;
}
public function testApi(): void
{
$prd = $this->api->getProduct('3057640385148');
$this->assertInstanceOf(FoodDocument::class, $prd);
$this->assertInstanceOf(Document::class, $prd);
$this->assertTrue(isset($prd->product_name));
$this->assertNotEmpty($prd->product_name);
try {
$product = $this->api->getProduct('305764038514800');
$this->assertTrue(false);
} catch (ProductNotFoundException $e) {
$this->assertTrue(true);
}
try {
$result = $this->api->downloadData('tests/mongodb', 'nopeFile');
$this->assertTrue(false);
} catch (BadRequestException $e) {
$this->assertEquals($e->getMessage(), 'File type not recognized!');
}
// $result = $this->api->downloadData('tests/tmp/mongodb');
// $this->assertTrue(true);
}
public function testApiCollection(): void
{
$collection = $this->api->getByFacets([]);
$this->assertInstanceOf(Collection::class, $collection);
$this->assertEquals($collection->pageCount(), 0);
try {
$collection = $this->api->getByFacets(['trace' => 'egg', 'country' => 'france'], 3);
$this->assertTrue(false);
} catch (\PHPUnit\Framework\Error\Notice $e) {
$this->assertEquals($e->getMessage(), 'OpenFoodFact - Your request has been redirect');
}
$collection = $this->api->getByFacets(['trace' => 'eggs', 'country' => 'france'], 3);
$this->assertInstanceOf(Collection::class, $collection);
$this->assertEquals($collection->pageCount(), 20);
$this->assertEquals($collection->getPage(), 3);
$this->assertEquals($collection->getSkip(), 40);
$this->assertEquals($collection->getPageSize(), 20);
$this->assertGreaterThan(1000, $collection->searchCount());
foreach ($collection as $key => $doc) {
if ($key > 1) {
break;
}
$this->assertInstanceOf(FoodDocument::class, $doc);
$this->assertInstanceOf(Document::class, $doc);
}
}
public function testApiSearch(): void
{
$collection = $this->api->search('volvic', 3, 30);
$this->assertInstanceOf(Collection::class, $collection);
$this->assertEquals($collection->pageCount(), 30);
$this->assertGreaterThan(100, $collection->searchCount());
}
public function testFacets(): void
{
$collection = $this->api->getIngredients();
$this->assertInstanceOf(Collection::class, $collection);
$this->assertEquals($collection->pageCount(), 20);
$this->assertEquals($collection->getPageSize(), 20);
$this->assertGreaterThan(70000, $collection->searchCount());
try {
$collection = $this->api->getIngredient();
$this->assertInstanceOf(Collection::class, $collection);
$this->assertTrue(false);
} catch (BadRequestException $e) {
$this->assertEquals($e->getMessage(), 'Facet "ingredient" not found');
}
$collection = $this->api->getPurchase_places();
$this->assertInstanceOf(Collection::class, $collection);
$collection = $this->api->getPackaging_codes();
$this->assertInstanceOf(Collection::class, $collection);
$collection = $this->api->getEntry_dates();
$this->assertInstanceOf(Collection::class, $collection);
try {
$collection = $this->api->getIngredient();
$this->assertTrue(false);
} catch (BadRequestException $e) {
$this->assertEquals($e->getMessage(), 'Facet "ingredient" not found');
}
try {
$collection = $this->api->nope();
} catch (\Exception $e) {
$this->assertTrue(true);
}
}
protected function tearDown()
{
$this->recursiveDeleteDirectory('tests/tmp');
}
}