diff --git a/tests/Feature/Membership/IndexTest.php b/tests/Feature/Membership/IndexTest.php index 11c6a40b..292d6ca1 100644 --- a/tests/Feature/Membership/IndexTest.php +++ b/tests/Feature/Membership/IndexTest.php @@ -3,67 +3,94 @@ namespace Tests\Feature\Membership; use App\Group; +use App\Lib\Data\DateData; +use App\Member\Data\ActivityData; +use App\Member\Data\GroupData; +use App\Member\Data\MembershipData; +use App\Member\Data\SubactivityData; use App\Member\Member; use App\Member\Membership; -use Generator; use Carbon\Carbon; use Illuminate\Foundation\Testing\DatabaseTransactions; -use PHPUnit\Framework\Attributes\DataProvider; -use Tests\TestCase; -class IndexTest extends TestCase -{ +covers(MembershipData::class); +covers(DateData::class); +covers(GroupData::class); +covers(ActivityData::class); +covers(SubactivityData::class); +uses(DatabaseTransactions::class); - use DatabaseTransactions; +it('testItShowsActivityAndSubactivityNamesOfMember', function () { + $this->withoutExceptionHandling()->login()->loginNami(); + $group = Group::factory()->create(['name' => 'aaaaaaaa']); + $member = Member::factory() + ->defaults() + ->for($group) + ->has(Membership::factory()->for($group)->in('€ Mitglied', 122, 'Wölfling', 234)->from('2022-11-02')->promise(now())) + ->create(); + $membership = $member->memberships->first(); - public function testItShowsActivityAndSubactivityNamesOfMember(): void - { - $this->withoutExceptionHandling()->login()->loginNami(); - $group = Group::factory()->create(['name' => 'aaaaaaaa']); - $member = Member::factory() - ->defaults() - ->for($group) - ->has(Membership::factory()->for($group)->in('€ Mitglied', 122, 'Wölfling', 234)->from('2022-11-02')) - ->create(); - $membership = $member->memberships->first(); + $this->get("/member/{$member->id}/membership") + ->assertJsonPath('data.0.activity.id', $membership->activity_id) + ->assertJsonPath('data.0.subactivity.id', $membership->subactivity_id) + ->assertJsonPath('data.0.activity.name', '€ Mitglied') + ->assertJsonPath('data.0.subactivity.name', 'Wölfling') + ->assertJsonPath('data.0.from.human', '02.11.2022') + ->assertJsonPath('data.0.from.raw', '2022-11-02') + ->assertJsonPath('data.0.promised_at.raw', now()->format('Y-m-d')) + ->assertJsonPath('data.0.promised_at.human', now()->format('d.m.Y')) + ->assertJsonPath('data.0.group.id', $group->id) + ->assertJsonPath('data.0.id', $membership->id) + ->assertJsonPath('data.0.links.update', route('membership.update', ['membership' => $membership])) + ->assertJsonPath('data.0.links.destroy', route('membership.destroy', ['membership' => $membership])); +}); - $this->get("/member/{$member->id}/membership") - ->assertJsonPath('data.0.activity.id', $membership->activity_id) - ->assertJsonPath('data.0.subactivity.id', $membership->subactivity_id) - ->assertJsonPath('data.0.activity.name', '€ Mitglied') - ->assertJsonPath('data.0.subactivity.name', 'Wölfling') - ->assertJsonPath('data.0.from.human', '02.11.2022') - ->assertJsonPath('data.0.from.raw', '2022-11-02') - ->assertJsonPath('data.0.group.id', $group->id) - ->assertJsonPath('data.0.id', $membership->id) - ->assertJsonPath('data.0.links.update', route('membership.update', ['membership' => $membership])) - ->assertJsonPath('data.0.links.destroy', route('membership.destroy', ['membership' => $membership])) - ->assertJsonPath('meta.default.activity_id', null) - ->assertJsonPath('meta.default.group_id', $group->id) - ->assertJsonPath('meta.groups.0.id', $group->id) - ->assertJsonPath('meta.activities.0.id', $membership->activity_id) - ->assertJsonPath("meta.subactivities.{$membership->activity_id}.0.id", $membership->subactivity_id) - ->assertJsonPath("meta.subactivities.{$membership->activity_id}.0.is_age_group", true) - ->assertJsonPath('meta.links.store', route('member.membership.store', ['member' => $member])); - } +it('returns meta', function () { + $this->withoutExceptionHandling()->login()->loginNami(); + $group = Group::factory()->create(['name' => 'aaaaaaaa']); + $membership = Membership::factory() + ->for(Member::factory()->defaults()->for($group)) + ->for($group) + ->in('€ Mitglied', 122, 'Wölfling', 234)->from('2022-11-02') + ->create(); - public static function membershipDataProvider(): Generator - { - yield [now()->subMonths(2), null, true]; - yield [now()->subMonths(2), now()->subDay(), false]; - yield [now()->addDays(2), null, false]; - } + $this->get("/member/{$membership->member->id}/membership") + ->assertNull('meta.default.activity_id') + ->assertNull('meta.default.subactivity_id') + ->assertNull('meta.default.promised_at') + ->assertJsonPath('meta.default.group_id', $group->id) + ->assertJsonPath('meta.groups.0.id', $group->id) + ->assertJsonPath('meta.activities.0.id', $membership->activity->id) + ->assertJsonPath('meta.activities.0.name', $membership->activity->name) + ->assertJsonPath("meta.subactivities.{$membership->activity_id}.0.id", $membership->subactivity_id) + ->assertJsonPath("meta.subactivities.{$membership->activity_id}.0.name", $membership->subactivity->name) + ->assertJsonPath("meta.subactivities.{$membership->activity_id}.0.is_age_group", true) + ->assertJsonPath('meta.links.store', route('member.membership.store', ['member' => $membership->member])); +}); - #[DataProvider('membershipDataProvider')] - public function testItShowsIfMembershipIsActive(Carbon $from, ?Carbon $to, bool $isActive): void - { - $this->withoutExceptionHandling()->login()->loginNami(); - $member = Member::factory() - ->defaults() - ->has(Membership::factory()->in('€ LeiterIn', 455, 'Pfadfinder', 15)->state(['from' => $from, 'to' => $to])) - ->create(); +it('promised at can be null', function () { + $this->withoutExceptionHandling()->login()->loginNami(); + $member = Member::factory() + ->defaults() + ->has(Membership::factory()->in('€ Mitglied', 122, 'Wölfling', 234)) + ->create(); - $this->get("/member/{$member->id}/membership") - ->assertJsonPath('data.0.is_active', $isActive); - } -} + $this->get("/member/{$member->id}/membership") + ->assertJsonPath('data.0.promised_at', null); +}); + + +it('testItShowsIfMembershipIsActive', function (Carbon $from, ?Carbon $to, bool $isActive) { + $this->withoutExceptionHandling()->login()->loginNami(); + $member = Member::factory() + ->defaults() + ->has(Membership::factory()->in('€ LeiterIn', 455, 'Pfadfinder', 15)->state(['from' => $from, 'to' => $to])) + ->create(); + + $this->get("/member/{$member->id}/membership") + ->assertJsonPath('data.0.is_active', $isActive); +})->with([ + [now()->subMonths(2), null, true], + [now()->subMonths(2), now()->subDay(), false], + [now()->addDays(2), null, false], +]); diff --git a/tests/TestCase.php b/tests/TestCase.php index 555f2c4a..dec5fdb2 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -171,5 +171,13 @@ class TestCase extends BaseTestCase return $this; }); + + TestResponse::macro('assertNull', function (string $path) { + /** @var TestResponse */ + $response = $this; + $response->assertHasJsonPath($path)->assertJsonPath($path, null); + + return $this; + }); } }