Fixed name retrieval on missing users and added tests to cover along with some test helper methods

This commit is contained in:
Dan Brown 2015-12-15 19:27:36 +00:00
parent 123dc11583
commit af33156369
9 changed files with 90 additions and 14 deletions

View File

@ -159,16 +159,14 @@ class UserController extends Controller
$this->checkPermissionOr('user-delete', function () use ($id) { $this->checkPermissionOr('user-delete', function () use ($id) {
return $this->currentUser->id == $id; return $this->currentUser->id == $id;
}); });
$user = $this->userRepo->getById($id);
// Delete social accounts $user = $this->userRepo->getById($id);
if ($this->userRepo->isOnlyAdmin($user)) { if ($this->userRepo->isOnlyAdmin($user)) {
session()->flash('error', 'You cannot delete the only admin'); session()->flash('error', 'You cannot delete the only admin');
return redirect($user->getEditUrl()); return redirect($user->getEditUrl());
} }
$this->userRepo->destroy($user);
$user->socialAccounts()->delete();
$user->delete();
return redirect('/users'); return redirect('/users');
} }
} }

View File

@ -46,16 +46,21 @@ class UserRepo
public function registerNew(array $data) public function registerNew(array $data)
{ {
$user = $this->create($data); $user = $this->create($data);
$roleId = \Setting::get('registration-role'); $this->attachDefaultRole($user);
if ($roleId === false) {
$roleId = $this->role->getDefault()->id;
}
$user->attachRoleId($roleId);
return $user; return $user;
} }
/**
* Give a user the default role. Used when creating a new user.
* @param $user
*/
public function attachDefaultRole($user)
{
$roleId = \Setting::get('registration-role');
if ($roleId === false) $roleId = $this->role->getDefault()->id;
$user->attachRoleId($roleId);
}
/** /**
* Checks if the give user is the only admin. * Checks if the give user is the only admin.
* @param User $user * @param User $user
@ -88,4 +93,14 @@ class UserRepo
'password' => bcrypt($data['password']) 'password' => bcrypt($data['password'])
]); ]);
} }
/**
* Remove the given user from storage, Delete all related content.
* @param User $user
*/
public function destroy(User $user)
{
$user->socialAccounts()->delete();
$user->delete();
}
} }

View File

@ -32,6 +32,8 @@ body.dragging, body.dragging * {
.avatar { .avatar {
border-radius: 100%; border-radius: 100%;
background-color: #EEE; background-color: #EEE;
width: 30px;
height: 30px;
&.med { &.med {
width: 40px; width: 40px;
height: 40px; height: 40px;

View File

@ -58,7 +58,7 @@
<p class="text-muted small"> <p class="text-muted small">
Created {{$book->created_at->diffForHumans()}} @if($book->createdBy) by {{$book->createdBy->name}} @endif Created {{$book->created_at->diffForHumans()}} @if($book->createdBy) by {{$book->createdBy->name}} @endif
<br> <br>
Last Updated {{$book->updated_at->diffForHumans()}} @if($book->createdBy) by {{$book->updatedBy->name}} @endif Last Updated {{$book->updated_at->diffForHumans()}} @if($book->updatedBy) by {{$book->updatedBy->name}} @endif
</p> </p>
</div> </div>
</div> </div>

View File

@ -56,7 +56,7 @@
<p class="text-muted small"> <p class="text-muted small">
Created {{$chapter->created_at->diffForHumans()}} @if($chapter->createdBy) by {{$chapter->createdBy->name}} @endif Created {{$chapter->created_at->diffForHumans()}} @if($chapter->createdBy) by {{$chapter->createdBy->name}} @endif
<br> <br>
Last Updated {{$chapter->updated_at->diffForHumans()}} @if($chapter->createdBy) by {{$chapter->updatedBy->name}} @endif Last Updated {{$chapter->updated_at->diffForHumans()}} @if($chapter->updatedBy) by {{$chapter->updatedBy->name}} @endif
</p> </p>
</div> </div>
<div class="col-md-3 col-md-offset-1"> <div class="col-md-3 col-md-offset-1">

View File

@ -53,7 +53,7 @@
<p class="text-muted small"> <p class="text-muted small">
Created {{$page->created_at->diffForHumans()}} @if($page->createdBy) by {{$page->createdBy->name}} @endif Created {{$page->created_at->diffForHumans()}} @if($page->createdBy) by {{$page->createdBy->name}} @endif
<br> <br>
Last Updated {{$page->updated_at->diffForHumans()}} @if($page->createdBy) by {{$page->updatedBy->name}} @endif Last Updated {{$page->updated_at->diffForHumans()}} @if($page->updatedBy) by {{$page->updatedBy->name}} @endif
</p> </p>
</div> </div>

View File

@ -10,6 +10,8 @@
<div class="right"> <div class="right">
@if($activity->user) @if($activity->user)
{{$activity->user->name}} {{$activity->user->name}}
@else
A deleted user
@endif @endif
{{ $activity->getText() }} {{ $activity->getText() }}

View File

@ -171,4 +171,29 @@ class EntityTest extends TestCase
} }
public function testEntitiesViewableAfterCreatorDeletion()
{
$creator = $this->getNewUser();
$updater = $this->getNewUser();
$entities = $this->createEntityChainBelongingToUser($creator, $updater);
app('BookStack\Repos\UserRepo')->destroy($creator);
$this->asAdmin()->visit($entities['book']->getUrl())->seeStatusCode(200)
->visit($entities['chapter']->getUrl())->seeStatusCode(200)
->visit($entities['page']->getUrl())->seeStatusCode(200);
}
public function testEntitiesViewableAfterUpdaterDeletion()
{
$creator = $this->getNewUser();
$updater = $this->getNewUser();
$entities = $this->createEntityChainBelongingToUser($creator, $updater);
app('BookStack\Repos\UserRepo')->destroy($updater);
$this->asAdmin()->visit($entities['book']->getUrl())->seeStatusCode(200)
->visit($entities['chapter']->getUrl())->seeStatusCode(200)
->visit($entities['page']->getUrl())->seeStatusCode(200);
}
} }

View File

@ -49,6 +49,40 @@ class TestCase extends Illuminate\Foundation\Testing\TestCase
} }
} }
/**
* Create a group of entities that belong to a specific user.
* @param $creatorUser
* @param $updaterUser
* @return array
*/
protected function createEntityChainBelongingToUser($creatorUser, $updaterUser = false)
{
if ($updaterUser === false) $updaterUser = $creatorUser;
$book = factory(BookStack\Book::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id]);
$chapter = factory(BookStack\Chapter::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id]);
$page = factory(BookStack\Page::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id, 'book_id' => $book->id]);
$book->chapters()->saveMany([$chapter]);
$chapter->pages()->saveMany([$page]);
return [
'book' => $book,
'chapter' => $chapter,
'page' => $page
];
}
/**
* Quick way to create a new user
* @param array $attributes
* @return mixed
*/
protected function getNewUser($attributes = [])
{
$user = factory(\BookStack\User::class)->create($attributes);
$userRepo = app('BookStack\Repos\UserRepo');
$userRepo->attachDefaultRole($user);
return $user;
}
/** /**
* Assert that a given string is seen inside an element. * Assert that a given string is seen inside an element.
* *