dbudwin/RoboHome-Web

View on GitHub
tests/Unit/Repositories/DeviceRepositoryTest.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
 
namespace Tests\Unit\Repositories;
 
use App\Device;
use App\Repositories\IDeviceRepository;
use App\Repositories\IRFDeviceRepository;
use App\RFDevice;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Mockery;
use Webpatser\Uuid\Uuid;
 
The class DeviceRepositoryTest has 12 public methods. Consider refactoring DeviceRepositoryTest to keep number of public methods under 10.
class DeviceRepositoryTest extends RepositoryTestCaseWithRealDatabase
{
private $deviceRepository;
 
public function setUp(): void
{
parent::setUp();
 
$this->deviceRepository = $this->app->make(IDeviceRepository::class);
}
 
public function testCreate_GivenUserExists_ReturnsCreatedDevice(): void
{
$user = $this->createUser();
$properties = $this->createDeviceProperties();
 
$this->assertEquals(0, Device::count());
$this->assertEquals(0, RFDevice::count());
 
$this->deviceRepository->create($properties, $user->id);
 
$this->assertEquals(1, Device::count());
$this->assertEquals(1, RFDevice::count());
}
 
public function testGet_GivenDeviceDoesNotExist_ThrowsModelNotFoundException(): void
{
$nonexistentDeviceId = self::$faker->randomNumber();
 
$this->expectException(ModelNotFoundException::class);
 
$this->deviceRepository->get($nonexistentDeviceId);
}
 
public function testGet_GivenDeviceExists_ReturnsDevice(): void
{
$device = $this->createDevice();
 
$retrievedDevice = $this->deviceRepository->get($device->id);
 
$this->assertTrue($retrievedDevice->is($device));
}
 
public function testGetForPublicId_GivenDeviceDoesNotExist_ThrowsModelNotFoundException(): void
{
$nonexistentPublicDeviceId = Uuid::import(self::$faker->uuid());
 
$this->expectException(ModelNotFoundException::class);
 
$this->deviceRepository->getForPublicId($nonexistentPublicDeviceId);
}
 
public function testGetForPublicId_GivenDeviceExists_ReturnsDevice(): void
{
$device = $this->createDevice();
$publicDeviceId = Uuid::import($device->public_id);
 
$retrievedDevice = $this->deviceRepository->getForPublicId($publicDeviceId);
 
$this->assertTrue($retrievedDevice->is($device));
}
 
public function testUpdate_GivenDeviceDoesNotExist_ThrowsModelNotFoundException(): void
{
$nonexistentDeviceId = self::$faker->randomNumber();
$properties = $this->createDeviceProperties();
 
$this->expectException(ModelNotFoundException::class);
 
$this->deviceRepository->update($nonexistentDeviceId, $properties);
}
 
public function testUpdate_GivenDeviceExists_DevicePropertiesUpdated(): void
{
$originalDevice = $this->createDevice();
$newProperties = $this->createDeviceProperties();
 
$updatedDevice = $this->deviceRepository->update($originalDevice->user_id, $newProperties);
 
$this->assertNotEqualOrEmpty($originalDevice->name, $updatedDevice->name);
$this->assertNotEqualOrEmpty($originalDevice->description, $updatedDevice->description);
}
 
public function testUpdate_GivenDeviceExists_CallsUpdateForSpecificDevice(): void
{
$mockRfDeviceRepository = Mockery::mock(IRFDeviceRepository::class)->makePartial();
$mockRfDeviceRepository->shouldReceive('update')->once();
 
$this->app->instance(IRFDeviceRepository::class, $mockRfDeviceRepository);
 
$this->deviceRepository = $this->app->make(IDeviceRepository::class);
 
$originalDevice = $this->createDevice();
$newProperties = $this->createDeviceProperties();
 
$this->deviceRepository->update($originalDevice->id, $newProperties);
}
 
public function testDelete_GivenDeviceDoesNotExist_ReturnsFalse(): void
{
$nonexistentDeviceId = self::$faker->randomNumber();
 
$deleted = $this->deviceRepository->delete($nonexistentDeviceId);
 
$this->assertFalse($deleted);
}
 
public function testDelete_GivenDeviceExists_ReturnsTrue(): void
{
$device = $this->createDevice();
 
$deleted = $this->deviceRepository->delete($device->id);
 
$this->assertTrue($deleted);
}
 
public function testName_GivenDeviceDoesNotExist_ThrowsModelNotFoundException(): void
{
$nonexistentDeviceId = self::$faker->randomNumber();
 
$this->expectException(ModelNotFoundException::class);
 
$this->deviceRepository->name($nonexistentDeviceId);
}
 
public function testName_GivenDeviceExists_ReturnsName(): void
{
$device = $this->createDevice();
 
$name = $this->deviceRepository->name($device->id);
 
$this->assertEquals($device->name, $name);
}
 
private function createDevice(): Device
{
$device = factory(Device::class)->create([
'user_id' => $this->createUser()->id
]);
 
factory(RFDevice::class)->create([
'device_id' => $device->id
]);
 
return $device;
}
}