Changeset View
Changeset View
Standalone View
Standalone View
src/tests/Feature/UserTest.php
Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | class UserTest extends TestCase | ||||
* Test user create/creating observer | * Test user create/creating observer | ||||
*/ | */ | ||||
public function testCreate(): void | public function testCreate(): void | ||||
{ | { | ||||
Queue::fake(); | Queue::fake(); | ||||
$domain = \config('app.domain'); | $domain = \config('app.domain'); | ||||
$user = User::create([ | $user = User::create(['email' => 'USER-test@' . \strtoupper($domain)]); | ||||
'email' => 'USER-test@' . \strtoupper($domain) | |||||
]); | |||||
$result = User::where('email', 'user-test@' . $domain)->first(); | $result = User::where('email', 'user-test@' . $domain)->first(); | ||||
$this->assertSame('user-test@' . $domain, $result->email); | $this->assertSame('user-test@' . $domain, $result->email); | ||||
$this->assertSame($user->id, $result->id); | $this->assertSame($user->id, $result->id); | ||||
$this->assertSame(User::STATUS_NEW | User::STATUS_ACTIVE, $result->status); | $this->assertSame(User::STATUS_NEW | User::STATUS_ACTIVE, $result->status); | ||||
} | } | ||||
/** | /** | ||||
* Verify user creation process | * Verify user creation process | ||||
*/ | */ | ||||
public function testCreateJobs(): void | public function testCreateJobs(): void | ||||
{ | { | ||||
// Fake the queue, assert that no jobs were pushed... | // Fake the queue, assert that no jobs were pushed... | ||||
Queue::fake(); | Queue::fake(); | ||||
Queue::assertNothingPushed(); | Queue::assertNothingPushed(); | ||||
$user = User::create([ | $user = User::create([ | ||||
'email' => 'user-test@' . \config('app.domain') | 'email' => 'user-test@' . \config('app.domain') | ||||
]); | ]); | ||||
Queue::assertPushed(\App\Jobs\UserCreate::class, 1); | Queue::assertPushed(\App\Jobs\User\CreateJob::class, 1); | ||||
Queue::assertPushed(\App\Jobs\UserCreate::class, function ($job) use ($user) { | |||||
$job_user = TestCase::getObjectProperty($job, 'user'); | |||||
return $job_user->id === $user->id | Queue::assertPushed( | ||||
&& $job_user->email === $user->email; | \App\Jobs\User\CreateJob::class, | ||||
}); | function ($job) use ($user) { | ||||
$userEmail = TestCase::getObjectProperty($job, 'userEmail'); | |||||
$userId = TestCase::getObjectProperty($job, 'userId'); | |||||
Queue::assertPushedWithChain(\App\Jobs\UserCreate::class, [ | return $userEmail === $user->email | ||||
\App\Jobs\UserVerify::class, | && $userId === $user->id; | ||||
]); | } | ||||
); | |||||
Queue::assertPushedWithChain( | |||||
\App\Jobs\User\CreateJob::class, | |||||
[ | |||||
\App\Jobs\User\VerifyJob::class, | |||||
] | |||||
); | |||||
/* | /* | ||||
FIXME: Looks like we can't really do detailed assertions on chained jobs | FIXME: Looks like we can't really do detailed assertions on chained jobs | ||||
Another thing to consider is if we maybe should run these jobs | Another thing to consider is if we maybe should run these jobs | ||||
independently (not chained) and make sure there's no race-condition | independently (not chained) and make sure there's no race-condition | ||||
in status update | in status update | ||||
Queue::assertPushed(\App\Jobs\UserVerify::class, 1); | Queue::assertPushed(\App\Jobs\User\VerifyJob::class, 1); | ||||
Queue::assertPushed(\App\Jobs\UserVerify::class, function ($job) use ($user) { | Queue::assertPushed(\App\Jobs\User\VerifyJob::class, function ($job) use ($user) { | ||||
$job_user = TestCase::getObjectProperty($job, 'user'); | $userEmail = TestCase::getObjectProperty($job, 'userEmail'); | ||||
$userId = TestCase::getObjectProperty($job, 'userId'); | |||||
return $job_user->id === $user->id | return $userEmail === $user->email | ||||
&& $job_user->email === $user->email; | && $userId === $user->id; | ||||
}); | }); | ||||
*/ | */ | ||||
} | } | ||||
/** | /** | ||||
* Tests for User::domains() | * Tests for User::domains() | ||||
*/ | */ | ||||
public function testDomains(): void | public function testDomains(): void | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | public function testDelete(): void | ||||
$user->delete(); | $user->delete(); | ||||
$this->assertCount(0, $user->entitlements()->get()); | $this->assertCount(0, $user->entitlements()->get()); | ||||
$this->assertTrue($user->fresh()->trashed()); | $this->assertTrue($user->fresh()->trashed()); | ||||
$this->assertFalse($user->fresh()->isDeleted()); | $this->assertFalse($user->fresh()->isDeleted()); | ||||
// Delete the user for real | // Delete the user for real | ||||
$job = new \App\Jobs\UserDelete($id); | $job = new \App\Jobs\User\DeleteJob($id); | ||||
$job->handle(); | $job->handle(); | ||||
$this->assertTrue(User::withTrashed()->where('id', $id)->first()->isDeleted()); | $this->assertTrue(User::withTrashed()->where('id', $id)->first()->isDeleted()); | ||||
$user->forceDelete(); | $user->forceDelete(); | ||||
$this->assertCount(0, User::withTrashed()->where('id', $id)->get()); | $this->assertCount(0, User::withTrashed()->where('id', $id)->get()); | ||||
▲ Show 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | public function testSetAliases(): void | ||||
'type' => Domain::TYPE_HOSTED, | 'type' => Domain::TYPE_HOSTED, | ||||
]); | ]); | ||||
$this->assertCount(0, $user->aliases->all()); | $this->assertCount(0, $user->aliases->all()); | ||||
// Add an alias | // Add an alias | ||||
$user->setAliases(['UserAlias1@UserAccount.com']); | $user->setAliases(['UserAlias1@UserAccount.com']); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 1); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 1); | ||||
$aliases = $user->aliases()->get(); | $aliases = $user->aliases()->get(); | ||||
$this->assertCount(1, $aliases); | $this->assertCount(1, $aliases); | ||||
$this->assertSame('useralias1@useraccount.com', $aliases[0]['alias']); | $this->assertSame('useralias1@useraccount.com', $aliases[0]['alias']); | ||||
// Add another alias | // Add another alias | ||||
$user->setAliases(['UserAlias1@UserAccount.com', 'UserAlias2@UserAccount.com']); | $user->setAliases(['UserAlias1@UserAccount.com', 'UserAlias2@UserAccount.com']); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 2); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 2); | ||||
$aliases = $user->aliases()->orderBy('alias')->get(); | $aliases = $user->aliases()->orderBy('alias')->get(); | ||||
$this->assertCount(2, $aliases); | $this->assertCount(2, $aliases); | ||||
$this->assertSame('useralias1@useraccount.com', $aliases[0]->alias); | $this->assertSame('useralias1@useraccount.com', $aliases[0]->alias); | ||||
$this->assertSame('useralias2@useraccount.com', $aliases[1]->alias); | $this->assertSame('useralias2@useraccount.com', $aliases[1]->alias); | ||||
// Remove an alias | // Remove an alias | ||||
$user->setAliases(['UserAlias1@UserAccount.com']); | $user->setAliases(['UserAlias1@UserAccount.com']); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 3); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 3); | ||||
$aliases = $user->aliases()->get(); | $aliases = $user->aliases()->get(); | ||||
$this->assertCount(1, $aliases); | $this->assertCount(1, $aliases); | ||||
$this->assertSame('useralias1@useraccount.com', $aliases[0]['alias']); | $this->assertSame('useralias1@useraccount.com', $aliases[0]['alias']); | ||||
// Remove all aliases | // Remove all aliases | ||||
$user->setAliases([]); | $user->setAliases([]); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 4); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 4); | ||||
$this->assertCount(0, $user->aliases()->get()); | $this->assertCount(0, $user->aliases()->get()); | ||||
// The test below fail since we removed validation code from the UserAliasObserver | // The test below fail since we removed validation code from the UserAliasObserver | ||||
$this->markTestIncomplete(); | $this->markTestIncomplete(); | ||||
// Test sanity checks in UserAliasObserver | // Test sanity checks in UserAliasObserver | ||||
Queue::fake(); | Queue::fake(); | ||||
Show All 32 Lines | */ | ||||
*/ | */ | ||||
public function testUserSettings(): void | public function testUserSettings(): void | ||||
{ | { | ||||
Queue::fake(); | Queue::fake(); | ||||
Queue::assertNothingPushed(); | Queue::assertNothingPushed(); | ||||
$user = $this->getTestUser('UserAccountA@UserAccount.com'); | $user = $this->getTestUser('UserAccountA@UserAccount.com'); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 0); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 0); | ||||
// Test default settings | // Test default settings | ||||
// Note: Technicly this tests UserObserver::created() behavior | // Note: Technicly this tests UserObserver::created() behavior | ||||
$all_settings = $user->settings()->orderBy('key')->get(); | $all_settings = $user->settings()->orderBy('key')->get(); | ||||
$this->assertCount(2, $all_settings); | $this->assertCount(2, $all_settings); | ||||
$this->assertSame('country', $all_settings[0]->key); | $this->assertSame('country', $all_settings[0]->key); | ||||
$this->assertSame('CH', $all_settings[0]->value); | $this->assertSame('CH', $all_settings[0]->value); | ||||
$this->assertSame('currency', $all_settings[1]->key); | $this->assertSame('currency', $all_settings[1]->key); | ||||
$this->assertSame('CHF', $all_settings[1]->value); | $this->assertSame('CHF', $all_settings[1]->value); | ||||
// Add a setting | // Add a setting | ||||
$user->setSetting('first_name', 'Firstname'); | $user->setSetting('first_name', 'Firstname'); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 1); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 1); | ||||
// Note: We test both current user as well as fresh user object | // Note: We test both current user as well as fresh user object | ||||
// to make sure cache works as expected | // to make sure cache works as expected | ||||
$this->assertSame('Firstname', $user->getSetting('first_name')); | $this->assertSame('Firstname', $user->getSetting('first_name')); | ||||
$this->assertSame('Firstname', $user->fresh()->getSetting('first_name')); | $this->assertSame('Firstname', $user->fresh()->getSetting('first_name')); | ||||
// Update a setting | // Update a setting | ||||
$user->setSetting('first_name', 'Firstname1'); | $user->setSetting('first_name', 'Firstname1'); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 2); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 2); | ||||
// Note: We test both current user as well as fresh user object | // Note: We test both current user as well as fresh user object | ||||
// to make sure cache works as expected | // to make sure cache works as expected | ||||
$this->assertSame('Firstname1', $user->getSetting('first_name')); | $this->assertSame('Firstname1', $user->getSetting('first_name')); | ||||
$this->assertSame('Firstname1', $user->fresh()->getSetting('first_name')); | $this->assertSame('Firstname1', $user->fresh()->getSetting('first_name')); | ||||
// Delete a setting (null) | // Delete a setting (null) | ||||
$user->setSetting('first_name', null); | $user->setSetting('first_name', null); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 3); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 3); | ||||
// Note: We test both current user as well as fresh user object | // Note: We test both current user as well as fresh user object | ||||
// to make sure cache works as expected | // to make sure cache works as expected | ||||
$this->assertSame(null, $user->getSetting('first_name')); | $this->assertSame(null, $user->getSetting('first_name')); | ||||
$this->assertSame(null, $user->fresh()->getSetting('first_name')); | $this->assertSame(null, $user->fresh()->getSetting('first_name')); | ||||
// Delete a setting (empty string) | // Delete a setting (empty string) | ||||
$user->setSetting('first_name', 'Firstname1'); | $user->setSetting('first_name', 'Firstname1'); | ||||
$user->setSetting('first_name', ''); | $user->setSetting('first_name', ''); | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 5); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 5); | ||||
// Note: We test both current user as well as fresh user object | // Note: We test both current user as well as fresh user object | ||||
// to make sure cache works as expected | // to make sure cache works as expected | ||||
$this->assertSame(null, $user->getSetting('first_name')); | $this->assertSame(null, $user->getSetting('first_name')); | ||||
$this->assertSame(null, $user->fresh()->getSetting('first_name')); | $this->assertSame(null, $user->fresh()->getSetting('first_name')); | ||||
// Set multiple settings at once | // Set multiple settings at once | ||||
$user->setSettings([ | $user->setSettings([ | ||||
'first_name' => 'Firstname2', | 'first_name' => 'Firstname2', | ||||
'last_name' => 'Lastname2', | 'last_name' => 'Lastname2', | ||||
'country' => null, | 'country' => null, | ||||
]); | ]); | ||||
// TODO: This really should create a single UserUpdate job, not 3 | // TODO: This really should create a single UserUpdate job, not 3 | ||||
Queue::assertPushed(\App\Jobs\UserUpdate::class, 7); | Queue::assertPushed(\App\Jobs\User\UpdateJob::class, 7); | ||||
// Note: We test both current user as well as fresh user object | // Note: We test both current user as well as fresh user object | ||||
// to make sure cache works as expected | // to make sure cache works as expected | ||||
$this->assertSame('Firstname2', $user->getSetting('first_name')); | $this->assertSame('Firstname2', $user->getSetting('first_name')); | ||||
$this->assertSame('Firstname2', $user->fresh()->getSetting('first_name')); | $this->assertSame('Firstname2', $user->fresh()->getSetting('first_name')); | ||||
$this->assertSame('Lastname2', $user->getSetting('last_name')); | $this->assertSame('Lastname2', $user->getSetting('last_name')); | ||||
$this->assertSame('Lastname2', $user->fresh()->getSetting('last_name')); | $this->assertSame('Lastname2', $user->fresh()->getSetting('last_name')); | ||||
$this->assertSame(null, $user->getSetting('country')); | $this->assertSame(null, $user->getSetting('country')); | ||||
▲ Show 20 Lines • Show All 43 Lines • Show Last 20 Lines |