Alexander Demidov
5 years ago
commit
b3c03162f1
16 changed files with 898 additions and 0 deletions
-
3.gitignore
-
22LICENSE
-
111README.md
-
33composer.json
-
18phpunit.xml
-
143src/Cache.php
-
14src/Facades/Settings.php
-
169src/Settings.php
-
62src/SettingsServiceProvider.php
-
33src/config/settings.php
-
33src/database/migrations/2015_04_13_020453_create_settings_table.php
-
34src/database/migrations/2015_12_15_020453_alter_settings_table.php
-
20src/helpers.php
-
73tests/CacheTest.php
-
123tests/SettingsTest.php
-
7tests/bootstrap.php
@ -0,0 +1,3 @@ |
|||
/.idea |
|||
/vendor |
|||
composer.lock |
@ -0,0 +1,22 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2015 Efriandika Pratama |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
|||
|
@ -0,0 +1,111 @@ |
|||
[![Latest Stable Version](https://poser.pugx.org/efriandika/laravel-settings/v/stable.svg)](https://packagist.org/packages/efriandika/laravel-settings) |
|||
[![Total Downloads](https://poser.pugx.org/efriandika/laravel-settings/downloads.svg)](https://packagist.org/packages/efriandika/laravel-settings) |
|||
[![Latest Unstable Version](https://poser.pugx.org/efriandika/laravel-settings/v/unstable.svg)](https://packagist.org/packages/efriandika/laravel-settings) |
|||
[![License](https://poser.pugx.org/efriandika/laravel-settings/license.svg)](https://packagist.org/packages/efriandika/laravel-settings) |
|||
|
|||
# Laravel-Settings |
|||
Laravel 5.1.x Persistent Settings (Database + Cache) |
|||
|
|||
### Attention: for update to v1.2.0 |
|||
Re-Publish new migration file |
|||
|
|||
$ php artisan vendor:publish --provider="Efriandika\LaravelSettings\SettingsServiceProvider" --force |
|||
|
|||
And run |
|||
|
|||
$ php artisan migrate |
|||
|
|||
## How to Install |
|||
Require this package with composer ([Packagist](https://packagist.org/packages/efriandika/laravel-settings)) using the following command: |
|||
|
|||
composer require efriandika/laravel-settings |
|||
|
|||
or modify your `composer.json`: |
|||
|
|||
"require": { |
|||
"efriandika/laravel-settings": "1.*" |
|||
} |
|||
|
|||
then run `composer update`: |
|||
|
|||
After updating composer, Register the ServiceProvider to the `providers` array in `config/app.php` |
|||
|
|||
'Efriandika\LaravelSettings\SettingsServiceProvider', |
|||
|
|||
Add an alias for the facade to `aliases` array in your `config/app.php` |
|||
|
|||
'Settings' => Efriandika\LaravelSettings\Facades\Settings::class, |
|||
|
|||
Publish the config and migration files now (Attention: This command will not work if you don't follow previous instruction): |
|||
|
|||
$ php artisan vendor:publish --provider="Efriandika\LaravelSettings\SettingsServiceProvider" --force |
|||
|
|||
Change `config/settings.php` according to your needs. If you change `db_table`, don't forget to change the table's name |
|||
in the migration file as well. |
|||
|
|||
Create the `settings` table. |
|||
|
|||
$ php artisan migrate |
|||
|
|||
|
|||
## How to Use it? |
|||
|
|||
Set a value |
|||
|
|||
Settings::set('key', 'value'); |
|||
|
|||
Get a value |
|||
|
|||
$value = Settings::get('key'); |
|||
|
|||
Get a value with Default Value. |
|||
|
|||
$value = Settings::get('key', 'Default Value'); |
|||
|
|||
> Note: If key is not found (null) in cache or settings table, it will return default value |
|||
|
|||
Get a value via an helper |
|||
|
|||
$value = settings('key'); |
|||
$value = settings('key', 'default value'); |
|||
|
|||
Forget a value |
|||
|
|||
Settings::forget('key'); |
|||
|
|||
Forget all values |
|||
|
|||
Settings::flush(); |
|||
|
|||
## Fallback to Laravel Config (available in v1.2.0) |
|||
|
|||
How to activate? |
|||
|
|||
// Change your config/settings.php |
|||
'fallback' => true |
|||
|
|||
Example |
|||
|
|||
/* |
|||
* If the value with key => mail.host is not found in cache or DB of Larave Settings |
|||
* it will return same value as config::get('mail.host'); |
|||
*/ |
|||
Settings::get('mail.host'); |
|||
|
|||
> Note: It will work if default value in laravel setting is not set |
|||
|
|||
### Changelogs |
|||
v1.2.0 - Dec 16th, 2015 |
|||
|
|||
* Bugs fix |
|||
* Adding Feature: Fallback Value |
|||
|
|||
|
|||
### To Do |
|||
|
|||
- |
|||
|
|||
### License |
|||
|
|||
The Laravel 5 Persistent Settings is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT) |
|||
|
@ -0,0 +1,33 @@ |
|||
{ |
|||
"name": "efriandika/laravel-settings", |
|||
"description": "Laravel 5 Persistent Settings", |
|||
"keywords": [ |
|||
"laravel", |
|||
"settings", |
|||
"persistent" |
|||
], |
|||
"license": "MIT", |
|||
"authors": [ |
|||
{ |
|||
"name": "Efriandika Pratama", |
|||
"email": "efriandika@gmail.com" |
|||
} |
|||
], |
|||
"require": { |
|||
"php": ">=5.5.9", |
|||
"illuminate/support": "5.*" |
|||
}, |
|||
"require-dev": { |
|||
"phpunit/phpunit": "4.6.*", |
|||
"illuminate/database": ">=5.1 <6.0", |
|||
"illuminate/events": ">=4.1 <6.0" |
|||
}, |
|||
"autoload": { |
|||
"files": [ |
|||
"src/helpers.php" |
|||
], |
|||
"psr-4": { |
|||
"Efriandika\\LaravelSettings\\": "src/" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,18 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<phpunit backupGlobals="false" |
|||
backupStaticAttributes="false" |
|||
bootstrap="tests/bootstrap.php" |
|||
colors="true" |
|||
convertErrorsToExceptions="true" |
|||
convertNoticesToExceptions="true" |
|||
convertWarningsToExceptions="true" |
|||
processIsolation="false" |
|||
stopOnFailure="false" |
|||
syntaxCheck="false"> |
|||
|
|||
<testsuites> |
|||
<testsuite name="Package Test Suite"> |
|||
<directory suffix=".php">./tests/</directory> |
|||
</testsuite> |
|||
</testsuites> |
|||
</phpunit> |
@ -0,0 +1,143 @@ |
|||
<?php namespace Efriandika\LaravelSettings; |
|||
|
|||
/** |
|||
* Class Cache |
|||
* @package Efriandika\LaravelSettings |
|||
*/ |
|||
class Cache |
|||
{ |
|||
|
|||
/** |
|||
* Path to cache file |
|||
* |
|||
* @var string |
|||
*/ |
|||
protected $cacheFile; |
|||
|
|||
/** |
|||
* Cached Settings |
|||
* |
|||
* @var array |
|||
*/ |
|||
protected $settings; |
|||
|
|||
|
|||
/** |
|||
* Constructor |
|||
* |
|||
* @param string $cacheFile |
|||
*/ |
|||
public function __construct($cacheFile) |
|||
{ |
|||
$this->cacheFile = $cacheFile; |
|||
$this->checkCacheFile(); |
|||
|
|||
$this->settings = $this->getAll(); |
|||
} |
|||
|
|||
/** |
|||
* Sets a value |
|||
* |
|||
* @param $key |
|||
* @param $value |
|||
* |
|||
* @return mixed |
|||
*/ |
|||
public function set($key, $value) |
|||
{ |
|||
$this->settings[$key] = $value; |
|||
$this->store(); |
|||
|
|||
return $value; |
|||
} |
|||
|
|||
/** |
|||
* Gets a value |
|||
* |
|||
* @param $key |
|||
* @param null $default |
|||
* |
|||
* @return mixed |
|||
*/ |
|||
public function get($key, $default = null) |
|||
{ |
|||
return (array_key_exists($key, $this->settings) ? $this->settings[$key] : $default); |
|||
} |
|||
|
|||
/** |
|||
* Checks if $key is cached |
|||
* |
|||
* @param $key |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function hasKey($key) |
|||
{ |
|||
return array_key_exists($key, $this->settings); |
|||
} |
|||
|
|||
/** |
|||
* Gets all cached settings |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function getAll() |
|||
{ |
|||
$values = json_decode(file_get_contents($this->cacheFile), true); |
|||
foreach ($values as $key => $value) { |
|||
$values[$key] = unserialize($value); |
|||
} |
|||
return $values; |
|||
} |
|||
|
|||
/** |
|||
* Stores all settings to the cache file |
|||
* |
|||
* @return void |
|||
*/ |
|||
private function store() |
|||
{ |
|||
$settings = []; |
|||
foreach ($this->settings as $key => $value) { |
|||
$settings[$key] = serialize($value); |
|||
} |
|||
file_put_contents($this->cacheFile, json_encode($settings)); |
|||
} |
|||
|
|||
/** |
|||
* Removes a value |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function forget($key) |
|||
{ |
|||
if (array_key_exists($key, $this->settings)) { |
|||
unset($this->settings[$key]); |
|||
} |
|||
$this->store(); |
|||
} |
|||
|
|||
/** |
|||
* Removes all values |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function flush() |
|||
{ |
|||
file_put_contents($this->cacheFile, json_encode([])); |
|||
// fixed the set after immediately the flush, should be returned empty
|
|||
$this->settings = []; |
|||
} |
|||
|
|||
/** |
|||
* Checks if the cache file exists and creates it if not |
|||
* |
|||
* @return void |
|||
*/ |
|||
private function checkCacheFile() |
|||
{ |
|||
if (!file_exists($this->cacheFile)) { |
|||
$this->flush(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,14 @@ |
|||
<?php namespace Efriandika\LaravelSettings\Facades; |
|||
|
|||
use Illuminate\Support\Facades\Facade; |
|||
|
|||
class Settings extends Facade { |
|||
|
|||
/** |
|||
* Get the registered name of the component. |
|||
* |
|||
* @return string |
|||
*/ |
|||
protected static function getFacadeAccessor() { return 'settings'; } |
|||
|
|||
} |
@ -0,0 +1,169 @@ |
|||
<?php namespace Efriandika\LaravelSettings; |
|||
|
|||
use Illuminate\Database\DatabaseManager; |
|||
use Illuminate\Support\Facades\Config; |
|||
|
|||
/** |
|||
* Class Settings |
|||
* @package Efriandika\LaravelSettings |
|||
*/ |
|||
class Settings |
|||
{ |
|||
|
|||
/** |
|||
* Registry config |
|||
* |
|||
* @var array |
|||
*/ |
|||
protected $config; |
|||
|
|||
|
|||
/** |
|||
* Database manager instance |
|||
* |
|||
* @var \Illuminate\Database\DatabaseManager |
|||
*/ |
|||
protected $database; |
|||
|
|||
/** |
|||
* Cache |
|||
* |
|||
* @var \Efriandika\LaravelSettings\Cache |
|||
*/ |
|||
protected $cache; |
|||
|
|||
/** |
|||
* Constructor |
|||
* |
|||
* @param DatabaseManager $database |
|||
*/ |
|||
public function __construct(DatabaseManager $database, Cache $cache, $config = array ()) |
|||
{ |
|||
$this->database = $database; |
|||
$this->config = $config; |
|||
$this->cache = $cache; |
|||
} |
|||
|
|||
/** |
|||
* Gets a value |
|||
* |
|||
* @param string $key |
|||
* @param string $default |
|||
* |
|||
* @return mixed |
|||
*/ |
|||
public function get($key, $default = null) |
|||
{ |
|||
$value = $this->fetch($key); |
|||
|
|||
if(!is_null($value)) |
|||
return $value; |
|||
else if($default != null) |
|||
return $default; |
|||
else if($this->config['fallback']) |
|||
return Config::get($key, null); |
|||
else |
|||
return $default; |
|||
} |
|||
|
|||
/** |
|||
* @param $key |
|||
* |
|||
* @return mixed|null |
|||
*/ |
|||
private function fetch($key) |
|||
{ |
|||
|
|||
if ($this->cache->hasKey($key)) { |
|||
return $this->cache->get($key); |
|||
} |
|||
|
|||
$row = $this->database->table($this->config['db_table'])->where('setting_key', $key)->first(['setting_value']); |
|||
|
|||
return (!is_null($row)) ? $this->cache->set($key, unserialize($row->setting_value)) : null; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Checks if setting exists |
|||
* |
|||
* @param $key |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function hasKey($key) |
|||
{ |
|||
if ($this->cache->hasKey($key)) { |
|||
return true; |
|||
} |
|||
$row = $this->database->table($this->config['db_table'])->where('setting_key', $key)->first(['setting_value']); |
|||
|
|||
return (count($row) > 0); |
|||
} |
|||
|
|||
/** |
|||
* Store value into registry |
|||
* |
|||
* @param string $key |
|||
* @param mixed $value |
|||
* |
|||
* @return mixed |
|||
*/ |
|||
public function set($key, $value) |
|||
{ |
|||
$value = serialize($value); |
|||
|
|||
$setting = $this->database->table($this->config['db_table'])->where('setting_key', $key)->first(); |
|||
|
|||
if (is_null($setting)) { |
|||
$this->database->table($this->config['db_table']) |
|||
->insert(['setting_key' => $key, 'setting_value' => $value]); |
|||
} else { |
|||
$this->database->table($this->config['db_table']) |
|||
->where('setting_key', $key) |
|||
->update(['setting_value' => $value]); |
|||
} |
|||
|
|||
$this->cache->set($key, unserialize($value)); |
|||
|
|||
return $value; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Remove a setting |
|||
* |
|||
* @param string $key |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function forget($key) |
|||
{ |
|||
$this->database->table($this->config['db_table'])->where('setting_key', $key)->delete(); |
|||
$this->cache->forget($key); |
|||
} |
|||
|
|||
/** |
|||
* Remove all settings |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function flush() |
|||
{ |
|||
$this->cache->flush(); |
|||
|
|||
return $this->database->table($this->config['db_table'])->delete(); |
|||
} |
|||
|
|||
/** |
|||
* Fetch all values |
|||
* |
|||
* @return mixed |
|||
*/ |
|||
public function getAll() |
|||
{ |
|||
return $this->cache->getAll(); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,62 @@ |
|||
<?php namespace Efriandika\LaravelSettings; |
|||
|
|||
use Illuminate\Support\ServiceProvider; |
|||
|
|||
class SettingsServiceProvider extends ServiceProvider |
|||
{ |
|||
|
|||
/** |
|||
* Indicates if loading of the provider is deferred. |
|||
* |
|||
* @var bool |
|||
*/ |
|||
protected $defer = false; |
|||
|
|||
/** |
|||
* Bootstrap the application events. |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function boot() |
|||
{ |
|||
$this->publishes([ |
|||
__DIR__ . '/config/settings.php' => config_path('settings.php') |
|||
]); |
|||
$this->publishes([ |
|||
__DIR__ . '/database/migrations/' => base_path('/database/migrations') |
|||
]); |
|||
} |
|||
|
|||
/** |
|||
* Register the service provider. |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function register() |
|||
{ |
|||
$this->mergeConfigFrom( |
|||
__DIR__ . '/config/settings.php', 'settings' |
|||
); |
|||
$this->app['settings'] = function ($app) { |
|||
|
|||
$config = $app->config->get('settings', [ |
|||
'cache_file' => storage_path('settings.json'), |
|||
'db_table' => 'settings' |
|||
]); |
|||
|
|||
return new Settings($app['db'], new Cache($config['cache_file']), $config); |
|||
}; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Get the services provided by the provider. |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function provides() |
|||
{ |
|||
return array ('settings'); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,33 @@ |
|||
<?php |
|||
return [ |
|||
/* |
|||
|-------------------------------------------------------------------------- |
|||
| Cache Filename |
|||
|-------------------------------------------------------------------------- |
|||
| |
|||
| Cache configuration path |
|||
| |
|||
*/ |
|||
'cache_file' => storage_path('settings.json'), |
|||
|
|||
/* |
|||
|-------------------------------------------------------------------------- |
|||
| Table name to store settings |
|||
|-------------------------------------------------------------------------- |
|||
| |
|||
| Info: If you change this table name, dont forget to update your settings migrations file. |
|||
| |
|||
*/ |
|||
'db_table' => 'settings', |
|||
|
|||
/* |
|||
|-------------------------------------------------------------------------- |
|||
| Fallback setting |
|||
|-------------------------------------------------------------------------- |
|||
| |
|||
| Return Laravel config if the value with particular key is not found in cache or DB. |
|||
| It will work if default value in laravel setting is not set, and this value is set to true |
|||
| |
|||
*/ |
|||
'fallback' => true |
|||
]; |
@ -0,0 +1,33 @@ |
|||
<?php |
|||
|
|||
use Illuminate\Database\Migrations\Migration; |
|||
use Illuminate\Database\Schema\Blueprint; |
|||
|
|||
class CreateSettingsTable extends Migration { |
|||
|
|||
/** |
|||
* Run the migrations. |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function up() |
|||
{ |
|||
Schema::create('settings', function(Blueprint $table) |
|||
{ |
|||
$table->string('key', 100)->index()->unique('key'); |
|||
$table->text('value', 65535)->nullable(); |
|||
}); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Reverse the migrations. |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function down() |
|||
{ |
|||
Schema::drop('settings'); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,34 @@ |
|||
<?php |
|||
|
|||
use Illuminate\Database\Migrations\Migration; |
|||
|
|||
class AlterSettingsTable extends Migration { |
|||
|
|||
/** |
|||
* Run the migrations. |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function up() |
|||
{ |
|||
Schema::table('settings', function ($table) { |
|||
$table->renameColumn('key', 'setting_key'); |
|||
$table->renameColumn('value', 'setting_value'); |
|||
}); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Reverse the migrations. |
|||
* |
|||
* @return void |
|||
*/ |
|||
public function down() |
|||
{ |
|||
Schema::table('settings', function ($table) { |
|||
$table->renameColumn('setting_key', 'key'); |
|||
$table->renameColumn('setting_value', 'value'); |
|||
}); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,20 @@ |
|||
<?php |
|||
|
|||
use Efriandika\LaravelSettings\Facades\Settings; |
|||
|
|||
if (!function_exists('settings')) |
|||
{ |
|||
/** |
|||
* @param string|null $key |
|||
* @param null $default |
|||
* @return mixed|\Efriandika\LaravelSettings\Facades\Settings |
|||
*/ |
|||
function settings($key = null, $default = null) |
|||
{ |
|||
if (is_null($key)) { |
|||
return app('settings'); |
|||
} |
|||
|
|||
return Settings::get($key, $default); |
|||
} |
|||
} |
@ -0,0 +1,73 @@ |
|||
<?php |
|||
use Efriandika\LaravelSettings\Cache; |
|||
|
|||
class CacheTest extends PHPUnit_Framework_TestCase |
|||
{ |
|||
protected $cache; |
|||
protected $cacheFile; |
|||
|
|||
protected function setUp() |
|||
{ |
|||
$this->cacheFile = storage_path('settings.json'); |
|||
$this->cache = new Cache($this->cacheFile); |
|||
} |
|||
|
|||
public function testSet() |
|||
{ |
|||
$this->cache->set('key', 'value'); |
|||
|
|||
$contents = file_get_contents($this->cacheFile); |
|||
$this->assertEquals('{"key":"s:5:\"value\";"}', $contents); |
|||
} |
|||
public function testSetArray() |
|||
{ |
|||
$set = ['value' => 1, 'value2' => 2]; |
|||
$this->cache->set('key', $set); |
|||
|
|||
$contents = file_get_contents($this->cacheFile); |
|||
$this->assertEquals('{"key":"a:2:{s:5:\"value\";i:1;s:6:\"value2\";i:2;}"}', $contents); |
|||
|
|||
$this->assertEquals($this->cache->get('key'), $set); |
|||
} |
|||
|
|||
public function testGet() |
|||
{ |
|||
$this->cache->set('key', 'value'); |
|||
$this->assertEquals('value', $this->cache->get('key')); |
|||
} |
|||
|
|||
public function testGetAll() |
|||
{ |
|||
$this->cache->set('key', 'value'); |
|||
$this->cache->set('key2', 'value2'); |
|||
|
|||
$this->assertEquals(['key' => 'value', 'key2' => 'value2'], $this->cache->getAll()); |
|||
} |
|||
|
|||
public function testFlush() |
|||
{ |
|||
$this->cache->set('key', 'value'); |
|||
$this->cache->flush(); |
|||
$this->assertEquals([], $this->cache->getAll()); |
|||
} |
|||
|
|||
public function testHasKey() |
|||
{ |
|||
$this->cache->set('key', 'value'); |
|||
$this->assertTrue($this->cache->hasKey('key')); |
|||
} |
|||
|
|||
public function testForget() |
|||
{ |
|||
$this->cache->set('key', 'value'); |
|||
$this->cache->forget('key'); |
|||
$this->assertNull($this->cache->get('key')); |
|||
} |
|||
|
|||
|
|||
protected function tearDown() |
|||
{ |
|||
@unlink(storage_path('settings.json')); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,123 @@ |
|||
<?php |
|||
use Illuminate\Container\Container; |
|||
use Illuminate\Database\Capsule\Manager as Capsule; |
|||
use Illuminate\Events\Dispatcher; |
|||
use Efriandika\LaravelSettings\Settings; |
|||
use Efriandika\LaravelSettings\Cache; |
|||
|
|||
class SettingsTest extends PHPUnit_Framework_TestCase |
|||
{ |
|||
protected $settings; |
|||
protected $db; |
|||
protected $config; |
|||
|
|||
protected function setUp() |
|||
{ |
|||
$this->db = $this->initDb(); |
|||
|
|||
$this->config = [ |
|||
'db_table' => 'settings', |
|||
'cache_file' => storage_path('settings.json'), |
|||
]; |
|||
$this->settings = new Settings($this->db, new Cache($this->config['cache_file']), $this->config); |
|||
} |
|||
|
|||
|
|||
public function testSet() |
|||
{ |
|||
$this->settings->set('key', 'value'); |
|||
|
|||
$setting = $this->db->table($this->config['db_table'])->where('key', 'key')->first(['value']); |
|||
$this->assertEquals('value', unserialize($setting['value'])); |
|||
} |
|||
|
|||
public function testSetArray() |
|||
{ |
|||
$set = ['valuekey' => 'value']; |
|||
$this->settings->set('key', $set); |
|||
|
|||
$setting = $this->db->table($this->config['db_table'])->where('key', 'key')->first(['value']); |
|||
|
|||
$this->assertEquals($set, unserialize($setting['value'])); |
|||
$this->assertEquals($set, $this->settings->get('key')); |
|||
} |
|||
|
|||
public function testGet() |
|||
{ |
|||
$this->settings->set('key', 'value'); |
|||
$this->assertEquals('value', $this->settings->get('key')); |
|||
} |
|||
|
|||
public function testGetAll() |
|||
{ |
|||
$this->settings->set('key', 'value'); |
|||
$this->settings->set('key2', 'value2'); |
|||
|
|||
$this->assertEquals('value', $this->settings->get('key')); |
|||
$this->assertEquals('value2', $this->settings->get('key2')); |
|||
|
|||
$this->assertEquals(['key' => 'value', 'key2' => 'value2'], $this->settings->getAll()); |
|||
} |
|||
|
|||
public function testFlush() |
|||
{ |
|||
$this->settings->set('key', 'value'); |
|||
$this->settings->flush(); |
|||
$this->assertEquals([], $this->settings->getAll()); |
|||
} |
|||
|
|||
public function testHasKey() |
|||
{ |
|||
$this->settings->set('key', 'value'); |
|||
$this->assertTrue($this->settings->hasKey('key')); |
|||
$this->assertFalse($this->settings->hasKey('key2')); |
|||
} |
|||
public function testHasKeyWithoutCache() |
|||
{ |
|||
$this->settings->set('key', 'value'); |
|||
$this->assertTrue($this->settings->hasKey('key')); |
|||
$this->assertFalse($this->settings->hasKey('key2')); |
|||
|
|||
@unlink(storage_path('settings.json')); |
|||
$this->assertTrue($this->settings->hasKey('key')); |
|||
$this->assertFalse($this->settings->hasKey('key2')); |
|||
|
|||
} |
|||
|
|||
public function testForget() |
|||
{ |
|||
$this->settings->set('key', 'value'); |
|||
$this->settings->forget('key'); |
|||
$this->assertNull($this->settings->get('key')); |
|||
} |
|||
|
|||
protected function tearDown() |
|||
{ |
|||
Capsule::schema()->drop('settings'); |
|||
@unlink(storage_path('settings.json')); |
|||
} |
|||
|
|||
|
|||
private function initDb() |
|||
{ |
|||
$capsule = new Capsule; |
|||
|
|||
$capsule->addConnection([ |
|||
'driver' => 'sqlite', |
|||
'host' => 'localhost', |
|||
'database' => ':memory:', |
|||
'prefix' => '', |
|||
]); |
|||
$capsule->setEventDispatcher(new Dispatcher(new Container)); |
|||
$capsule->setAsGlobal(); |
|||
$capsule->bootEloquent(); |
|||
|
|||
Capsule::schema()->create('settings', function ($table) { |
|||
$table->string('key', 100)->index()->unique('key'); |
|||
$table->text('value', 65535)->nullable(); |
|||
}); |
|||
|
|||
return $capsule->getDatabaseManager(); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,7 @@ |
|||
<?php |
|||
|
|||
require dirname(__DIR__) . '/vendor/autoload.php'; |
|||
|
|||
function storage_path($filename) { |
|||
return dirname(__DIR__) . '/tests/' . $filename; |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue