Skip to content

Commit

Permalink
feat: get achievements with better method name
Browse files Browse the repository at this point in the history
 - integrate into existing tests
- update docs
  • Loading branch information
cjmellor committed Nov 10, 2024
1 parent 8045260 commit f1772a0
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 9 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ $user->grantAchievement($achievement);
To retrieve your Achievements:

```php
$user->achievements;
$user->getUserAchievements();
```

### Revoke Achievement
Expand Down
6 changes: 6 additions & 0 deletions src/Concerns/HasAchievements.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Exception;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Support\Collection;
use LevelUp\Experience\Events\AchievementAwarded;
use LevelUp\Experience\Events\AchievementProgressionIncreased;
use LevelUp\Experience\Events\AchievementRevoked;
Expand Down Expand Up @@ -57,6 +58,11 @@ public function incrementAchievementProgress(Achievement $achievement, int $amou
return $newProgress;
}

public function getUserAchievements(): Collection
{
return $this->achievements;
}

public function achievementsWithProgress(): BelongsToMany
{
return $this->belongsToMany(related: config(key: 'level-up.models.achievement'))
Expand Down
16 changes: 8 additions & 8 deletions tests/Concerns/HasAchievementsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
test(description: 'a User can earn an Achievement', closure: function (): void {
$this->user->grantAchievement($this->achievement);

expect($this->user)->achievements->toHaveCount(1);
expect($this->user)->getUserAchievements()->toHaveCount(1);

$this->assertDatabaseHas(table: 'achievement_user', data: [
'user_id' => $this->user->id,
Expand All @@ -24,7 +24,7 @@
test(description: 'a User can earn an Achievement with progress', closure: function (): void {
$this->user->grantAchievement($this->achievement, 50);

expect($this->user)->achievements->toHaveCount(1);
expect($this->user)->getUserAchievements()->toHaveCount(1);

$this->assertDatabaseHas(table: 'achievement_user', data: [
'user_id' => $this->user->id,
Expand Down Expand Up @@ -65,7 +65,7 @@
$this->user->grantAchievement(Achievement::factory()->secret()->create());

expect($this->user)->secretAchievements->toHaveCount(1)
->and($this->user)->achievements->toHaveCount(0);
->and($this->user)->getUserAchievements()->toHaveCount(0);
});

test(description: 'a User can see all Achievements', closure: function (): void {
Expand All @@ -80,7 +80,7 @@
$this->user->grantAchievement($this->achievement, 50);
$this->user->grantAchievement(Achievement::factory()->create(), 50);

expect($this->user)->achievements->first()->pivot->withProgress(50)->toHaveCount(2);
expect($this->user)->getUserAchievements()->first()->pivot->withProgress(50)->toHaveCount(2);
});

it(description: 'can increment the progress of an Achievement', closure: function (): void {
Expand All @@ -90,7 +90,7 @@

$this->user->incrementAchievementProgress($this->achievement, 1);

expect($this->user)->achievements->first()->pivot->progress->toBe(expected: 51);
expect($this->user)->getUserAchievements()->first()->pivot->progress->toBe(expected: 51);

Event::assertDispatched(
event: AchievementProgressionIncreased::class,
Expand All @@ -110,20 +110,20 @@
$this->user->grantAchievement($this->achievement);
$this->user->grantAchievement($this->achievement);

expect($this->user)->achievements->toHaveCount(count: 1);
expect($this->user)->getUserAchievements()->toHaveCount(count: 1);
})->throws(exception: Exception::class, exceptionMessage: 'User already has this Achievement');

test(description: 'a User can have an Achievement revoked', closure: function (): void {
// First grant the achievement
$this->user->grantAchievement($this->achievement);

expect($this->user)->achievements->toHaveCount(count: 1);
expect($this->user)->getUserAchievements()->toHaveCount(count: 1);

// Now revoke it
$this->user->revokeAchievement($this->achievement);

expect($this->user->fresh())
->achievements->toHaveCount(count: 0)
->getUserAchievements()->toHaveCount(count: 0)
->and($this->user->achievements()->where('achievement_id', $this->achievement->id)->exists())->toBeFalse();

$this->assertDatabaseMissing(table: 'achievement_user', data: [
Expand Down

0 comments on commit f1772a0

Please sign in to comment.