Add check for plugin updates
This commit is contained in:
parent
4a2edb2291
commit
6570e3327f
|
|
@ -47,6 +47,19 @@ class MarketController extends Controller
|
||||||
return Datatables::of($plugins)->setRowId('plugin-{{ $name }}')->make(true);
|
return Datatables::of($plugins)->setRowId('plugin-{{ $name }}')->make(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function checkUpdates()
|
||||||
|
{
|
||||||
|
$pluginsHaveUpdate = collect($this->getAllAvailablePlugins())->filter(function ($item) {
|
||||||
|
$plugin = plugin($item['name']);
|
||||||
|
return $plugin && Comparator::greaterThan($item['version'], $plugin->version);
|
||||||
|
});
|
||||||
|
|
||||||
|
return json([
|
||||||
|
'available' => !$pluginsHaveUpdate->isEmpty(),
|
||||||
|
'plugins' => array_values($pluginsHaveUpdate->all())
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
public function download(Request $request, PluginManager $manager)
|
public function download(Request $request, PluginManager $manager)
|
||||||
{
|
{
|
||||||
$name = $request->get('name');
|
$name = $request->get('name');
|
||||||
|
|
|
||||||
|
|
@ -682,6 +682,42 @@ describe('tests for "market" module', () => {
|
||||||
expect(toastr.success).toBeCalledWith('success');
|
expect(toastr.success).toBeCalledWith('success');
|
||||||
expect(reloadTable).toBeCalledWith(null, false);
|
expect(reloadTable).toBeCalledWith(null, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('check for plugin updates', async () => {
|
||||||
|
const fetch = jest.fn()
|
||||||
|
.mockReturnValueOnce(Promise.resolve({
|
||||||
|
available: false,
|
||||||
|
plugins: []
|
||||||
|
}))
|
||||||
|
.mockReturnValueOnce(Promise.resolve({
|
||||||
|
available: true,
|
||||||
|
plugins: [{
|
||||||
|
name: 'hello-dolly',
|
||||||
|
version: '8.1.0'
|
||||||
|
}]
|
||||||
|
}));
|
||||||
|
const url = jest.fn(path => path);
|
||||||
|
|
||||||
|
window.fetch = fetch;
|
||||||
|
window.url = url;
|
||||||
|
|
||||||
|
document.body.innerHTML = `
|
||||||
|
<a id="target" href="admin/plugins/market"><i class="fa fa-shopping-bag"></i> <span>Plugin Market</span></a>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const checkForPluginUpdates = require(modulePath).checkForPluginUpdates;
|
||||||
|
|
||||||
|
await checkForPluginUpdates();
|
||||||
|
expect($('#target').html()).toBe(
|
||||||
|
'<i class="fa fa-shopping-bag"></i> <span>Plugin Market</span>'
|
||||||
|
);
|
||||||
|
|
||||||
|
await checkForPluginUpdates();
|
||||||
|
expect($('#target').html()).toBe(
|
||||||
|
'<i class="fa fa-shopping-bag"></i> <span>Plugin Market</span>'+
|
||||||
|
'<span class="label label-success pull-right">1</span>'
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('tests for "update" module', () => {
|
describe('tests for "update" module', () => {
|
||||||
|
|
|
||||||
|
|
@ -150,8 +150,22 @@ async function updatePlugin(name) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function checkForPluginUpdates() {
|
||||||
|
try {
|
||||||
|
const data = await fetch({ url: url('admin/plugins/market/check') });
|
||||||
|
if (data.available === true) {
|
||||||
|
const dom = `<span class="label label-success pull-right">${data.plugins.length}</span>`;
|
||||||
|
|
||||||
|
$(`[href="${url('admin/plugins/market')}"]`).append(dom);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'test') {
|
if (process.env.NODE_ENV === 'test') {
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
checkForPluginUpdates,
|
||||||
initMarketTable,
|
initMarketTable,
|
||||||
installPlugin,
|
installPlugin,
|
||||||
updatePlugin,
|
updatePlugin,
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,12 @@
|
||||||
@include('common.dependencies.script', ['module' => 'admin'])
|
@include('common.dependencies.script', ['module' => 'admin'])
|
||||||
|
|
||||||
@if (option('check_update'))
|
@if (option('check_update'))
|
||||||
<script>$(document).ready(checkForUpdates);</script>
|
<script>
|
||||||
|
$(document).ready(() => {
|
||||||
|
checkForUpdates();
|
||||||
|
checkForPluginUpdates();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if (option('allow_sending_statistics'))
|
@if (option('allow_sending_statistics'))
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,7 @@ Route::group(['middleware' => 'admin', 'prefix' => 'admin'], function ()
|
||||||
|
|
||||||
Route::get ('/market', 'MarketController@showMarket');
|
Route::get ('/market', 'MarketController@showMarket');
|
||||||
Route::post('/market-data', 'MarketController@getMarketData');
|
Route::post('/market-data', 'MarketController@getMarketData');
|
||||||
|
Route::get ('/market/check', 'MarketController@checkUpdates');
|
||||||
Route::post('/market/download', 'MarketController@download');
|
Route::post('/market/download', 'MarketController@download');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,42 @@ class MarketControllerTest extends TestCase
|
||||||
'msg' => trans('admin.plugins.market.install-success')
|
'msg' => trans('admin.plugins.market.install-success')
|
||||||
]);
|
]);
|
||||||
$this->assertTrue(is_dir(base_path('plugins/hello-dolly')));
|
$this->assertTrue(is_dir(base_path('plugins/hello-dolly')));
|
||||||
$this->assertFileNotExists(base_path('plugins/hello-dolly_v1.0.0.zip'));
|
$this->assertTrue(empty(glob(base_path('plugins/hello-dolly_*.zip'))));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCheckUpdates()
|
||||||
|
{
|
||||||
|
$plugin_dir = base_path('plugins/hello-dolly');
|
||||||
|
|
||||||
|
if (! is_dir($plugin_dir)) {
|
||||||
|
mkdir($plugin_dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->get('/admin/plugins/market/check')
|
||||||
|
->seeJson([
|
||||||
|
'available' => false,
|
||||||
|
'plugins' => []
|
||||||
|
]);
|
||||||
|
|
||||||
|
file_put_contents("$plugin_dir/package.json", json_encode([
|
||||||
|
'name' => 'hello-dolly',
|
||||||
|
'version' => '0.0.1',
|
||||||
|
'title' => '',
|
||||||
|
'description' => '',
|
||||||
|
'author' => '',
|
||||||
|
'url' => '',
|
||||||
|
'namespace' => ''
|
||||||
|
]));
|
||||||
|
|
||||||
|
// Refresh plugin manager
|
||||||
|
$this->app->singleton('plugins', App\Services\PluginManager::class);
|
||||||
|
$this->get('/admin/plugins/market/check')
|
||||||
|
->seeJsonSubset([
|
||||||
|
'available' => true,
|
||||||
|
'plugins' => [[
|
||||||
|
'name' => 'hello-dolly'
|
||||||
|
]]
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetMarketData()
|
public function testGetMarketData()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user