2FAuth/tests/Feature/Services/GroupServiceTest.php

487 lines
13 KiB
PHP
Raw Normal View History

2021-11-30 17:39:33 +01:00
<?php
namespace Tests\Feature\Services;
2022-11-22 15:15:52 +01:00
use App\Facades\Groups;
2021-12-02 13:15:53 +01:00
use App\Models\Group;
use App\Models\TwoFAccount;
use App\Models\User;
use App\Policies\GroupPolicy;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\Collection;
use Mockery\MockInterface;
2021-11-30 17:39:33 +01:00
use Tests\FeatureTestCase;
/**
* @covers \App\Services\GroupService
2022-12-09 10:52:17 +01:00
* @covers \App\Facades\Groups
2021-11-30 17:39:33 +01:00
*/
class GroupServiceTest extends FeatureTestCase
{
/**
* @var \App\Models\User|\Illuminate\Contracts\Auth\Authenticatable
*/
protected $user;
/**
* @var \App\Models\User|\Illuminate\Contracts\Auth\Authenticatable
*/
protected $otherUser;
2021-11-30 17:39:33 +01:00
/**
* App\Models\Group $groupOne, $groupTwo, $groupThree
2021-11-30 17:39:33 +01:00
*/
2022-11-22 15:15:52 +01:00
protected $groupOne;
2021-11-30 17:39:33 +01:00
2022-11-22 15:15:52 +01:00
protected $groupTwo;
2021-11-30 17:39:33 +01:00
protected $groupThree;
2021-11-30 17:39:33 +01:00
/**
* App\Models\Group $twofaccountOne, $twofaccountTwo, $twofaccountThree
2021-11-30 17:39:33 +01:00
*/
2022-11-22 15:15:52 +01:00
protected $twofaccountOne;
protected $twofaccountTwo;
2021-11-30 17:39:33 +01:00
protected $twofaccountThree;
2021-11-30 17:39:33 +01:00
private const NEW_GROUP_NAME = 'MyNewGroup';
2022-11-22 15:15:52 +01:00
/**
* @test
*/
public function setUp() : void
{
parent::setUp();
2022-11-22 15:15:52 +01:00
$this->user = User::factory()->create();
$this->otherUser = User::factory()->create();
2022-11-22 15:15:52 +01:00
$this->groupOne = Group::factory()->for($this->user)->create();
$this->groupTwo = Group::factory()->for($this->user)->create();
$this->groupThree = Group::factory()->for($this->otherUser)->create();
2022-11-22 15:15:52 +01:00
Group::factory()->count(2)->for($this->otherUser)->create();
2021-11-30 17:39:33 +01:00
$this->twofaccountOne = TwoFAccount::factory()->for($this->user)->create([
'group_id' => $this->groupOne->id,
]);
$this->twofaccountTwo = TwoFAccount::factory()->for($this->user)->create([
'group_id' => $this->groupTwo->id,
]);
2021-11-30 17:39:33 +01:00
$this->twofaccountThree = TwoFAccount::factory()->for($this->otherUser)->create([
'group_id' => $this->groupThree->id,
]);
TwoFAccount::factory()->for($this->otherUser)->create([
'group_id' => $this->groupThree->id,
]);
}
2021-11-30 17:39:33 +01:00
/**
* @test
*/
public function test_get_a_user_group_returns_a_group()
2021-11-30 17:39:33 +01:00
{
$group = Groups::for($this->user)->get($this->twofaccountOne->id);
$this->assertInstanceOf(Group::class, $group);
$this->assertEquals($this->twofaccountOne->id, $group->id);
}
/**
* @test
*/
public function test_get_multiple_user_group_returns_a_group_collection()
{
$groups = Groups::for($this->user)->get([$this->twofaccountOne->id, $this->twofaccountTwo->id]);
$this->assertInstanceOf(Collection::class, $groups);
$this->assertCount(2, $groups);
$this->assertEquals($this->twofaccountOne->id, $groups[0]->id);
$this->assertEquals($this->twofaccountTwo->id, $groups[1]->id);
}
/**
* @test
*/
public function test_get_a_missing_group_returns_not_found()
{
$this->expectException(\Exception::class);
$group = Groups::get(1000);
}
/**
* @test
*/
public function test_get_a_list_of_groups_with_a_missing_group_returns_not_found()
{
$this->expectException(\Exception::class);
$group = Groups::get([$this->twofaccountOne->id, 1000]);
}
/**
* @test
*/
public function test_user_authorization_to_get()
{
$this->expectException(AuthorizationException::class);
Groups::for($this->otherUser)->get($this->twofaccountOne->id);
}
/**
* @test
*/
public function test_user_authorization_to_multiple_get()
{
$this->expectException(AuthorizationException::class);
Groups::for($this->otherUser)->get([$this->twofaccountOne->id, $this->twofaccountThree->id]);
}
/**
* @test
*/
public function test_all_returns_user_groups_only()
{
$groups = Groups::for($this->user)->all();
$this->assertCount(2, $groups);
}
/**
* @test
*/
public function test_all_returns_all_groups()
{
$groups = Groups::all();
$this->assertCount(5, $groups);
}
/**
* @test
*/
public function test_withTheAllGroup_returns_pseudo_group_on_top_of_groups()
{
$groups = Groups::for($this->user)->withTheAllGroup()->all();
2021-11-30 17:39:33 +01:00
$this->assertCount(3, $groups);
$this->assertEquals(0, $groups->first()->id);
$this->assertEquals(__('commons.all'), $groups->first()->name);
$this->assertEquals($this->groupOne->user_id, $groups[1]->user_id);
$this->assertEquals($this->groupTwo->user_id, $groups[2]->user_id);
2021-11-30 17:39:33 +01:00
}
/**
* @test
*/
public function test_withTheAllGroup_returns_user_groups_with_count()
2021-11-30 17:39:33 +01:00
{
$groups = Groups::for($this->user)->withTheAllGroup()->all();
$this->assertEquals(2, $groups->first()->twofaccounts_count);
$this->assertEquals(1, $groups[1]->twofaccounts_count);
$this->assertEquals(1, $groups[2]->twofaccounts_count);
2021-11-30 17:39:33 +01:00
}
/**
* @test
*/
public function test_withTheAllGroup_returns_all_groups_with_count()
{
$groups = Groups::withTheAllGroup()->all();
$this->assertEquals(4, $groups->first()->twofaccounts_count);
$this->assertEquals(1, $groups[1]->twofaccounts_count);
$this->assertEquals(1, $groups[2]->twofaccounts_count);
$this->assertEquals(2, $groups[3]->twofaccounts_count);
}
2021-11-30 17:39:33 +01:00
/**
* @test
*/
public function test_create_persists_and_returns_created_group()
2021-11-30 17:39:33 +01:00
{
$newGroup = Groups::for($this->user)->create(['name' => self::NEW_GROUP_NAME]);
2022-11-22 15:15:52 +01:00
$this->assertDatabaseHas('groups', [
'name' => self::NEW_GROUP_NAME,
'user_id' => $this->user->id,
]);
$this->assertInstanceOf(Group::class, $newGroup);
$this->assertEquals(self::NEW_GROUP_NAME, $newGroup->name);
2021-11-30 17:39:33 +01:00
}
/**
* @test
*/
public function test_user_authorization_to_create()
2021-11-30 17:39:33 +01:00
{
$this->mock(GroupPolicy::class, function (MockInterface $groupPolicy) {
$groupPolicy->shouldReceive('create')
->andReturn(false);
});
$this->expectException(AuthorizationException::class);
2022-11-22 15:15:52 +01:00
Groups::for($this->user)->create(['name' => 'lorem'], $this->user);
}
/**
* @test
*/
public function test_create_without_user_fails()
{
$this->expectException(\Exception::class);
Groups::create(['name' => 'lorem'], $this->user);
2021-11-30 17:39:33 +01:00
}
/**
* @test
*/
public function test_update_persists_and_returns_updated_group()
2021-11-30 17:39:33 +01:00
{
$this->groupOne = Groups::for($this->user)->update($this->groupOne, ['name' => self::NEW_GROUP_NAME]);
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
$this->assertDatabaseHas('groups', ['name' => self::NEW_GROUP_NAME]);
$this->assertInstanceOf(Group::class, $this->groupOne);
$this->assertEquals(self::NEW_GROUP_NAME, $this->groupOne->name);
2021-11-30 17:39:33 +01:00
}
/**
* @test
*/
public function test_user_authorization_to_update()
2021-11-30 17:39:33 +01:00
{
$this->expectException(AuthorizationException::class);
2022-11-22 15:15:52 +01:00
Groups::for($this->otherUser)->update($this->groupOne, ['name' => self::NEW_GROUP_NAME]);
}
/**
* @test
*/
public function test_update_without_user_fails()
{
$this->expectException(\Exception::class);
Groups::update($this->groupOne, ['name' => self::NEW_GROUP_NAME]);
2021-11-30 17:39:33 +01:00
}
/**
* @test
*/
public function test_delete_a_user_group_clears_db_and_returns_deleted_count()
2021-11-30 17:39:33 +01:00
{
$deleted = Groups::for($this->user)->delete($this->groupOne->id);
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
$this->assertDatabaseMissing('groups', ['id' => $this->groupOne->id]);
$this->assertEquals(1, $deleted);
}
/**
* @test
*/
public function test_delete_multiple_user_groups_clears_db_and_returns_deleted_count()
2021-11-30 17:39:33 +01:00
{
$deleted = Groups::for($this->user)->delete([$this->groupOne->id, $this->groupTwo->id]);
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
$this->assertDatabaseMissing('groups', ['id' => $this->groupOne->id]);
$this->assertDatabaseMissing('groups', ['id' => $this->groupTwo->id]);
$this->assertEquals(2, $deleted);
}
/**
* @test
*/
public function test_delete_missing_group_does_not_fail_and_returns_deleted_count()
2021-11-30 17:39:33 +01:00
{
$this->assertDatabaseMissing('groups', ['id' => 1000]);
2021-11-30 17:39:33 +01:00
$deleted = Groups::delete([$this->groupOne->id, 1000]);
2022-11-22 15:15:52 +01:00
$this->assertDatabaseMissing('groups', ['id' => $this->groupOne->id]);
$this->assertEquals(1, $deleted);
2021-11-30 17:39:33 +01:00
}
/**
* @test
*/
public function test_delete_default_group_resets_defaultGroup_preference()
2021-11-30 17:39:33 +01:00
{
$this->user['preferences->defaultGroup'] = $this->groupOne->id;
$this->user->save();
2022-11-22 15:15:52 +01:00
Groups::delete($this->groupOne->id);
2022-11-22 15:15:52 +01:00
$this->user->refresh();
$this->assertEquals(0, $this->user->preferences['defaultGroup']);
}
/**
* @test
*/
public function test_delete_active_group_resets_activeGroup_preference()
{
$this->user['preferences->rememberActiveGroup'] = true;
$this->user['preferences->activeGroup'] = $this->groupOne->id;
$this->user->save();
Groups::delete($this->groupOne->id, $this->user);
$this->user->refresh();
$this->assertEquals(0, $this->user->preferences['activeGroup']);
}
/**
* @test
*/
public function test_user_authorization_to_delete()
{
$this->expectException(AuthorizationException::class);
Groups::for($this->otherUser)->delete($this->groupOne->id);
}
/**
* @test
*/
public function test_assign_a_twofaccount_to_a_group_persists_the_relation()
{
Groups::assign($this->twofaccountOne->id, $this->groupTwo);
$this->assertDatabaseHas('twofaccounts', [
'id' => $this->twofaccountOne->id,
'group_id' => $this->groupTwo->id,
]);
2021-11-30 17:39:33 +01:00
}
/**
* @test
*/
public function test_assign_a_twofaccount_to_a_user_group_persists_the_relation()
2021-11-30 17:39:33 +01:00
{
Groups::for($this->user)->assign($this->twofaccountOne->id, $this->groupTwo);
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
$this->assertDatabaseHas('twofaccounts', [
2022-11-22 15:15:52 +01:00
'id' => $this->twofaccountOne->id,
'group_id' => $this->groupTwo->id,
2021-11-30 17:39:33 +01:00
]);
}
/**
* @test
*/
public function test_assign_multiple_twofaccounts_to_a_user_group_persists_the_relation()
2021-11-30 17:39:33 +01:00
{
Groups::for($this->user)->assign([$this->twofaccountOne->id, $this->twofaccountTwo->id], $this->groupTwo);
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
$this->assertDatabaseHas('twofaccounts', [
2022-11-22 15:15:52 +01:00
'id' => $this->twofaccountOne->id,
'group_id' => $this->groupTwo->id,
2021-11-30 17:39:33 +01:00
]);
$this->assertDatabaseHas('twofaccounts', [
2022-11-22 15:15:52 +01:00
'id' => $this->twofaccountTwo->id,
'group_id' => $this->groupTwo->id,
2021-11-30 17:39:33 +01:00
]);
}
/**
* @test
*/
public function test_assign_a_twofaccount_to_no_group_assigns_to_default_group()
2021-11-30 17:39:33 +01:00
{
$this->user['preferences->defaultGroup'] = $this->groupTwo->id;
$this->user->save();
2022-11-22 15:15:52 +01:00
Groups::for($this->user)->assign($this->twofaccountOne->id);
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
$this->assertDatabaseHas('twofaccounts', [
2022-11-22 15:15:52 +01:00
'id' => $this->twofaccountOne->id,
2021-11-30 17:39:33 +01:00
'group_id' => $this->groupTwo->id,
]);
}
/**
* @test
*/
public function test_assign_a_twofaccount_to_no_group_assigns_to_active_group()
2021-11-30 17:39:33 +01:00
{
$this->user['preferences->defaultGroup'] = -1;
$this->user['preferences->activeGroup'] = $this->groupTwo->id;
$this->user->save();
2022-11-22 15:15:52 +01:00
Groups::for($this->user)->assign($this->twofaccountOne->id);
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
$this->assertDatabaseHas('twofaccounts', [
2022-11-22 15:15:52 +01:00
'id' => $this->twofaccountOne->id,
2021-11-30 17:39:33 +01:00
'group_id' => $this->groupTwo->id,
]);
}
/**
* @test
*/
public function test_assign_a_twofaccount_to_missing_active_group_returns_not_found()
2021-11-30 17:39:33 +01:00
{
$orginalGroup = $this->twofaccountOne->group_id;
$this->user['preferences->defaultGroup'] = -1;
$this->user['preferences->activeGroup'] = 1000;
$this->user->save();
2022-11-22 15:15:52 +01:00
Groups::for($this->user)->assign($this->twofaccountOne->id);
2022-11-22 15:15:52 +01:00
2021-11-30 17:39:33 +01:00
$this->assertDatabaseHas('twofaccounts', [
2022-11-22 15:15:52 +01:00
'id' => $this->twofaccountOne->id,
'group_id' => $orginalGroup,
2021-11-30 17:39:33 +01:00
]);
}
/**
* @test
*/
public function test_user_authorization_to_assign_to_group()
{
$this->expectException(AuthorizationException::class);
Groups::for($this->otherUser)->assign($this->twofaccountOne->id, $this->otherUser->groups()->first());
}
/**
* @test
*/
public function test_user_authorization_to_assign_multiple_to_group()
{
$this->expectException(AuthorizationException::class);
Groups::for($this->otherUser)->assign([$this->twofaccountOne->id, $this->otherUser->twofaccounts()->first()->id], $this->groupTwo);
}
/**
* @test
*/
public function test_user_authorization_to_assign_an_account()
{
$this->expectException(AuthorizationException::class);
Groups::for($this->user)->assign($this->twofaccountThree->id, $this->user->groups()->first());
}
/**
* @test
*/
public function test_user_authorization_to_assign_multiple_accounts()
2021-11-30 17:39:33 +01:00
{
$this->expectException(AuthorizationException::class);
2022-11-22 15:15:52 +01:00
Groups::for($this->user)->assign([$this->twofaccountOne->id, $this->twofaccountThree->id], $this->user->groups()->first());
2021-11-30 17:39:33 +01:00
}
2022-11-22 15:15:52 +01:00
}