Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace Modules\Exercise02\Tests\Unit\Http\Controllers;

use Tests\TestCase;
use Modules\Exercise02\Http\Controllers\Exercise02Controller;
use Mockery as m;
use Modules\Exercise02\Services\ATMService;
use Illuminate\View\View;
use Modules\Exercise02\Http\Requests\ATMRequest;
use Illuminate\Http\RedirectResponse;

class Exercise02ControllerTest extends TestCase
{
protected $atmService;
protected $exercise02Controller;

public function setUp(): void
{
parent::setUp();
$this->atmService = m::mock(ATMService::class);

$this->exercise02Controller = new Exercise02Controller($this->atmService);
}

public function test_index()
{
$result = $this->exercise02Controller->index();
$this->assertInstanceOf(View::class, $result);
}

public function test_take_atm_fee()
{
$atmRequest = m::mock(ATMRequest::class);

$atmRequest->shouldReceive('validated')->andreturn([
'card_id' => 10,
]);
$this->atmService->shouldReceive('calculate')->andreturn(0);

$result = $this->exercise02Controller->takeATMFee($atmRequest);
$this->assertInstanceOf(RedirectResponse::class, $result);
}
}
35 changes: 35 additions & 0 deletions Modules/Exercise02/Tests/Unit/Http/Requests/ATMRequestTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Modules\Exercise02\Tests\Unit\Http\Requests;

use Illuminate\Support\Facades\Validator;
use Tests\TestCase;
use Modules\Exercise02\Http\Requests\ATMRequest;

class ATMRequestTest extends TestCase
{
protected $atmRequest;

public function setUp(): void
{
parent::setUp();
$this->atmRequest = new ATMRequest();
}

public function test_rules()
{
$rules = [
'card_id' => 'required|exists:atms,card_id',
];

$this->assertEquals($rules, $this->atmRequest->rules());
}

public function test_validate_fails()
{
$validator = Validator::make([], $this->atmRequest->rules());

$this->assertTrue($validator->fails());
}

}
31 changes: 31 additions & 0 deletions Modules/Exercise02/Tests/Unit/Models/ATMTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace Modules\Exercise02\Tests\Unit\Models;

use Tests\ModelTestCase as TestCase;
use Modules\Exercise02\Database\Factories\ATMFactory;
use Modules\Exercise02\Models\ATM;
use Mockery as m;

class ATMTest extends TestCase
{
public function test_model_configuration()
{
$this->runConfigurationAssertions(new ATM(), [
'fillable' => [
'card_id',
'is_vip'
],
'casts' => [
'is_vip' => 'boolean',
'id' => 'int'
],
]);
}

public function test_new_factory()
{
$model = m::Mock(ATM::class);
$this->assertInstanceOf(ATMFactory::class, $model->newFactory());
}
}
30 changes: 30 additions & 0 deletions Modules/Exercise02/Tests/Unit/Repositories/ATMRepositoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Modules\Exercise02\Tests\Unit\Http\Requests;

use Tests\TestCase;
use Modules\Exercise02\Repositories\ATMRepository;
use Mockery as m;
use Modules\Exercise02\Models\ATM;

class ATMRepositoryTest extends TestCase
{
protected $atmRepository;
protected $atmmodel;

public function setUp(): void
{
parent::setUp();

$this->atmmodel = m::mock(ATM::class)->makePartial();
$this->atmRepository = new ATMRepository($this->atmmodel);
}

public function test_find()
{
$this->atmmodel->shouldReceive('where->first')->andreturn([]);

$result = $this->atmRepository->find(1);
$this->assertEquals([], $result);
}
}
154 changes: 154 additions & 0 deletions Modules/Exercise02/Tests/Unit/Services/ATMServiceTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?php

namespace Modules\Exercise02\Tests\Unit\Services;

use Tests\TestCase;
use Modules\Exercise02\Services\ATMService;
use Modules\Exercise02\Repositories\ATMRepository;
use Mockery as m;
use Modules\Exercise02\Models\ATM;
use InvalidArgumentException;
use Carbon\Carbon;

class ATMRepositoryTest extends TestCase
{
protected $atmService;
protected $atmRepository;

public function setUp(): void
{
parent::setUp();

$this->atmRepository = m::mock(ATMRepository::class);
$this->atmService = new ATMService($this->atmRepository);
}

public function test_without_card()
{
$this->atmRepository->shouldReceive('find')->andreturn([]);
$this->expectExceptionMessage('Card ID is invalid!');
$this->expectException(InvalidArgumentException::class);

$this->atmService->calculate(1);
}

public function test_is_vip_customer()
{
$atm = m::mock(ATM::class)->makePartial();
$atm->is_vip = true;
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(0, $result);
}

public function test_is_holiday()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-01-01'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(110, $result);
}

public function test_is_saturday()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-04-17'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(110, $result);
}

public function test_is_sunday()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-04-18'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(110, $result);
}

public function test_is_holiday_and_is_saturday()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-04-30'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(110, $result);
}

public function test_is_holiday_and_is_sunday()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2017-05-1'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(110, $result);
}

public function test_normal_day_at_8h44 ()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-03-25 08:44:00'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(110, $result);
}

public function test_normal_day_at_8h45 ()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-03-25 08:45:00'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(0, $result);
}

public function test_normal_day_at_8h46 ()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-03-25 08:46:00'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(0, $result);
}

public function test_normal_day_at_17h58 ()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-03-25 17:58:00'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(0, $result);
}

public function test_normal_day_at_17h59 ()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-03-25 17:59:00'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(0, $result);
}

public function test_normal_day_at_18h00 ()
{
$atm = m::mock(ATM::class)->makePartial();
Carbon::setTestNow(Carbon::parse('2021-03-25 18:00:00'));
$this->atmRepository->shouldReceive('find')->andreturn($atm);

$result = $this->atmService->calculate(1);
$this->assertEquals(110, $result);
}
}
2 changes: 1 addition & 1 deletion Modules/Exercise03/Services/ProductService.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public function calculateDiscount($totalProducts)
$others = $totalProducts[Product::OTHER_TYPE] ?? 0;
$discount = 0;

if ($cravat < 0 || $whiteShirt < 0 || $others < 0) {
if ($cravat <= 0 && $whiteShirt <= 0 && $others <= 0) {
throw new InvalidArgumentException();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

namespace Modules\Exercise03\Tests\Unit\Http\Controllers;

use Tests\TestCase;
use Modules\Exercise03\Http\Controllers\ProductController;
use Mockery as m;
use Modules\Exercise03\Services\ProductService;
use Modules\Exercise03\Http\Requests\CheckoutRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\View\View;

class ProductControllerTest extends TestCase
{
protected $productService;
protected $productController;

public function setUp(): void
{
parent::setUp();

$this->productService = m::mock(ProductService::class);
$this->productController = new ProductController($this->productService);
}

public function test_index()
{
$this->productService->shouldReceive('getAllProducts')->andreturn([]);

$result = $this->productController->index();
$this->assertInstanceOf(View::class, $result);
$this->assertEquals('exercise03::index', $result->getName());
}

public function test_checkout()
{
$request = new CheckoutRequest();
$request->total_products = 10;

$this->productService->shouldReceive('calculateDiscount')->andreturn([]);

$result = $this->productController->checkout($request);
$this->assertInstanceOf(JsonResponse::class, $result);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace Modules\Exercise03\Tests\Unit\Http\Requests;

use Illuminate\Support\Facades\Validator;
use Tests\TestCase;
use Modules\Exercise03\Http\Requests\CheckoutRequest;

class CheckoutRequestTest extends TestCase
{
protected $checkoutRequest;

public function setUp(): void
{
parent::setUp();
$this->checkoutRequest = new CheckoutRequest();
}

public function test_rules()
{
$rules = [
'total_products' => 'required|array',
'total_products.*' => 'nullable|integer|min:0',
];

$this->assertEquals($rules, $this->checkoutRequest->rules());
}
}
Loading