. Licensed under the GNU Affero General Public License v3.0. // See the LICENCE file in the repository root for full licence text. namespace Tests\Controllers\InterOp; use App\Models\Achievement; use App\Models\Country; use App\Models\User; use Tests\TestCase; class UsersControllerTest extends TestCase { public function testAchievement() { $achievementName = 'Test Achievement'; $username = 'username1'; $user = User::factory()->create(['username' => $username]); $achievement = Achievement::factory()->create(['name' => $achievementName]); $this->expectCountChange(fn () => $user->userAchievements()->count(), 1); $this->expectCountChange(fn () => $user->userNotifications()->count(), 1); $this->expectCountChange(fn () => $user->events()->count(), 1); $url = route('interop.users.achievement', [ 'achievement' => $achievement->getKey(), 'timestamp' => time(), 'user' => $user->getKey(), ]); $this ->withInterOpHeader($url) ->post($url) ->assertSuccessful(); $userUrl = route('users.show', ['user' => $user->getKey()], false); $this->assertSame( "{$username} unlocked the \"{$achievementName}\" medal!", $user->events()->last()->text, ); } public function testAchievementDuplicate() { $achievementName = 'Test Achievement'; $username = 'username1'; $user = User::factory()->create(['username' => $username]); $achievement = Achievement::factory()->create(['name' => $achievementName]); $user->userAchievements()->create([ 'achievement_id' => $achievement->getKey(), ]); $this->expectCountChange(fn () => $user->userAchievements()->count(), 0); $this->expectCountChange(fn () => $user->userNotifications()->count(), 0); $this->expectCountChange(fn () => $user->events()->count(), 0); $url = route('interop.users.achievement', [ 'achievement' => $achievement->getKey(), 'timestamp' => time(), 'user' => $user->getKey(), ]); $this ->withInterOpHeader($url) ->post($url) ->assertStatus(422); } public function testStore() { $previousCount = User::count(); $country = Country::factory()->create(); $url = route('interop.users.store', ['timestamp' => time()]); $this ->withInterOpHeader($url) ->json('POST', $url, [ 'user' => [ 'country_acronym' => $country->getKey(), 'password' => 'password', 'user_email' => 'test@user.com', 'username' => 'testuser', ], ])->assertJsonFragment([ 'username' => 'testuser', ]); $this->assertSame($previousCount + 1, User::count()); } public function testStoreUserCopy() { $country = Country::factory()->create(); $sourceUser = User::factory()->create(['country_acronym' => $country->getKey(), 'user_ip' => '127.0.0.1']); $url = route('interop.users.store', ['timestamp' => time()]); $username = 'userbot'; $group = 'bot'; $previousCount = User::count(); $this ->withInterOpHeader($url) ->json('POST', $url, [ 'source_user_id' => $sourceUser->getKey(), 'user' => [ 'username' => $username, 'group' => $group, ], ])->assertJsonFragment([ 'username' => $username, ]); $this->assertSame($previousCount + 1, User::count()); $user = User::where(['username' => $username])->first(); foreach (['user_password', 'user_ip', 'country_acronym'] as $copiedAttribute) { $this->assertSame($sourceUser->$copiedAttribute, $user->$copiedAttribute, $copiedAttribute); } $this->assertStringContainsString("+{$username}@", $user->user_email); $this->assertTrue($user->isGroup(app('groups')->byIdentifier($group))); } public function testStoreUserCopyMissingUsername() { $country = Country::factory()->create(); $sourceUser = User::factory()->create(['country_acronym' => $country->getKey(), 'user_ip' => '127.0.0.1']); $previousCount = User::count(); $url = route('interop.users.store', ['timestamp' => time()]); $this ->withInterOpHeader($url) ->json('POST', $url, [ 'source_user_id' => $sourceUser->getKey(), ])->assertStatus(422); $this->assertSame($previousCount, User::count()); } }