Version 5.1 - All the GraphQL #32

Closed
timw4mail wants to merge 1160 commits from develop into master
17 changed files with 245 additions and 76 deletions
Showing only changes of commit 38faaebb5f - Show all commits

View File

@ -16,16 +16,19 @@
// //
// You shouldn't generally need to change anything below this line // You shouldn't generally need to change anything below this line
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
$APP_DIR = realpath(__DIR__ . '/../');
$ROOT_DIR = realpath("{$APP_DIR}/../");
$base_config = [ $base_config = [
// Template file path // Template file path
'view_path' => _dir(APP_DIR, 'views'), 'view_path' => "{$APP_DIR}/views",
// Cache paths // Cache paths
'data_cache_path' => _dir(APP_DIR, 'cache'), 'data_cache_path' => "{$APP_DIR}/cache",
'img_cache_path' => _dir(ROOT_DIR, 'public/images'), 'img_cache_path' => "{$ROOT_DIR}/public/images",
// Included config files // Included config files
'database' => require __DIR__ . '/database.php', 'database' => require 'database.php',
'menus' => require __DIR__ . '/menus.php', 'menus' => require 'menus.php',
'routes' => require __DIR__ . '/routes.php', 'routes' => require 'routes.php',
]; ];

View File

@ -20,13 +20,6 @@ if ($timezone === '' || $timezone === FALSE)
ini_set('date.timezone', 'GMT'); ini_set('date.timezone', 'GMT');
} }
// Define base directories
define('ROOT_DIR', __DIR__);
define('APP_DIR', ROOT_DIR . DIRECTORY_SEPARATOR . 'app');
define('SRC_DIR', ROOT_DIR . DIRECTORY_SEPARATOR . 'src');
define('CONF_DIR', APP_DIR . DIRECTORY_SEPARATOR . 'config');
define('BASE_DIR', SRC_DIR . DIRECTORY_SEPARATOR . 'Base');
/** /**
* Joins paths together. Variadic to take an * Joins paths together. Variadic to take an
* arbitrary number of arguments * arbitrary number of arguments
@ -38,15 +31,20 @@ function _dir()
return implode(DIRECTORY_SEPARATOR, func_get_args()); return implode(DIRECTORY_SEPARATOR, func_get_args());
} }
// Define base directories
$APP_DIR = _dir(__DIR__, 'app');
$SRC_DIR = _dir(__DIR__, 'src');
$CONF_DIR = _dir($APP_DIR, 'config');
/** /**
* Set up autoloaders * Set up autoloaders
* *
* @codeCoverageIgnore * @codeCoverageIgnore
* @return void * @return void
*/ */
spl_autoload_register(function($class) { spl_autoload_register(function($class) use ($SRC_DIR) {
$class_parts = explode('\\', $class); $class_parts = explode('\\', $class);
$ns_path = SRC_DIR . '/' . implode('/', $class_parts) . ".php"; $ns_path = $SRC_DIR . '/' . implode('/', $class_parts) . ".php";
if (file_exists($ns_path)) if (file_exists($ns_path))
{ {
@ -55,7 +53,7 @@ spl_autoload_register(function($class) {
} }
}); });
require _dir(ROOT_DIR, '/vendor/autoload.php'); require _dir(__DIR__, '/vendor/autoload.php');
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// Setup error handling // Setup error handling
@ -77,10 +75,16 @@ $whoops->register();
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Dependency Injection setup // Dependency Injection setup
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
require _dir(CONF_DIR, 'base_config.php'); // $base_config require _dir($CONF_DIR, 'base_config.php'); // $base_config
require _dir(CONF_DIR, 'config.php'); // $config require _dir($CONF_DIR, 'config.php'); // $config
$config_array = array_merge($base_config, $config); $config_array = array_merge($base_config, $config);
$di = require _dir(APP_DIR, 'bootstrap.php'); $di = require _dir($APP_DIR, 'bootstrap.php');
// Unset 'constants'
unset($APP_DIR);
unset($SRC_DIR);
unset($CONF_DIR);
$container = $di($config_array); $container = $di($config_array);
$container->set('error-handler', $defaultHandler); $container->set('error-handler', $defaultHandler);

View File

@ -13,6 +13,9 @@
namespace Aviat\AnimeClient; namespace Aviat\AnimeClient;
/**
* Odds and Ends class
*/
class AnimeClient { class AnimeClient {
use \Aviat\Ion\Di\ContainerAware; use \Aviat\Ion\Di\ContainerAware;
@ -23,6 +26,7 @@ class AnimeClient {
const DEFAULT_CONTROLLER_METHOD = 'index'; const DEFAULT_CONTROLLER_METHOD = 'index';
const NOT_FOUND_METHOD = 'not_found'; const NOT_FOUND_METHOD = 'not_found';
const ERROR_MESSAGE_METHOD = 'error_page'; const ERROR_MESSAGE_METHOD = 'error_page';
const SRC_DIR = __DIR__ . '/../../';
private static $form_pages = [ private static $form_pages = [
'edit', 'edit',
@ -57,6 +61,36 @@ class AnimeClient {
return ($a !== $b) ? 'selected' : ''; return ($a !== $b) ? 'selected' : '';
} }
/**
* Decode a json file into a php data structure
*
* @param string $file
* @param bool $as_array
* @return array|object
*/
public static function json_file_decode($file, $as_array=TRUE)
{
return json_decode(
file_get_contents($file),
$as_array
);
}
/**
* Encode json data and save to the selected file
*
* @param string $file
* @param mixed $data
* @return bool
*/
public static function json_file_encode($file, $data)
{
return file_put_contents(
$file,
json_encode($data)
);
}
/** /**
* Determine whether to show the sub-menu * Determine whether to show the sub-menu
* *

View File

@ -203,7 +203,7 @@ class Dispatcher extends RoutingBase {
$default_namespace = AnimeClient::DEFAULT_CONTROLLER_NAMESPACE; $default_namespace = AnimeClient::DEFAULT_CONTROLLER_NAMESPACE;
$path = str_replace('\\', '/', $default_namespace); $path = str_replace('\\', '/', $default_namespace);
$path = trim($path, '/'); $path = trim($path, '/');
$actual_path = \_dir(SRC_DIR, $path); $actual_path = \_dir(AnimeClient::SRC_DIR, $path);
$class_files = glob("{$actual_path}/*.php"); $class_files = glob("{$actual_path}/*.php");
@ -242,10 +242,6 @@ class Dispatcher extends RoutingBase {
{ {
$controller_class = $controller_map[$route_type]; $controller_class = $controller_map[$route_type];
} }
else
{
$controller_class = AnimeClient::DEFAULT_CONTROLLER;
}
// Prepend the controller to the route parameters // Prepend the controller to the route parameters
$route['controller'] = $controller_class; $route['controller'] = $controller_class;

View File

@ -13,6 +13,7 @@
namespace Aviat\AnimeClient\Model; namespace Aviat\AnimeClient\Model;
use Aviat\AnimeClient\AnimeClient;
use Aviat\AnimeClient\Hummingbird\Enum\AnimeWatchingStatus; use Aviat\AnimeClient\Hummingbird\Enum\AnimeWatchingStatus;
use Aviat\AnimeClient\Hummingbird\Transformer\AnimeListTransformer; use Aviat\AnimeClient\Hummingbird\Transformer\AnimeListTransformer;
@ -217,20 +218,20 @@ class Anime extends API {
$transformed_cache_file = _dir($this->config->get('data_cache_path'), "anime-{$status}-transformed.json"); $transformed_cache_file = _dir($this->config->get('data_cache_path'), "anime-{$status}-transformed.json");
$cached = (file_exists($cache_file)) $cached = (file_exists($cache_file))
? json_decode(file_get_contents($cache_file), TRUE) ? AnimeClient::json_file_decode($cache_file)
: []; : [];
$api_data = json_decode($response->getBody(), TRUE); $api_data = json_decode($response->getBody(), TRUE);
if ($api_data === $cached && file_exists($transformed_cache_file)) if ($api_data === $cached && file_exists($transformed_cache_file))
{ {
return json_decode(file_get_contents($transformed_cache_file), TRUE); return AnimeClient::json_file_decode($transformed_cache_file);
} }
else else
{ {
file_put_contents($cache_file, json_encode($api_data)); AnimeClient::json_file_encode($cache_file, $api_data);
$transformer = new AnimeListTransformer(); $transformer = new AnimeListTransformer();
$transformed = $transformer->transform_collection($api_data); $transformed = $transformer->transform_collection($api_data);
file_put_contents($transformed_cache_file, json_encode($transformed)); AnimeClient::json_file_encode($transformed_cache_file, $transformed);
return $transformed; return $transformed;
} }
} }

View File

@ -14,6 +14,7 @@
namespace Aviat\AnimeClient\Model; namespace Aviat\AnimeClient\Model;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
use Aviat\AnimeClient\AnimeClient;
use Aviat\AnimeClient\Model\Anime as AnimeModel; use Aviat\AnimeClient\Model\Anime as AnimeModel;
/** /**
@ -305,7 +306,7 @@ class AnimeCollection extends DB {
return; return;
} }
$anime = json_decode(file_get_contents("import.json")); $anime = AnimeClient::json_file_decode("import.json");
foreach ($anime as $item) foreach ($anime as $item)
{ {

View File

@ -13,13 +13,14 @@
namespace Aviat\AnimeClient\Model; namespace Aviat\AnimeClient\Model;
use GuzzleHttp\Cookie\Cookiejar;
use GuzzleHttp\Cookie\SetCookie;
use Aviat\AnimeClient\AnimeClient;
use Aviat\AnimeClient\Model\API; use Aviat\AnimeClient\Model\API;
use Aviat\AnimeClient\Hummingbird\Transformer; use Aviat\AnimeClient\Hummingbird\Transformer;
use Aviat\AnimeClient\Hummingbird\Enum\MangaReadingStatus; use Aviat\AnimeClient\Hummingbird\Enum\MangaReadingStatus;
use GuzzleHttp\Cookie\Cookiejar;
use GuzzleHttp\Cookie\SetCookie;
/** /**
* Model for handling requests dealing with the manga list * Model for handling requests dealing with the manga list
*/ */
@ -133,7 +134,9 @@ class Manga extends API {
$data = $this->_check_cache($response); $data = $this->_check_cache($response);
$output = $this->map_by_status($data); $output = $this->map_by_status($data);
return (array_key_exists($status, $output)) ? $output[$status] : $output; return (array_key_exists($status, $output))
? $output[$status]
: $output;
} }
/** /**
@ -153,25 +156,27 @@ class Manga extends API {
} }
$cache_file = _dir($this->config->get('data_cache_path'), 'manga.json'); $cache_file = _dir($this->config->get('data_cache_path'), 'manga.json');
$transformed_cache_file = _dir($this->config->get('data_cache_path'), 'manga-transformed.json'); $transformed_cache_file = _dir(
$this->config->get('data_cache_path'),
'manga-transformed.json'
);
$cached_data = file_exists($cache_file) $cached_data = file_exists($cache_file)
? json_decode(file_get_contents($cache_file), TRUE) ? AnimeClient::json_file_decode($cache_file)
: []; : [];
if ($cached_data === $api_data && file_exists($transformed_cache_file)) if ($cached_data === $api_data && file_exists($transformed_cache_file))
{ {
return json_decode(file_get_contents($transformed_cache_file), TRUE); return AnimeClient::json_file_decode($transformed_cache_file);
} }
else else
{ {
file_put_contents($cache_file, json_encode($api_data)); AnimeClient::json_file_encode($cache_file, $api_data);
$zippered_data = $this->zipper_lists($api_data); $zippered_data = $this->zipper_lists($api_data);
$transformer = new Transformer\MangaListTransformer(); $transformer = new Transformer\MangaListTransformer();
$transformed_data = $transformer->transform_collection($zippered_data); $transformed_data = $transformer->transform_collection($zippered_data);
file_put_contents($transformed_cache_file, json_encode($transformed_data)); AnimeClient::json_file_encode($transformed_cache_file, $transformed_data);
return $transformed_data; return $transformed_data;
} }
} }
@ -194,7 +199,11 @@ class Manga extends API {
foreach ($data as &$entry) foreach ($data as &$entry)
{ {
$entry['manga']['image'] = $this->get_cached_image($entry['manga']['image'], $entry['manga']['slug'], 'manga'); $entry['manga']['image'] = $this->get_cached_image(
$entry['manga']['image'],
$entry['manga']['slug'],
'manga'
);
$key = $this->const_map[$entry['reading_status']]; $key = $this->const_map[$entry['reading_status']];
$output[$key][] = $entry; $output[$key][] = $entry;
} }

View File

@ -72,4 +72,17 @@ class AnimeClientTest extends AnimeClient_TestCase {
]); ]);
$this->assertEquals($expected, $this->anime_client->is_view_page()); $this->assertEquals($expected, $this->anime_client->is_view_page());
} }
/**
* @dataProvider dataIsViewPage
*/
public function testIsFormPage($uri, $expected)
{
$this->setSuperGlobals([
'_SERVER' => [
'REQUEST_URI' => $uri
]
]);
$this->assertEquals(!$expected, $this->anime_client->is_form_page());
}
} }

View File

@ -41,8 +41,8 @@ class AnimeListTransformerTest extends AnimeClient_TestCase {
public function testTransform() public function testTransform()
{ {
$json = json_decode(file_get_contents($this->start_file), TRUE); $json = json_file_decode($this->start_file);
$expected = json_decode(file_get_contents($this->res_file), TRUE); $expected = json_file_decode($this->res_file);
$actual = $this->transformer->transform_collection($json); $actual = $this->transformer->transform_collection($json);
//file_put_contents($this->res_file, json_encode($actual)); //file_put_contents($this->res_file, json_encode($actual));
$this->assertEquals($expected, $actual); $this->assertEquals($expected, $actual);

View File

@ -15,10 +15,99 @@ class MangaListTransformerTest extends AnimeClient_TestCase {
public function testTransform() public function testTransform()
{ {
$orig_json = json_decode(file_get_contents($this->start_file), TRUE); $orig_json = json_file_decode($this->start_file);
$expected = json_decode(file_get_contents($this->res_file), TRUE); $expected = json_file_decode($this->res_file);
$actual = $this->transformer->transform_collection($orig_json); $actual = $this->transformer->transform_collection($orig_json);
$this->assertEquals($expected, $actual); $this->assertEquals($expected, $actual);
} }
public function dataUntransform()
{
return [
'same_rating' => [
'orig' => [
'id' => 401735,
'manga_id' => "love-hina",
'status' => "Plan to Read",
'chapters_read' => 16,
'volumes_read' => 2,
'rereading' => true,
'reread_count' => 1,
'notes' => "Some text notes",
'old_rating' => 7,
'new_rating' => 7,
],
'expected' => [
'id' => 401735,
'manga_id' => "love-hina",
'status' => "Plan to Read",
'chapters_read' => 16,
'volumes_read' => 2,
'rereading' => true,
'reread_count' => 1,
'notes' => "Some text notes",
]
],
'update_rating' => [
'orig' => [
'id' => 401735,
'manga_id' => "love-hina",
'status' => "Plan to Read",
'chapters_read' => 16,
'volumes_read' => 2,
'rereading' => true,
'reread_count' => 1,
'notes' => "Some text notes",
'old_rating' => 7,
'new_rating' => 8,
],
'expected' => [
'id' => 401735,
'manga_id' => "love-hina",
'status' => "Plan to Read",
'chapters_read' => 16,
'volumes_read' => 2,
'rereading' => true,
'reread_count' => 1,
'notes' => "Some text notes",
'rating' => 4,
]
],
'remove_rating' => [
'orig' => [
'id' => 401735,
'manga_id' => "love-hina",
'status' => "Plan to Read",
'chapters_read' => 16,
'volumes_read' => 2,
'rereading' => true,
'reread_count' => 1,
'notes' => "Some text notes",
'old_rating' => 7,
'new_rating' => 0,
],
'expected' => [
'id' => 401735,
'manga_id' => "love-hina",
'status' => "Plan to Read",
'chapters_read' => 16,
'volumes_read' => 2,
'rereading' => true,
'reread_count' => 1,
'notes' => "Some text notes",
'rating' => 3.5,
]
]
];
}
/**
* @dataProvider dataUntransform
*/
public function testUntransform($orig, $expected)
{
$actual = $this->transformer->untransform($orig);
$this->assertEquals($expected, $actual);
}
} }

View File

@ -12,13 +12,13 @@ class MangaListsZipperTest extends AnimeClient_TestCase {
$this->start_file = __DIR__ . '/../../../test_data/manga_list/manga.json'; $this->start_file = __DIR__ . '/../../../test_data/manga_list/manga.json';
$this->res_file = __DIR__ . '/../../../test_data/manga_list/manga-zippered.json'; $this->res_file = __DIR__ . '/../../../test_data/manga_list/manga-zippered.json';
$json = json_decode(file_get_contents($this->start_file), TRUE); $json = json_file_decode($this->start_file);
$this->mangaListsZipper = new MangaListsZipper($json); $this->mangaListsZipper = new MangaListsZipper($json);
} }
public function testTransform() public function testTransform()
{ {
$zippered_json = json_decode(file_get_contents($this->res_file), TRUE); $zippered_json = json_file_decode($this->res_file);
$transformed = $this->mangaListsZipper->transform(); $transformed = $this->mangaListsZipper->transform();
$this->assertEquals($zippered_json, $transformed); $this->assertEquals($zippered_json, $transformed);

View File

@ -17,16 +17,16 @@ class MangaModelTest extends AnimeClient_TestCase {
public function testZipperLists() public function testZipperLists()
{ {
$raw_data = json_decode(file_get_contents($this->mockDir . '/manga.json'), TRUE); $raw_data = json_file_decode($this->mockDir . '/manga.json');
$expected = json_decode(file_get_contents($this->mockDir . '/manga-zippered.json'), TRUE); $expected = json_file_decode($this->mockDir . '/manga-zippered.json');
$this->assertEquals($expected, $this->model->zipper_lists($raw_data)); $this->assertEquals($expected, $this->model->zipper_lists($raw_data));
} }
public function testMapByStatus() public function testMapByStatus()
{ {
$original = json_decode(file_get_contents($this->mockDir . '/manga-transformed.json'), TRUE); $original = json_file_decode($this->mockDir . '/manga-transformed.json');
$expected = json_decode(file_get_contents($this->mockDir . '/manga-mapped.json'), TRUE); $expected = json_file_decode($this->mockDir . '/manga-mapped.json');
$actual = $this->model->map_by_status($original); $actual = $this->model->map_by_status($original);
$this->assertEquals($expected, $actual); $this->assertEquals($expected, $actual);
@ -43,7 +43,7 @@ class MangaModelTest extends AnimeClient_TestCase {
$reflect = new ReflectionClass($this->model); $reflect = new ReflectionClass($this->model);
$constants = $reflect->getConstants(); $constants = $reflect->getConstants();
$expected_all = json_decode(file_get_contents($this->mockDir . '/manga-mapped.json'), TRUE); $expected_all = json_file_decode($this->mockDir . '/manga-mapped.json');
$this->assertEquals($expected_all, $this->model->_get_list_from_api()); $this->assertEquals($expected_all, $this->model->_get_list_from_api());
@ -62,7 +62,6 @@ $this->markTestSkipped();
$this->markTestSkipped(); $this->markTestSkipped();
} }
$data = $this->model->get_all_lists(); $data = $this->model->get_all_lists();
$this->assertEquals($data['Reading'], $this->model->get_list('Reading')); $this->assertEquals($data['Reading'], $this->model->get_list('Reading'));
} }
@ -75,7 +74,7 @@ $this->markTestSkipped();
$this->markTestSkipped(); $this->markTestSkipped();
} }
$data = json_decode(file_get_contents($this->mockDir . '/manga-mapped.json'), TRUE); $data = json_file_decode($this->mockDir . '/manga-mapped.json');
foreach($data as &$val) foreach($data as &$val)
{ {

View File

@ -14,13 +14,13 @@ class RoutingBaseTest extends AnimeClient_TestCase {
{ {
return [ return [
'empty_segment' => [ 'empty_segment' => [
'request_uri' => ' // ', 'request_uri' => ' // ',
'path' => '/', 'path' => '/',
'segments' => ['', ''], 'segments' => ['', ''],
'last_segment' => NULL 'last_segment' => NULL
], ],
'three_segments' => [ 'three_segments' => [
'request_uri' => '/anime/watching/list ', 'request_uri' => '/anime/watching/list ',
'path' => '/anime/watching/list', 'path' => '/anime/watching/list',
'segments' => ['', 'anime', 'watching', 'list'], 'segments' => ['', 'anime', 'watching', 'list'],
'last_segment' => 'list' 'last_segment' => 'list'
@ -33,7 +33,6 @@ class RoutingBaseTest extends AnimeClient_TestCase {
*/ */
public function testSegments($request_uri, $path, $segments, $last_segment) public function testSegments($request_uri, $path, $segments, $last_segment)
{ {
$this->markTestSkipped();
$this->setSuperGlobals([ $this->setSuperGlobals([
'_SERVER' => [ '_SERVER' => [
'REQUEST_URI' => $request_uri 'REQUEST_URI' => $request_uri

View File

@ -12,6 +12,12 @@ use Aviat\AnimeClient\Config;
* Base class for TestCases * Base class for TestCases
*/ */
class AnimeClient_TestCase extends PHPUnit_Framework_TestCase { class AnimeClient_TestCase extends PHPUnit_Framework_TestCase {
// Test directory constants
const ROOT_DIR = __DIR__ . '/../';
const SRC_DIR = __DIR__ . '/../src';
const TEST_DATA_DIR = __DIR__ . '/test_data';
const TEST_VIEW_DIR = __DIR__ . '/test_views';
protected $container; protected $container;
protected static $staticContainer; protected static $staticContainer;
protected static $session_handler; protected static $session_handler;
@ -24,7 +30,7 @@ class AnimeClient_TestCase extends PHPUnit_Framework_TestCase {
self::$session_handler = $session_handler; self::$session_handler = $session_handler;
// Remove test cache files // Remove test cache files
$files = glob(_dir(TEST_DATA_DIR, 'cache', '*.json')); $files = glob(_dir(self::TEST_DATA_DIR, 'cache', '*.json'));
array_map('unlink', $files); array_map('unlink', $files);
} }
@ -32,10 +38,13 @@ class AnimeClient_TestCase extends PHPUnit_Framework_TestCase {
{ {
parent::setUp(); parent::setUp();
$ROOT_DIR = realpath(_dir(__DIR__, '/../'));
$APP_DIR = _dir($ROOT_DIR, 'app');
$config_array = [ $config_array = [
'asset_path' => '//localhost/assets/', 'asset_path' => '//localhost/assets/',
'img_cache_path' => _dir(ROOT_DIR, 'public/images'), 'img_cache_path' => _dir(self::ROOT_DIR, 'public/images'),
'data_cache_path' => _dir(TEST_DATA_DIR, 'cache'), 'data_cache_path' => _dir(self::TEST_DATA_DIR, 'cache'),
'database' => [ 'database' => [
'collection' => [ 'collection' => [
'type' => 'sqlite', 'type' => 'sqlite',
@ -59,7 +68,7 @@ class AnimeClient_TestCase extends PHPUnit_Framework_TestCase {
]; ];
// Set up DI container // Set up DI container
$di = require _dir(APP_DIR, 'bootstrap.php'); $di = require _dir($APP_DIR, 'bootstrap.php');
$container = $di($config_array); $container = $di($config_array);
$container->set('error-handler', new MockErrorHandler()); $container->set('error-handler', new MockErrorHandler());
$container->set('session-handler', self::$session_handler); $container->set('session-handler', self::$session_handler);

View File

@ -14,7 +14,7 @@ class HtmlViewTest extends ViewTest {
public function testRenderTemplate() public function testRenderTemplate()
{ {
$path = _dir(TEST_VIEW_DIR, 'test_view.php'); $path = _dir(self::TEST_VIEW_DIR, 'test_view.php');
$expected = '<tag>foo</tag>'; $expected = '<tag>foo</tag>';
$actual = $this->view->render_template($path, [ $actual = $this->view->render_template($path, [
'var' => 'foo' 'var' => 'foo'

View File

@ -3,8 +3,10 @@
* Global setup for unit tests * Global setup for unit tests
*/ */
use Aviat\AnimeClient\AnimeClient;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Autoloaders // Global functions
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
/** /**
@ -18,15 +20,26 @@ function _dir()
return implode(DIRECTORY_SEPARATOR, func_get_args()); return implode(DIRECTORY_SEPARATOR, func_get_args());
} }
/**
* Decode a json file into a php data structure
*
* @param string $file
* @param bool $as_array
* @return array|object
*/
function json_file_decode($file, $as_array=TRUE)
{
return AnimeClient::json_file_decode($file, $as_array);
}
// -----------------------------------------------------------------------------
// Autoloading
// -----------------------------------------------------------------------------
require _dir(__DIR__, 'AnimeClient_TestCase.php');
// Define base path constants // Define base path constants
define('ROOT_DIR', realpath(_dir(__DIR__, "/../"))); require _dir(__DIR__, '../vendor/autoload.php');
define('APP_DIR', _dir(ROOT_DIR, 'app'));
define('CONF_DIR', _dir(APP_DIR, 'config'));
define('SRC_DIR', _dir(ROOT_DIR, 'src'));
define('BASE_DIR', _dir(SRC_DIR, 'Base'));
define('TEST_DATA_DIR', _dir(__DIR__, 'test_data'));
define('TEST_VIEW_DIR', _dir(__DIR__, 'test_views'));
require _dir(ROOT_DIR, '/vendor/autoload.php');
/** /**
* Set up autoloaders * Set up autoloaders
@ -36,7 +49,7 @@ require _dir(ROOT_DIR, '/vendor/autoload.php');
*/ */
spl_autoload_register(function ($class) { spl_autoload_register(function ($class) {
$class_parts = explode('\\', $class); $class_parts = explode('\\', $class);
$ns_path = SRC_DIR . '/' . implode('/', $class_parts) . ".php"; $ns_path = AnimeClient_TestCase::SRC_DIR . '/' . implode('/', $class_parts) . ".php";
if (file_exists($ns_path)) if (file_exists($ns_path))
{ {
@ -65,6 +78,5 @@ $_COOKIE = [];
// Request base test case and mocks // Request base test case and mocks
require _dir(__DIR__, 'TestSessionHandler.php'); require _dir(__DIR__, 'TestSessionHandler.php');
require _dir(__DIR__, 'mocks.php'); require _dir(__DIR__, 'mocks.php');
require _dir(__DIR__, 'AnimeClient_TestCase.php');
// End of bootstrap.php // End of bootstrap.php

View File

@ -151,7 +151,7 @@ class TestMangaModel extends MangaModel {
protected function _check_cache($response) protected function _check_cache($response)
{ {
$file = __DIR__ . '/test_data/manga_list/manga-transformed.json'; $file = __DIR__ . '/test_data/manga_list/manga-transformed.json';
return json_decode(file_get_contents($file), TRUE); return json_file_decode($file);
} }
} }
// End of mocks.php // End of mocks.php