Skip to content

Commit 3e42bc9

Browse files
committed
Completed UserController Tests
1 parent 5a8f3f6 commit 3e42bc9

3 files changed

Lines changed: 282 additions & 131 deletions

File tree

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
<?php
2+
3+
/*
4+
* UserFrosting (http://www.userfrosting.com)
5+
*
6+
* @link https://github.com/userfrosting/UserFrosting
7+
* @copyright Copyright (c) 2019 Alexander Weissman
8+
* @license https://github.com/userfrosting/UserFrosting/blob/master/LICENSE.md (MIT License)
9+
*/
10+
11+
namespace UserFrosting\Sprinkle\Admin\Tests\Integration\Controller;
12+
13+
use Mockery as m;
14+
use League\FactoryMuffin\Faker\Facade as Faker;
15+
use UserFrosting\Sprinkle\Account\Database\Models\User;
16+
use UserFrosting\Sprinkle\Account\Tests\withTestUser;
17+
use UserFrosting\Sprinkle\Admin\Controller\UserController;
18+
use UserFrosting\Sprinkle\Core\Mail\Mailer;
19+
use UserFrosting\Sprinkle\Core\Mail\TwigMailMessage;
20+
use UserFrosting\Sprinkle\Core\Tests\RefreshDatabase;
21+
use UserFrosting\Sprinkle\Core\Tests\TestDatabase;
22+
use UserFrosting\Sprinkle\Core\Tests\withController;
23+
use UserFrosting\Support\Exception\BadRequestException;
24+
use UserFrosting\Support\Exception\NotFoundException;
25+
use UserFrosting\Tests\TestCase;
26+
27+
/**
28+
* Tests UserController
29+
* Specific tests for createUser, which fails on pgsql because of a bug when
30+
* creating a user with specific id before calling create
31+
*/
32+
class UserControllerCreateTest extends TestCase
33+
{
34+
use TestDatabase;
35+
use RefreshDatabase;
36+
use withTestUser;
37+
use withController;
38+
39+
/**
40+
* Setup test database for controller tests
41+
*/
42+
public function setUp()
43+
{
44+
parent::setUp();
45+
$this->setupTestDatabase();
46+
$this->refreshDatabase();
47+
}
48+
49+
public function tearDown()
50+
{
51+
parent::tearDown();
52+
m::close();
53+
}
54+
55+
/**
56+
*/
57+
public function testCreate()
58+
{
59+
$fm = $this->ci->factory;
60+
61+
// Create fake mailer
62+
$mailer = m::mock(Mailer::class);
63+
$mailer->shouldReceive('send')->once()->with(\Mockery::type(TwigMailMessage::class));
64+
$this->ci->mailer = $mailer;
65+
66+
// Create will fail on PGSQL if a user is created with forced id
67+
// because it mess the auto_increment
68+
// @see https://stackoverflow.com/questions/36157029/laravel-5-2-eloquent-save-auto-increment-pgsql-exception-on-same-id
69+
$user = $fm->create(User::class);
70+
$this->giveUserTestPermission($user, 'create_user');
71+
$this->giveUserTestPermission($user, 'create_user_field');
72+
$this->loginUser($user);
73+
74+
// Recreate controller to use the fake mailer
75+
$controller = $this->getController();
76+
77+
// Create a fake group
78+
$group = $fm->create('UserFrosting\Sprinkle\Account\Database\Models\Group');
79+
80+
// Set post data
81+
$data = [
82+
'user_name' => 'foo',
83+
'first_name' => 'foo name',
84+
'last_name' => 'foo last',
85+
'email' => '[email protected]',
86+
'group_id' => $group->id
87+
];
88+
$request = $this->getRequest()->withParsedBody($data);
89+
90+
// Get controller stuff
91+
$result = $controller->create($request, $this->getResponse(), []);
92+
$this->assertSame($result->getStatusCode(), 200);
93+
$this->assertJson((string) $result->getBody());
94+
$this->assertSame('[]', (string) $result->getBody());
95+
96+
// Make sure role was created
97+
$user = User::where('user_name', 'foo')->first();
98+
$this->assertSame('foo name', $user->first_name);
99+
$this->assertSame($group->id, $user->group->id);
100+
101+
// Test message
102+
$ms = $this->ci->alerts;
103+
$messages = $ms->getAndClearMessages();
104+
$this->assertSame('success', end($messages)['type']);
105+
}
106+
107+
/**
108+
* @depends testCreate
109+
* @param UserController $controller
110+
*/
111+
public function testCreateWithNoLocale()
112+
{
113+
$this->ci->config['site.locales.available'] = [];
114+
$this->testCreate();
115+
}
116+
117+
/**
118+
* @depends testCreate
119+
* @param UserController $controller
120+
*/
121+
public function testCreateWithNoGroupId()
122+
{
123+
$fm = $this->ci->factory;
124+
125+
// Create fake mailer
126+
$mailer = m::mock(Mailer::class);
127+
$mailer->shouldReceive('send')->once()->with(\Mockery::type(TwigMailMessage::class));
128+
$this->ci->mailer = $mailer;
129+
130+
// Also create a group
131+
$group = $fm->create('UserFrosting\Sprinkle\Account\Database\Models\Group');
132+
133+
// Create will fail on PGSQL if a user is created with forced id
134+
// because it mess the auto_increment
135+
// @see https://stackoverflow.com/questions/36157029/laravel-5-2-eloquent-save-auto-increment-pgsql-exception-on-same-id
136+
$user = $fm->create(User::class, [
137+
'group_id' => $group->id,
138+
]);
139+
$this->giveUserTestPermission($user, 'create_user');
140+
$this->loginUser($user);
141+
142+
// Recreate controller to use the fake mailer
143+
$controller = $this->getController();
144+
145+
// Set post data
146+
$data = [
147+
'user_name' => 'foo',
148+
'first_name' => 'foo name',
149+
'last_name' => 'foo last',
150+
'email' => '[email protected]',
151+
];
152+
$request = $this->getRequest()->withParsedBody($data);
153+
154+
// Get controller stuff
155+
$result = $controller->create($request, $this->getResponse(), []);
156+
$this->assertSame($result->getStatusCode(), 200);
157+
$this->assertJson((string) $result->getBody());
158+
$this->assertSame('[]', (string) $result->getBody());
159+
160+
// Make sure role was created
161+
$user = User::where('user_name', 'foo')->first();
162+
$this->assertSame('foo name', $user->first_name);
163+
$this->assertSame($group->id, $user->group->id);
164+
165+
// Test message
166+
$ms = $this->ci->alerts;
167+
$messages = $ms->getAndClearMessages();
168+
$this->assertSame('success', end($messages)['type']);
169+
}
170+
171+
/**
172+
* @return UserController
173+
*/
174+
private function getController()
175+
{
176+
return new UserController($this->ci);
177+
}
178+
}

app/sprinkles/admin/tests/Integration/Controller/UserControllerGuestTest.php

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010

1111
namespace UserFrosting\Sprinkle\Admin\Tests\Integration\Controller;
1212

13+
use Mockery as m;
1314
use UserFrosting\Sprinkle\Account\Database\Models\User;
1415
use UserFrosting\Sprinkle\Account\Tests\withTestUser;
1516
use UserFrosting\Sprinkle\Admin\Controller\UserController;
17+
use UserFrosting\Sprinkle\Core\Mail\Mailer;
18+
use UserFrosting\Sprinkle\Core\Mail\TwigMailMessage;
1619
use UserFrosting\Sprinkle\Core\Tests\RefreshDatabase;
1720
use UserFrosting\Sprinkle\Core\Tests\TestDatabase;
1821
use UserFrosting\Sprinkle\Core\Tests\withController;
@@ -57,6 +60,12 @@ public function setUp()
5760
}
5861
}
5962

63+
public function tearDown()
64+
{
65+
parent::tearDown();
66+
m::close();
67+
}
68+
6069
/**
6170
*/
6271
public function testControllerConstructor()
@@ -92,6 +101,75 @@ public function testCreateWithNoPermissions(UserController $controller)
92101
$controller->create($this->getRequest(), $this->getResponse(), []);
93102
}
94103

104+
/**
105+
* @depends testControllerConstructorWithUser
106+
*/
107+
public function testCreateWithNoGroupPermissions()
108+
{
109+
$user = $this->createTestUser(false, true);
110+
$this->giveUserTestPermission($user, 'create_user');
111+
112+
// Recreate controller to use new user
113+
$controller = $this->getController();
114+
115+
// Create a fake group
116+
$fm = $this->ci->factory;
117+
$group = $fm->create('UserFrosting\Sprinkle\Account\Database\Models\Group');
118+
119+
// Set post data
120+
$data = [
121+
'user_name' => 'foo',
122+
'first_name' => 'foo name',
123+
'last_name' => 'foo last',
124+
'email' => '[email protected]',
125+
'group_id' => $group->id
126+
];
127+
$request = $this->getRequest()->withParsedBody($data);
128+
129+
// Get controller stuff
130+
$this->expectException(ForbiddenException::class);
131+
$result = $controller->create($request, $this->getResponse(), []);
132+
}
133+
134+
/**
135+
* @depends testControllerConstructorWithUser
136+
* @param UserController $controller
137+
*/
138+
public function testCreatePasswordResetWithNoPermissions(UserController $controller)
139+
{
140+
$this->expectException(ForbiddenException::class);
141+
$controller->createPasswordReset($this->getRequest(), $this->getResponse(), ['user_name' => 'userfoo']);
142+
}
143+
144+
/**
145+
* @depends testControllerConstructorWithUser
146+
* @depends testCreatePasswordResetWithNoPermissions
147+
* @param UserController $controller
148+
*/
149+
public function testCreatePasswordResetWithPartialPermissions(UserController $controller)
150+
{
151+
// Create fake mailer
152+
$mailer = m::mock(Mailer::class);
153+
$mailer->shouldReceive('send')->once()->with(\Mockery::type(TwigMailMessage::class));
154+
$this->ci->mailer = $mailer;
155+
156+
// Recreate controller to use the fake mailer
157+
$user = $this->createTestUser(false, true);
158+
$this->giveUserTestPermission($user, 'update_user_field');
159+
$controller = $this->getController();
160+
161+
// Get controller stuff
162+
$result = $controller->createPasswordReset($this->getRequest(), $this->getResponse(), ['user_name' => 'userfoo']);
163+
$this->assertSame($result->getStatusCode(), 200);
164+
$this->assertJson((string) $result->getBody());
165+
$this->assertSame('[]', (string) $result->getBody());
166+
167+
// Test message
168+
$ms = $this->ci->alerts;
169+
$messages = $ms->getAndClearMessages();
170+
$this->assertSame('success', end($messages)['type']);
171+
}
172+
95173
/**
96174
* @depends testControllerConstructorWithUser
97175
* @param UserController $controller

0 commit comments

Comments
 (0)