Skip to content

Commit

Permalink
Additional tests (#35)
Browse files Browse the repository at this point in the history
* Additional tests

* fixes

* Additional tests

Co-authored-by: Tomasz Smolarek <tomasz.smolarek@escolasoft.com>
  • Loading branch information
dyfero and dyfero authored Mar 23, 2022
1 parent 9ab42b7 commit cfdb085
Show file tree
Hide file tree
Showing 15 changed files with 495 additions and 46 deletions.
2 changes: 0 additions & 2 deletions src/Enums/StatusEnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

namespace EscolaLms\Core\Enums;

use EscolaLms\Core\Enums\BasicEnum;

class StatusEnum extends BasicEnum
{
const INACTIVE = 0;
Expand Down
28 changes: 0 additions & 28 deletions src/Repositories/Criteria/CourseSearch.php

This file was deleted.

15 changes: 0 additions & 15 deletions src/Repositories/Criteria/NotRelatedCourses.php

This file was deleted.

150 changes: 150 additions & 0 deletions tests/Api/CriteriaApiTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
<?php

namespace EscolaLms\Core\Tests\Api;

use Carbon\Carbon;
use EscolaLms\Core\Enums\StatusEnum;
use EscolaLms\Core\Tests\Mocks\ExampleEntity\ExampleEntity;
use EscolaLms\Core\Tests\Mocks\ExampleEntity\TestCase;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\WithFaker;

class CriteriaApiTest extends TestCase
{
use DatabaseTransactions, WithFaker;

public function testPagination()
{
ExampleEntity::factory()
->count(10)
->create();

$response = $this->json('GET', 'api/core?limit=5');
$response->assertJsonCount(5, 'data');
}

public function testDateCriterion()
{
$date = Carbon::now()->addDays(5);

ExampleEntity::factory()
->count(5)
->create(['created_at' => $date]);

ExampleEntity::factory()
->count(5)
->create();

$response = $this->json('GET', 'api/core?gt_created_at=' . $date);

$response->assertJsonCount(5, 'data');
}

public function testLikeCriterion()
{
ExampleEntity::factory()
->count(5)
->create(['name' => 'simple name']);

ExampleEntity::factory()
->count(5)
->create(['name' => $this->faker->word]);

$response = $this->json('GET', 'api/core?name=simple');
$response->assertJsonCount(5, 'data');
}

public function testInCriterion()
{
$ids = ExampleEntity::factory()
->count(5)
->create()
->pluck('id')
->map(fn ($item) => 'ids[]=' . $item . '&');

ExampleEntity::factory()
->count(5)
->create();

$response = $this->json('GET', 'api/core?' . $ids->implode(''));
$response->assertJsonCount(5, 'data');
}

public function testIsNullCriterion()
{
ExampleEntity::factory()
->count(5)
->create();

ExampleEntity::factory()
->count(5)
->create(['description' => null]);

$response = $this->json('GET', 'api/core?nullable=1');
$response->assertJsonCount(5, 'data');
}

public function testEqualsCriterion()
{
ExampleEntity::factory()
->count(5)
->create(['status' => StatusEnum::INACTIVE]);

ExampleEntity::factory()
->count(5)
->create(['status' => StatusEnum::ACTIVE]);

$response = $this->json('GET', 'api/core?status=' . StatusEnum::ACTIVE);
$response->assertJsonCount(5, 'data');
}

public function testPeriodCriterion()
{
$dateFrom = Carbon::now();
$dateTo = Carbon::now()->addDays(5);

ExampleEntity::factory()
->count(5)
->create(['date_time' => Carbon::now()->subYear()]);

ExampleEntity::factory()
->count(5)
->create(['date_time' => $dateFrom]);

ExampleEntity::factory()
->count(5)
->create(['date_time' => $dateTo]);

ExampleEntity::factory()
->count(5)
->create(['date_time' => Carbon::now()->addYear()]);

$response = $this->json('GET', 'api/core?from=' . $dateFrom . '&to=' . $dateTo);
$response->assertJsonCount(10, 'data');
}

public function testPeriodDto()
{
$dateFrom = Carbon::now();
$dateTo = Carbon::now()->addDays(5);

ExampleEntity::factory()
->count(5)
->create(['date_time' => Carbon::now()->subYear()]);

ExampleEntity::factory()
->count(5)
->create(['date_time' => $dateFrom]);

ExampleEntity::factory()
->count(5)
->create(['date_time' => $dateTo]);

ExampleEntity::factory()
->count(5)
->create(['date_time' => Carbon::now()->addYear()]);

$response = $this->json('GET', 'api/core/period?from=' . $dateFrom . '&to=' . $dateTo);
$response->assertJsonCount(10);
}
}
73 changes: 72 additions & 1 deletion tests/Features/BaseRepositoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,28 @@
namespace EscolaLms\Core\Tests\Features;

use EscolaLms\Core\Dtos\PaginationDto;
use EscolaLms\Core\Enums\UserRole;
use EscolaLms\Core\Models\User;
use EscolaLms\Core\Repositories\Criteria\Primitives\DoesntHasCriterion;
use EscolaLms\Core\Repositories\Criteria\Primitives\EqualCriterion;
use EscolaLms\Core\Repositories\Criteria\Primitives\HasCriterion;
use EscolaLms\Core\Repositories\Criteria\Primitives\ModelCriterion;
use EscolaLms\Core\Repositories\Criteria\UserCriterion;
use EscolaLms\Core\Repositories\Criteria\UserSearchCriterion;
use EscolaLms\Core\Tests\Mocks\BaseRepository;
use EscolaLms\Core\Tests\Mocks\CompareDto;
use EscolaLms\Core\Tests\Mocks\UpdateDto;
use EscolaLms\Core\Tests\TestCase;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;

class BaseRepositoryTest extends TestCase
{
use DatabaseTransactions;
use DatabaseTransactions, WithFaker;

protected BaseRepository $repository;
protected User $user;
Expand All @@ -28,8 +35,11 @@ protected function setUp(): void
parent::setUp();
$this->repository = app(BaseRepository::class);
$this->user = User::factory()->create([
'first_name' => $this->faker->firstName . $this->faker->numberBetween(),
'last_name' => $this->faker->lastName . $this->faker->numberBetween(),
'country' => 'Old Country'
]);
$this->user->assignRole(UserRole::ADMIN);
$users = User::factory()->count(8)->create();
$this->last_user = User::factory()->create();
}
Expand Down Expand Up @@ -165,6 +175,67 @@ public function testSearchByCriteria()
$this->assertEquals($this->user->email, $collection->first()->email);
}

public function testSearchByUserCriteria()
{
$criteria = [
new UserCriterion('id', $this->user)
];
$result = $this->repository->searchByCriteria($criteria);
$this->assertCount(1, $result);
$this->assertEquals($this->user->getKey(), $result->first()->getKey());

$criteria = [
new UserSearchCriterion($this->user->first_name)
];
$result = $this->repository->searchByCriteria($criteria);
$this->assertCount(1, $result);
$this->assertEquals($this->user->first_name, $result->first()->first_name);

$criteria = [
new UserSearchCriterion($this->user->last_name)
];
$result = $this->repository->searchByCriteria($criteria);
$this->assertCount(1, $result);
$this->assertEquals($this->user->last_name, $result->first()->last_name);

$criteria = [
new UserSearchCriterion($this->user->email)
];
$result = $this->repository->searchByCriteria($criteria);
$this->assertCount(1, $result);
$this->assertEquals($this->user->email, $result->first()->email);

$criteria = [
new ModelCriterion('id', $this->user)
];
$result = $this->repository->searchByCriteria($criteria);
$this->assertCount(1, $result);
$this->assertEquals($this->user->getKey(), $result->first()->getKey());
}

public function testSearchByRoles()
{
$criteria = [
new HasCriterion('roles', fn ($query) => $query->where('name', UserRole::ADMIN))
];
$result = $this->repository->searchByCriteria($criteria);
$this->assertCount(1, $result);
$this->assertEquals($this->user->getKey(), $result->first()->getKey());

$criteria = [
new HasCriterion('roles', fn ($query) => $query->where('name', UserRole::STUDENT))
];
$result = $this->repository->searchByCriteria($criteria);
$this->assertCount(0, $result);

$this->last_user->assignRole(UserRole::STUDENT);
$criteria = [
new DoesntHasCriterion('roles', fn ($query) => $query->where('name', UserRole::STUDENT))
];
$result = $this->repository->searchByCriteria($criteria);
$this->assertCount(9, $result);
}

public function testQueryWithAppliedCriteria()
{

Expand Down
20 changes: 20 additions & 0 deletions tests/Mocks/ExampleEntity/ExampleEntity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace EscolaLms\Core\Tests\Mocks\ExampleEntity;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ExampleEntity extends Model
{
use HasFactory;

protected $table = 'example_entities';

protected $guarded = ['id'];

protected static function newFactory(): ExampleEntityFactory
{
return ExampleEntityFactory::new();
}
}
39 changes: 39 additions & 0 deletions tests/Mocks/ExampleEntity/ExampleEntityController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
namespace EscolaLms\Core\Tests\Mocks\ExampleEntity;

use EscolaLms\Core\Dtos\OrderDto;
use EscolaLms\Core\Dtos\PaginationDto;
use EscolaLms\Core\Dtos\PeriodDto;
use EscolaLms\Core\Http\Controllers\EscolaLmsBaseController;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;

class ExampleEntityController extends EscolaLmsBaseController
{
private ExampleEntityService $service;

public function __construct(ExampleEntityService $service)
{
$this->service = $service;
}

public function index(Request $request): JsonResponse
{
$orderDto = OrderDto::instantiateFromRequest($request);
$paginationDto = PaginationDto::instantiateFromRequest($request);
$searchDto = ExampleEntitySearchDto::instantiateFromRequest($request);

$results = $this->service->getExampleEntities($searchDto, $paginationDto, $orderDto);

return new JsonResponse($results);
}

public function period(Request $request): JsonResponse
{
$periodDto = PeriodDto::instantiateFromRequest($request);

$results = $this->service->getByPeriod($periodDto);

return new JsonResponse($results);
}
}
21 changes: 21 additions & 0 deletions tests/Mocks/ExampleEntity/ExampleEntityFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace EscolaLms\Core\Tests\Mocks\ExampleEntity;

use EscolaLms\Core\Enums\StatusEnum;
use Illuminate\Database\Eloquent\Factories\Factory;

class ExampleEntityFactory extends Factory
{
protected $model = ExampleEntity::class;

public function definition()
{
return [
'name' => $this->faker->word(),
'description' => $this->faker->words(3, true),
'status' => $this->faker->randomElement(StatusEnum::asArray()),
'date_time' => $this->faker->dateTimeBetween(),
];
}
}
Loading

0 comments on commit cfdb085

Please sign in to comment.