jqh 5 лет назад
Родитель
Сommit
77cb7063e9

+ 68 - 0
tests/Controllers/ReportController.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace Tests\Controllers;
+
+use App\Http\Controllers\Controller;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Layout\Content;
+use Illuminate\Contracts\Support\Renderable;
+use Tests\Repositories\Report;
+
+class ReportController extends Controller
+{
+    public function index(Content $content)
+    {
+        return $content->header('报表')->body($this->grid());
+    }
+
+    protected function grid()
+    {
+        $grid = new Grid(new Report);
+
+        // 开启responsive插件
+        $grid->responsive();
+        $grid->disableActions();
+        $grid->disableBatchDelete();
+        $grid->disableCreateButton();
+        $grid->disableQuickCreateButton();
+
+        $grid->setRowSelectorOptions(['style' => 'success', 'clicktr' => true]);
+
+        // 更改表格外层容器
+        $grid->wrap(function (Renderable $view) {
+            return $view;
+        });
+
+        $grid->combine('avgCost', ['avgMonthCost', 'avgQuarterCost', 'avgYearCost'])->responsive()->help('test');
+        $grid->combine('avgVist', ['avgMonthVist', 'avgQuarterVist', 'avgYearVist'])->responsive();
+        $grid->combine('top', ['topCost', 'topVist', 'topIncr'])->responsive()->style('color:#1867c0');
+
+        $grid->content->limit(50)->responsive();
+        $grid->cost->sortable()->responsive();
+        $grid->avgMonthCost->responsive();
+        $grid->avgQuarterCost->responsive()->setHeaderAttributes(['style' => 'color:#5b69bc']);
+        $grid->avgYearCost->responsive();
+        $grid->avgMonthVist->responsive();
+        $grid->avgQuarterVist->responsive();
+        $grid->avgYearVist->responsive();
+        $grid->incrs->hide();
+        $grid->avgVists->hide();
+        $grid->topCost->responsive();
+        $grid->topVist->responsive();
+        $grid->topIncr->responsive();
+        $grid->date->sortable()->responsive();
+
+        $grid->filter(function (Grid\Filter $filter) {
+            $filter->scope(1, admin_trans_field('month'))->where('date', 2019, '<=');
+            $filter->scope(2, admin_trans_label('quarter'))->where('date', 2019, '<=');
+            $filter->scope(3, admin_trans_label('year'))->where('date', 2019, '<=');
+
+            $filter->equal('content');
+            $filter->equal('cost');
+
+        });
+
+        return $grid;
+
+    }
+}

+ 40 - 0
tests/Feature/CombineGridTest.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace Tests\Feature;
+
+use Tests\TestCase;
+
+class CombineGridTest extends TestCase
+{
+    protected $login = true;
+
+    public function test()
+    {
+        $this->visit('admin/tests/report')
+            ->assertResponseStatus(200)
+            ->see('报表')
+            ->see('avgMonthCost')
+            ->see('avgVist')
+            ->see('avgCost')
+            ->see('top');
+
+        // Column::help
+        $this->assertCount(1, $this->crawler()->filter('th a i[class*=fa-question-circle]'));
+
+        $this->assertCount(2, $this->crawler()->filter('thead tr'));
+
+        $firstTr = $this->crawler()->filter('thead tr')->first()->filter('th');
+
+        // cost
+        $this->assertEquals("2", (string) $firstTr->eq(2)->attr('rowspan'));
+
+        // avgCost
+        $this->assertEquals("3", (string) $firstTr->eq(3)->attr('colspan'));
+
+        // avgVist
+        $this->assertEquals("3", (string) $firstTr->eq(4)->attr('colspan'));
+
+        // top
+        $this->assertEquals("3", (string) $firstTr->eq(5)->attr('colspan'));
+    }
+}

+ 109 - 0
tests/Feature/SectionTest.php

@@ -0,0 +1,109 @@
+<?php
+
+namespace Tests\Feature;
+
+use Tests\TestCase;
+
+class SectionTest extends TestCase
+{
+    public function testInjectValues()
+    {
+        // view
+        admin_inject_section('key1', view('admin-tests::test'));
+
+        $this->assertEquals(admin_section('key1'), '<h1>Hello world</h1>');
+
+        // string
+        admin_inject_section('key2', 'test');
+
+        $this->assertEquals(admin_section('key2'), 'test');
+
+        // callable
+        admin_inject_section('key3', function () {
+            return view('admin-tests::test');
+        });
+
+        $this->assertEquals(admin_section('key3'), '<h1>Hello world</h1>');
+    }
+
+    public function testOptions()
+    {
+        admin_inject_section('key1', 'value1');
+
+        admin_inject_section('key1', function ($options) {
+            return "previous:{$options->previous},name:{$options->name},age:{$options->age}";
+
+        }, false);
+
+        $this->assertEquals(
+            admin_section('key1', null, ['name' => 'Mike', 'age' => 18]),
+            'previous:value1,name:Mike,age:18'
+        );
+    }
+
+    public function testAppend()
+    {
+        // 1 append
+        admin_inject_section('key1', 'test1,');
+        admin_inject_section('key1', 'test2,');
+        admin_inject_section('key1', 'test3,');
+
+        $this->assertEquals(admin_section('key1'), 'test1,test2,test3,');
+
+        // 2 overwrite
+        admin_inject_section('key2', 'test1,');
+        admin_inject_section('key2', 'test2,', false);
+
+        $this->assertEquals(admin_section('key2'), 'test2,');
+
+        admin_inject_section('key2', 'test3,', false);
+
+        $this->assertEquals(admin_section('key2'), 'test3,');
+
+
+        // 3 overwrite
+        admin_inject_section('key3', 'test1,');
+        admin_inject_section('key3', 'test2,', false);
+        admin_inject_section('key3', function ($options) {
+            return $options->previous.'test3,';
+        }, false);
+        admin_inject_section('key3', function ($options) {
+            return $options->previous.'test4,';
+        }, false);
+
+        $this->assertEquals(admin_section('key3'), 'test2,test3,test4,');
+    }
+
+    public function testSort()
+    {
+        // 值越大排序越靠前
+        admin_inject_section('key1', '4,', true, -100);
+        admin_inject_section('key1', '2,', true, 2);
+        admin_inject_section('key1', '1,', true, 3);
+        admin_inject_section('key1', '3,', true, 1);
+
+        $this->assertEquals(admin_section('key1'), '1,2,3,4,');
+    }
+
+    public function testInjectDefaultSection()
+    {
+        // step1
+        admin_inject_default_section('key', 'Hello');
+
+        $this->assertEquals(admin_section('key'), 'Hello');
+
+        // step2
+        admin_inject_default_section('key', function ($options) {
+            return 'Hello '.$options->var1;
+        });
+
+        $this->assertEquals(admin_section('key', null, ['var1' => 'world']), 'Hello world');
+
+        // step3
+        admin_inject_section('key', '');
+
+        $this->assertEquals(admin_section('key'), '');
+
+    }
+
+}

+ 64 - 0
tests/Feature/TranslationTest.php

@@ -0,0 +1,64 @@
+<?php
+
+namespace Tests\Feature;
+
+use Illuminate\Translation\FileLoader;
+use Illuminate\Translation\Translator;
+use Tests\TestCase;
+
+class TranslationTest extends TestCase
+{
+    protected $login = true;
+
+    public function testTransField()
+    {
+        $this->visit('admin/tests/users');
+
+        $this->load();
+
+        $this->assertEquals('user', admin_controller_slug());
+
+        $this->assertEquals(admin_trans_field('username'), '用户名');
+        $this->assertEquals(admin_trans_field('profile.postcode'), '邮政编码');
+
+        $this->assertEquals(admin_trans_field('value'), 'value');
+        $this->assertEquals(admin_trans_field('profile.value'), 'value');
+
+    }
+
+    public function testTransLabel()
+    {
+        $this->visit('admin/tests/users');
+
+        $this->load();
+
+        $this->assertEquals('user', admin_controller_slug());
+
+        $this->assertEquals(admin_trans_label('user'), '用户');
+    }
+
+    public function testTransGlobal()
+    {
+        $this->visit('admin/tests/users');
+
+        $this->load();
+
+        $this->assertEquals('user', admin_controller_slug());
+
+        $this->assertEquals(admin_trans_field('id'), 'ID');
+        $this->assertEquals(admin_trans_field('profile.address'), '地址');
+
+        $this->assertEquals(admin_trans_label('List'), '列表');
+
+        $this->assertEquals(admin_trans_label('Create'), 'Create');
+    }
+
+    protected function load()
+    {
+        $loader = new FileLoader(app('files'), __DIR__ . '/../lang');
+
+        $translator = new Translator($loader, 'en');
+
+        app()->instance('translator', $translator);
+    }
+}

+ 13 - 13
tests/Feature/UserFormTest.php

@@ -12,7 +12,7 @@ class UserFormTest extends TestCase
 
     public function testCreatePage()
     {
-        $this->visit('admin/users/create')
+        $this->visit('admin/tests/users/create')
             ->seeElement('input[type=text][name=username]')
             ->seeElement('input[type=email][name=email]')
             ->seeElement('input[type=text][name=mobile]')
@@ -57,12 +57,12 @@ class UserFormTest extends TestCase
             ],
         ];
 
-        $this->visit('admin/users/create')
+        $this->visit('admin/tests/users/create')
 //            ->attach(__DIR__.'/assets/test.jpg', 'avatar')
 
             ->submitForm('Submit', $data);
 
-        $this->seePageIs('admin/users')
+        $this->seePageIs('admin/tests/users')
             ->seeInElement('td', 1)
             ->seeInElement('td', $data['username'])
             ->seeInElement('td', $data['email'])
@@ -116,7 +116,7 @@ class UserFormTest extends TestCase
 
         $user = UserModel::with('profile')->find($id);
 
-        $this->visit("admin/users/$id/edit")
+        $this->visit("admin/tests/users/$id/edit")
             ->seeElement("input[type=text][name=username][value='{$user->username}']")
             ->seeElement("input[type=email][name=email][value='{$user->email}']")
             ->seeElement("input[type=text][name=mobile][value='{$user->mobile}']")
@@ -142,12 +142,12 @@ class UserFormTest extends TestCase
 
         $id = mt_rand(1, 10);
 
-        $this->visit("admin/users/$id/edit")
+        $this->visit("admin/tests/users/$id/edit")
             ->type('hello world', 'username')
             ->type('123', 'password')
             ->type('123', 'password_confirmation')
             ->press('Submit')
-            ->seePageIs('admin/users')
+            ->seePageIs('admin/tests/users')
             ->seeInDatabase('test_users', ['username' => 'hello world']);
 
         $user = UserModel::with('profile')->find($id);
@@ -161,29 +161,29 @@ class UserFormTest extends TestCase
 
         $id = mt_rand(1, 10);
 
-        $this->visit("admin/users/$id/edit")
+        $this->visit("admin/tests/users/$id/edit")
             ->type('', 'email')
             ->press('Submit')
-            ->seePageIs("admin/users/$id/edit")
+            ->seePageIs("admin/tests/users/$id/edit")
             ->see('The email field is required');
 
         $this->type('xxaxx', 'email')
             ->press('Submit')
-            ->seePageIs("admin/users/$id/edit")
+            ->seePageIs("admin/tests/users/$id/edit")
             ->see('The email must be a valid email address.');
 
-        $this->visit("admin/users/$id/edit")
+        $this->visit("admin/tests/users/$id/edit")
             ->type('123', 'password')
             ->type('1234', 'password_confirmation')
             ->press('Submit')
-            ->seePageIs("admin/users/$id/edit")
+            ->seePageIs("admin/tests/users/$id/edit")
             ->see('The Password confirmation does not match.');
 
         $this->type('xx@xx.xx', 'email')
             ->type('123', 'password')
             ->type('123', 'password_confirmation')
             ->press('Submit')
-            ->seePageIs('admin/users')
+            ->seePageIs('admin/tests/users')
             ->seeInDatabase('test_users', ['email' => 'xx@xx.xx']);
     }
 
@@ -192,7 +192,7 @@ class UserFormTest extends TestCase
     {
         $this->seedsTable(1);
 
-        $this->visit('admin/users/1/edit')
+        $this->visit('admin/tests/users/1/edit')
             ->seeElement('input[type=checkbox][value=1]')
             ->seeElement('input[type=checkbox][value=3]');
     }

+ 22 - 22
tests/Feature/UserGridTest.php

@@ -12,7 +12,7 @@ class UserGridTest extends TestCase
 
     public function testIndexPage()
     {
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->see('All users')
             ->seeInElement('tr th', 'Username')
             ->seeInElement('tr th', 'Email')
@@ -29,7 +29,7 @@ class UserGridTest extends TestCase
             ->seeInElement('tr th', 'Created at')
             ->seeInElement('tr th', 'Updated at');
 
-        $action = url('/admin/users');
+        $action = url('/admin/tests/users');
 
         $this->seeElement("form[action='$action'][method=get]")
 //            ->seeElement("form[action='$action'][method=get] input[name=id]")
@@ -40,8 +40,8 @@ class UserGridTest extends TestCase
             ->seeElement("form[action='$action'][method=get] input[name='profile[end_at][start]']")
             ->seeElement("form[action='$action'][method=get] input[name='profile[end_at][end]']");
 
-        $this->seeInElement('a[href="http://localhost:8000/admin/users?_export_=all"]', 'All')
-            ->seeInElement('a[href="http://localhost:8000/admin/users/create"]', 'New');
+        $this->seeInElement('a[href="http://localhost:8000/admin/tests/users?_export_=all"]', 'All')
+            ->seeInElement('a[href="http://localhost:8000/admin/tests/users/create"]', 'New');
     }
 
     protected function seedsTable($count = 100)
@@ -58,7 +58,7 @@ class UserGridTest extends TestCase
     {
         $this->seedsTable();
 
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->see('All users');
 
         $this->assertCount(100, UserModel::all());
@@ -69,19 +69,19 @@ class UserGridTest extends TestCase
     {
         $this->seedsTable(65);
 
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->see('All users');
 
-        $this->visit('admin/users?page=2');
+        $this->visit('admin/tests/users?page=2');
         $this->assertCount(20, $this->crawler()->filter('td a i[class*=fa-ellipsis-v]'));
 
-        $this->visit('admin/users?page=3');
+        $this->visit('admin/tests/users?page=3');
         $this->assertCount(20, $this->crawler()->filter('td a i[class*=fa-ellipsis-v]'));
 
-        $this->visit('admin/users?page=4');
+        $this->visit('admin/tests/users?page=4');
         $this->assertCount(5, $this->crawler()->filter('td a i[class*=fa-ellipsis-v]'));
 
-        $this->click(1)->seePageIs('admin/users?page=1');
+        $this->click(1)->seePageIs('admin/tests/users?page=1');
         $this->assertCount(20, $this->crawler()->filter('td a i[class*=fa-ellipsis-v]'));
     }
 
@@ -89,7 +89,7 @@ class UserGridTest extends TestCase
     {
         $this->seedsTable(50);
 
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->see('All users');
 
         $this->assertCount(50, UserModel::all());
@@ -99,7 +99,7 @@ class UserGridTest extends TestCase
 
         $user = UserModel::find($id);
 
-        $this->visit('admin/users?id='.$id)
+        $this->visit('admin/tests/users?id='.$id)
             ->seeInElement('td', $user->username)
             ->seeInElement('td', $user->email)
             ->seeInElement('td', $user->mobile)
@@ -117,7 +117,7 @@ class UserGridTest extends TestCase
     {
         $this->seedsTable(50);
 
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->see('All users');
 
         $this->assertCount(50, UserModel::all());
@@ -125,7 +125,7 @@ class UserGridTest extends TestCase
 
         $users = UserModel::where('username', 'like', '%mi%')->get();
 
-        $this->visit('admin/users?username=mi');
+        $this->visit('admin/tests/users?username=mi');
 
         $this->assertEquals($this->crawler()->filter('td a i[class*=fa-ellipsis-v]')->count(), count($users->toArray()));
 
@@ -140,7 +140,7 @@ class UserGridTest extends TestCase
 
         $user = UserModel::with('profile')->find(mt_rand(1, 20));
 
-        $this->visit('admin/users?email='.$user->email)
+        $this->visit('admin/tests/users?email='.$user->email)
             ->seeInElement('td', $user->username)
             ->seeInElement('td', $user->email)
             ->seeInElement('td', $user->mobile)
@@ -160,7 +160,7 @@ class UserGridTest extends TestCase
 
         $user = UserModel::with('profile')->find(1);
 
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->seeInElement('th', 'Column1 not in table')
             ->seeInElement('th', 'Column2 not in table')
             ->seeInElement('td', "full name:{$user->profile->first_name} {$user->profile->last_name}")
@@ -176,7 +176,7 @@ class UserGridTest extends TestCase
                 $u->tags()->saveMany(factory(\Tests\Models\Tag::class, 5)->make());
             });
 
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->seeElement('td code');
 
         $this->assertCount(50, $this->crawler()->filter('td code'));
@@ -186,7 +186,7 @@ class UserGridTest extends TestCase
     {
         $this->seedsTable(15);
 
-        $this->visit('admin/users');
+        $this->visit('admin/tests/users');
 
         $this->assertCount(15, $this->crawler()->filter('td a i[class*=fa-ellipsis-v]'));
     }
@@ -195,7 +195,7 @@ class UserGridTest extends TestCase
     {
         $this->seedsTable(10);
 
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->seeInElement('td a[class*=btn]', 'detail');
 
         $this->assertCount(5, $this->crawler()->filter('td a[class*=btn]'));
@@ -205,7 +205,7 @@ class UserGridTest extends TestCase
     {
         $this->seedsTable(98);
 
-        $this->visit('admin/users')
+        $this->visit('admin/tests/users')
             ->seeElement('select[class*=per-page][name=per-page]')
             ->seeInElement('select option', 10)
             ->seeInElement('select option[selected]', 20)
@@ -213,11 +213,11 @@ class UserGridTest extends TestCase
             ->seeInElement('select option', 50)
             ->seeInElement('select option', 100);
 
-        $this->assertEquals('http://localhost:8000/admin/users?per_page=20', $this->crawler()->filter('select option[selected]')->attr('value'));
+        $this->assertEquals('http://localhost:8000/admin/tests/users?per_page=20', $this->crawler()->filter('select option[selected]')->attr('value'));
 
         $perPage = mt_rand(1, 98);
 
-        $this->visit('admin/users?per_page='.$perPage)
+        $this->visit('admin/tests/users?per_page='.$perPage)
             ->seeInElement('select option[selected]', $perPage)
             ->assertCount($perPage + 1, $this->crawler()->filter('tr'));
     }

+ 61 - 0
tests/Repositories/Report.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace Tests\Repositories;
+
+use Dcat\Admin\Repositories\Repository;
+use Faker\Factory;
+use Illuminate\Pagination\LengthAwarePaginator;
+use Dcat\Admin\Grid;
+
+class Report extends Repository
+{
+    public function get(Grid\Model $model)
+    {
+        $items = $this->fetch();
+
+        $paginator = new LengthAwarePaginator(
+            $items,
+            1000,
+            $model->getPerPage(), // 传入每页显示行数
+            $model->getCurrentPage() // 传入当前页码
+        );
+
+        // 必须设置链接
+        $paginator->setPath(\url()->current());
+
+        return $paginator;
+    }
+
+    /**
+     * 这里生成假数据演示报表功能
+     *
+     * @return array
+     */
+    public function fetch()
+    {
+        $faker = Factory::create();
+
+        $data = [];
+
+        for ($i = 0; $i < 20; $i++) {
+            $data[] = [
+                'content' => $faker->text,
+                'cost' => $faker->randomFloat(),
+                'avgMonthCost' => $faker->randomFloat(),
+                'avgQuarterCost' => $faker->randomFloat(),
+                'avgYearCost' => $faker->randomFloat(),
+                'incrs' => $faker->numberBetween(1, 999999999),
+                'avgMonthVist' => $faker->numberBetween(1, 999999),
+                'avgQuarterVist' => $faker->numberBetween(1, 999999),
+                'avgYearVist' => $faker->numberBetween(1, 999999),
+                'avgVists' => $faker->numberBetween(1, 999999),
+                'topCost' => $faker->numberBetween(1, 999999999),
+                'topVist' => $faker->numberBetween(1, 9999990009),
+                'topIncr' => $faker->numberBetween(1, 99999999),
+                'date' => $faker->date(),
+            ];
+        }
+
+        return $data;
+    }
+}

+ 2 - 0
tests/TestCase.php

@@ -57,6 +57,8 @@ class TestCase extends BaseTestCase
 
         require __DIR__.'/seeds/factory.php';
 
+        view()->addNamespace('admin-tests', __DIR__.'/views');
+
         if ($this->login) {
             $this->be($this->user = Administrator::first(), 'admin');
         }

+ 15 - 0
tests/lang/en/global.php

@@ -0,0 +1,15 @@
+<?php
+
+return [
+    'fields' => [
+        'id' => 'ID',
+
+        'profile' => [
+            'address' => '地址'
+        ],
+
+    ],
+    'labels' => [
+        'List' => '列表',
+    ],
+];

+ 16 - 0
tests/lang/en/user.php

@@ -0,0 +1,16 @@
+<?php
+
+return [
+    'fields' => [
+        'username' => '用户名',
+        'email' => '邮箱',
+
+        'profile' => [
+            'postcode' => '邮政编码'
+        ],
+
+    ],
+    'labels' => [
+        'user' => '用户',
+    ],
+];

+ 2 - 4
tests/routes.php

@@ -5,8 +5,6 @@ Route::group([
     'namespace'  => 'Tests\Controllers',
     'middleware' => ['web', 'admin'],
 ], function ($router) {
-    $router->resource('images', ImageController::class);
-    $router->resource('multiple-images', MultipleImageController::class);
-    $router->resource('files', FileController::class);
-    $router->resource('users', UserController::class);
+    $router->resource('tests/users', UserController::class);
+    $router->resource('tests/report', ReportController::class);
 });

+ 1 - 0
tests/views/test.blade.php

@@ -0,0 +1 @@
+<h1>Hello world</h1>