Skip to content

Commit 8bdd206

Browse files
committed
Add 1st working test >.<
1 parent b71189a commit 8bdd206

File tree

9 files changed

+268
-17
lines changed

9 files changed

+268
-17
lines changed

src/Services/DataTable.php

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,16 @@ abstract class DataTable implements DataTableButtons
7777
/**
7878
* Html builder.
7979
*
80-
* @var \Yajra\DataTables\Html\Builder|null
80+
* @var \Yajra\DataTables\Html\Builder
8181
*/
82-
protected ?Builder $htmlBuilder;
82+
protected Builder $htmlBuilder;
8383

8484
/**
8585
* Html builder extension callback.
8686
*
8787
* @var callable|null
8888
*/
89-
protected $htmlCallback = null;
89+
protected $htmlCallback;
9090

9191
/**
9292
* Export filename.
@@ -107,14 +107,14 @@ abstract class DataTable implements DataTableButtons
107107
*
108108
* @var callable|null
109109
*/
110-
protected $beforeCallback = null;
110+
protected $beforeCallback;
111111

112112
/**
113113
* Callback after processing the response.
114114
*
115115
* @var callable|null
116116
*/
117-
protected $responseCallback = null;
117+
protected $responseCallback;
118118

119119
/**
120120
* Available button actions. When calling an action, the value will be used
@@ -126,9 +126,9 @@ abstract class DataTable implements DataTableButtons
126126
protected array $actions = ['print', 'csv', 'excel', 'pdf'];
127127

128128
/**
129-
* @var \Yajra\DataTables\Utilities\Request|null
129+
* @var \Yajra\DataTables\Utilities\Request
130130
*/
131-
protected ?Request $request;
131+
protected Request $request;
132132

133133
/**
134134
* Flag to use fast-excel package for export.
@@ -175,6 +175,18 @@ abstract class DataTable implements DataTableButtons
175175
*/
176176
protected string $pdfWriter = 'Dompdf';
177177

178+
public function __construct()
179+
{
180+
/** @var Request $request */
181+
$request = app('datatables.request');
182+
183+
/** @var Builder $builder */
184+
$builder = app('datatables.html');
185+
186+
$this->request = $request;
187+
$this->htmlBuilder = $builder;
188+
}
189+
178190
/**
179191
* Process dataTables needed render output.
180192
*
@@ -212,7 +224,7 @@ public function render(string $view, array $data = [], array $mergeData = [])
212224
*/
213225
public function request(): Request
214226
{
215-
return $this->request ?: $this->request = app('datatables.request');
227+
return $this->request;
216228
}
217229

218230
/**
@@ -307,7 +319,7 @@ protected function getExportColumnsFromBuilder(): Collection
307319
*
308320
* @return \Illuminate\Support\Collection
309321
*/
310-
protected function getColumnsFromBuilder()
322+
protected function getColumnsFromBuilder(): Collection
311323
{
312324
return $this->html()->getColumns();
313325
}
@@ -329,15 +341,11 @@ public function html()
329341
*/
330342
public function builder(): Builder
331343
{
332-
if ($this->htmlBuilder) {
333-
return $this->htmlBuilder;
334-
}
335-
336344
if (method_exists($this, 'htmlBuilder')) {
337345
return $this->htmlBuilder = $this->htmlBuilder();
338346
}
339347

340-
return $this->htmlBuilder = app('datatables.html');
348+
return $this->htmlBuilder;
341349
}
342350

343351
/**

tests/DataTableServiceTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace Yajra\DataTables\Buttons\Tests;
4+
5+
use Illuminate\Foundation\Testing\DatabaseTransactions;
6+
use Yajra\DataTables\Buttons\Tests\DataTables\UsersDataTable;
7+
8+
class DataTableServiceTest extends TestCase
9+
{
10+
use DatabaseTransactions;
11+
12+
/** @test */
13+
public function it_can_handle_ajax_request()
14+
{
15+
$response = $this->getAjax('/users');
16+
17+
$response->assertJson([
18+
'draw' => 0,
19+
'recordsTotal' => 20,
20+
'recordsFiltered' => 20,
21+
]);
22+
}
23+
24+
protected function setUp(): void
25+
{
26+
parent::setUp();
27+
28+
$this->app['router']->get('/users', function (UsersDataTable $dataTable) {
29+
return $dataTable->render('tests::users');
30+
});
31+
}
32+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace Yajra\DataTables\Buttons\Tests\DataTables;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Yajra\DataTables\Buttons\Tests\Models\User;
7+
use Yajra\DataTables\EloquentDataTable;
8+
use Yajra\DataTables\Html\Column;
9+
use Yajra\DataTables\Services\DataTable;
10+
11+
class UsersDataTable extends DataTable
12+
{
13+
/**
14+
* @throws \Yajra\DataTables\Exceptions\Exception
15+
*/
16+
public function dataTable(Builder $query): EloquentDataTable
17+
{
18+
return datatables()->eloquent($query)->setRowId('id');
19+
}
20+
21+
public function query(User $user): Builder
22+
{
23+
return $user->newQuery()->select('*');
24+
}
25+
26+
public function html()
27+
{
28+
return $this->builder()
29+
->setTableId('users-table')
30+
->minifiedAjax()
31+
->columns([
32+
Column::make('id'),
33+
Column::make('name'),
34+
]);
35+
}
36+
37+
protected function filename(): string
38+
{
39+
return 'Users';
40+
}
41+
}

tests/Models/Post.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Yajra\DataTables\Buttons\Tests\Models;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
7+
use Illuminate\Database\Eloquent\SoftDeletes;
8+
9+
class Post extends Model
10+
{
11+
use SoftDeletes;
12+
13+
protected $guarded = [];
14+
15+
protected $dates = ['deleted_at'];
16+
17+
public function user(): BelongsTo
18+
{
19+
return $this->belongsTo(User::class);
20+
}
21+
}

tests/Models/Role.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Yajra\DataTables\Buttons\Tests\Models;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
7+
8+
class Role extends Model
9+
{
10+
protected $guarded = [];
11+
12+
public function users(): BelongsToMany
13+
{
14+
return $this->belongsToMany(User::class);
15+
}
16+
}

tests/Models/User.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Yajra\DataTables\Buttons\Tests\Models;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
7+
use Illuminate\Database\Eloquent\Relations\HasMany;
8+
use Illuminate\Database\Eloquent\Relations\MorphTo;
9+
10+
class User extends Model
11+
{
12+
protected $guarded = [];
13+
14+
public function posts(): HasMany
15+
{
16+
return $this->hasMany(Post::class);
17+
}
18+
19+
public function roles(): BelongsToMany
20+
{
21+
return $this->belongsToMany(Role::class);
22+
}
23+
24+
public function user(): MorphTo
25+
{
26+
return $this->morphTo();
27+
}
28+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Yajra\DataTables\Buttons\Tests\Providers;
4+
5+
use Illuminate\Support\ServiceProvider;
6+
7+
class TestServiceProvider extends ServiceProvider
8+
{
9+
public function boot()
10+
{
11+
$this->loadViewsFrom(__DIR__.'/../views', 'tests');
12+
}
13+
}

tests/TestCase.php

Lines changed: 95 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,91 @@
22

33
namespace Yajra\DataTables\Buttons\Tests;
44

5+
use Illuminate\Database\Schema\Blueprint;
6+
use Illuminate\Testing\TestResponse;
57
use Orchestra\Testbench\TestCase as BaseTestCase;
8+
use Yajra\DataTables\Buttons\Tests\Models\Role;
9+
use Yajra\DataTables\Buttons\Tests\Models\User;
10+
use Yajra\DataTables\Buttons\Tests\Providers\TestServiceProvider;
11+
use Yajra\DataTables\ButtonsServiceProvider;
12+
use Yajra\DataTables\DataTablesServiceProvider;
13+
use Yajra\DataTables\HtmlServiceProvider;
614

715
abstract class TestCase extends BaseTestCase
816
{
17+
protected function setUp(): void
18+
{
19+
parent::setUp();
20+
21+
$this->migrateDatabase();
22+
$this->seedDatabase();
23+
}
24+
25+
protected function migrateDatabase()
26+
{
27+
/** @var \Illuminate\Database\Schema\Builder $schemaBuilder */
28+
$schemaBuilder = $this->app['db']->connection()->getSchemaBuilder();
29+
if (! $schemaBuilder->hasTable('users')) {
30+
$schemaBuilder->create('users', function (Blueprint $table) {
31+
$table->increments('id');
32+
$table->string('name');
33+
$table->string('email');
34+
$table->string('user_type')->nullable();
35+
$table->unsignedInteger('user_id')->nullable();
36+
$table->timestamps();
37+
});
38+
}
39+
if (! $schemaBuilder->hasTable('posts')) {
40+
$schemaBuilder->create('posts', function (Blueprint $table) {
41+
$table->increments('id');
42+
$table->string('title');
43+
$table->unsignedInteger('user_id');
44+
$table->timestamps();
45+
$table->softDeletes();
46+
});
47+
}
48+
if (! $schemaBuilder->hasTable('roles')) {
49+
$schemaBuilder->create('roles', function (Blueprint $table) {
50+
$table->increments('id');
51+
$table->string('role');
52+
$table->timestamps();
53+
});
54+
}
55+
if (! $schemaBuilder->hasTable('role_user')) {
56+
$schemaBuilder->create('role_user', function (Blueprint $table) {
57+
$table->unsignedInteger('role_id');
58+
$table->unsignedInteger('user_id');
59+
$table->timestamps();
60+
});
61+
}
62+
}
63+
64+
protected function seedDatabase()
65+
{
66+
$adminRole = Role::create(['role' => 'Administrator']);
67+
$userRole = Role::create(['role' => 'User']);
68+
69+
collect(range(1, 20))->each(function ($i) use ($userRole) {
70+
/** @var User $user */
71+
$user = User::query()->create([
72+
'name' => 'Record-'.$i,
73+
'email' => 'Email-'.$i.'@example.com',
74+
]);
75+
76+
collect(range(1, 3))->each(function ($i) use ($user) {
77+
$user->posts()->create([
78+
'title' => "User-{$user->id} Post-{$i}",
79+
]);
80+
});
81+
82+
if ($i % 2) {
83+
$user->roles()->attach(Role::all());
84+
} else {
85+
$user->roles()->attach($userRole);
86+
}
87+
});
88+
}
89+
990
/**
1091
* Set up the environment.
1192
*
@@ -25,9 +106,20 @@ protected function getEnvironmentSetUp($app)
25106
protected function getPackageProviders($app): array
26107
{
27108
return [
28-
\Yajra\DataTables\DataTablesServiceProvider::class,
29-
\Yajra\DataTables\ButtonsServiceProvider::class,
30-
\Yajra\DataTables\HtmlServiceProvider::class,
109+
TestServiceProvider::class,
110+
DataTablesServiceProvider::class,
111+
ButtonsServiceProvider::class,
112+
HtmlServiceProvider::class,
31113
];
32114
}
115+
116+
public function getAjax($uri, array $headers = []): TestResponse
117+
{
118+
return $this->getJson($uri, array_merge(['X-Requested-With' => 'XMLHttpRequest'], $headers));
119+
}
120+
121+
public function postAjax($uri, array $headers = []): TestResponse
122+
{
123+
return $this->postJson($uri, array_merge(['X-Requested-With' => 'XMLHttpRequest'], $headers));
124+
}
33125
}

tests/views/users.blade.php

Whitespace-only changes.

0 commit comments

Comments
 (0)