From 3e27dfb4e720d9ce20cd37bb69e2af6366384307 Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 13:57:22 -0800 Subject: [PATCH 01/13] convert to pest --- composer.json | 8 +- tests/Feature/EventsOffsetTest.php | 87 +-- tests/Feature/IcsControllerTest.php | 251 ++++---- tests/Feature/TagTest.php | 658 +++++++++---------- tests/Pest.php | 45 ++ tests/Unit/DayTest.php | 46 +- tests/Unit/EventFactoryTest.php | 131 ++-- tests/Unit/EventsTest.php | 785 +++++++++++------------ tests/Unit/MultiDayEventsTest.php | 268 ++++---- tests/Unit/RecurringDailyEventsTest.php | 476 ++++++-------- tests/Unit/RecurringEventsTest.php | 112 ++-- tests/Unit/RecurringEveryXEventsTest.php | 400 ++++++------ tests/Unit/SingleDayEventsTest.php | 292 ++++----- 13 files changed, 1657 insertions(+), 1902 deletions(-) create mode 100644 tests/Pest.php diff --git a/composer.json b/composer.json index 5002b64..32c6fa2 100644 --- a/composer.json +++ b/composer.json @@ -45,9 +45,10 @@ }, "require-dev": { "mockery/mockery": "^1.3.1", - "nunomaduro/collision": "^6.0 || ^7.0", - "phpunit/phpunit": "^9.0 || ^10.0", - "orchestra/testbench": "^7.0 || ^8.0", + "nunomaduro/collision": "^6.0 || ^7.0 || ^8.0", + "pestphp/pest-plugin-drift": "^3.0", + "phpunit/phpunit": "^9.0 || ^10.0 || ^11.0", + "orchestra/testbench": "^7.0 || ^8.0 || ^9.0", "spatie/laravel-ray": "^1.35", "spatie/test-time": "^1.2" }, @@ -56,6 +57,7 @@ "preferred-install": "dist", "sort-packages": true, "allow-plugins": { + "pestphp/pest-plugin": true, "pixelfear/composer-dist-plugin": true } }, diff --git a/tests/Feature/EventsOffsetTest.php b/tests/Feature/EventsOffsetTest.php index d947ef1..a48893a 100644 --- a/tests/Feature/EventsOffsetTest.php +++ b/tests/Feature/EventsOffsetTest.php @@ -1,43 +1,31 @@ collection('events') - ->slug('recurring-event') - ->id('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - 'categories' => ['one'], - ])->save(); - - $this->tag = app(Events::class); - } - - /** @test */ - public function canOffsetUpcomingOccurrences() - { + +uses(\TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk::class); + +beforeEach(function () { + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->id('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + 'categories' => ['one'], + ])->save(); + + $this->tag = app(Events::class); +}); + +test('can offset upcoming occurrences', function () { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); $this->tag @@ -50,12 +38,10 @@ public function canOffsetUpcomingOccurrences() $occurrences = $this->tag->upcoming(); - $this->assertCount(3, $occurrences); - } + expect($occurrences)->toHaveCount(3); +}); - /** @test */ - public function canOffsetBetweenOccurrences() - { +test('can offset between occurrences', function () { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); $this->tag->setContext([]) @@ -68,12 +54,10 @@ public function canOffsetBetweenOccurrences() $occurrences = $this->tag->between(); - $this->assertCount(2, $occurrences); - } + expect($occurrences)->toHaveCount(2); +}); - /** @test */ - public function canOffsetTodayOccurrences() - { +test('can offset today occurrences', function () { Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); Entry::make() @@ -92,7 +76,7 @@ public function canOffsetTodayOccurrences() 'offset' => 1, ]); - $this->assertCount(1, $this->tag->today()); + expect($this->tag->today())->toHaveCount(1); $this->tag->setContext([]) ->setParameters([ @@ -101,12 +85,10 @@ public function canOffsetTodayOccurrences() 'offset' => 1, ]); - $this->assertCount(0, $this->tag->today()); - } + expect($this->tag->today())->toHaveCount(0); +}); - /** @test */ - public function canOffsetSingleDayOccurrences() - { +test('can offset single day occurrences', function () { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); $this->tag->setContext([]) @@ -115,6 +97,5 @@ public function canOffsetSingleDayOccurrences() 'offset' => 1, ]); - $this->assertCount(0, $this->tag->today()); - } -} + expect($this->tag->today())->toHaveCount(0); +}); \ No newline at end of file diff --git a/tests/Feature/IcsControllerTest.php b/tests/Feature/IcsControllerTest.php index 3dcf1ec..708a29b 100755 --- a/tests/Feature/IcsControllerTest.php +++ b/tests/Feature/IcsControllerTest.php @@ -1,140 +1,121 @@ collection('events') - ->slug('single-event') - ->id('the-id') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'location' => 'The Location', - ])->save(); - } - - /** @test */ - public function canCreateSingleDayEventIcsFile() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $response = $this->get(route('statamic.events.ics.show', [ - 'date' => now()->toDateString(), - 'event' => 'the-id', - ]))->assertDownload('single-event.ics'); - - $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); - $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); - } - - /** @test */ - public function canCreateSingleDayRecurringEventIcsFile() - { - Carbon::setTestNow(now()->addDay()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->id('the-recurring-id') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - ])->save(); - - $response = $this->get(route('statamic.events.ics.show', [ - 'date' => now()->toDateString(), - 'event' => 'the-recurring-id', - ]))->assertDownload('recurring-event.ics'); - - $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'the-recurring-id', - ]))->assertStatus(404); - } - - /** @test */ - public function canCreateSingleDayMultidayEventIcsFile() - { - Carbon::setTestNow(now()); - - $entry = Entry::make() - ->slug('multi-day-event') - ->collection('events') - ->id('the-multi-day-event') - ->data([ - 'title' => 'Multi-day Event', - 'multi_day' => true, - 'days' => [ - [ - 'date' => now()->toDateString(), - 'start_time' => '19:00', - 'end_time' => '21:00', - ], - [ - 'date' => now()->addDay()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '15:00', - ], - [ - 'date' => now()->addDays(2)->toDateString(), - 'start_time' => '11:00', - 'end_time' => '15:00', - ], + +uses(\TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk::class); + +beforeEach(function () { + Entry::make() + ->collection('events') + ->slug('single-event') + ->id('the-id') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'location' => 'The Location', + ])->save(); +}); + +test('can create single day event ics file', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $response = $this->get(route('statamic.events.ics.show', [ + 'date' => now()->toDateString(), + 'event' => 'the-id', + ]))->assertDownload('single-event.ics'); + + $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); + $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); +}); + +test('can create single day recurring event ics file', function () { + Carbon::setTestNow(now()->addDay()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->id('the-recurring-id') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + ])->save(); + + $response = $this->get(route('statamic.events.ics.show', [ + 'date' => now()->toDateString(), + 'event' => 'the-recurring-id', + ]))->assertDownload('recurring-event.ics'); + + $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'the-recurring-id', + ]))->assertStatus(404); +}); + +test('can create single day multiday event ics file', function () { + Carbon::setTestNow(now()); + + $entry = Entry::make() + ->slug('multi-day-event') + ->collection('events') + ->id('the-multi-day-event') + ->data([ + 'title' => 'Multi-day Event', + 'multi_day' => true, + 'days' => [ + [ + 'date' => now()->toDateString(), + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => now()->addDay()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', + ], + [ + 'date' => now()->addDays(2)->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', ], - ])->save(); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDays(3)->toDateString(), - 'event' => 'the-multi-day-event', - ]))->assertStatus(404); - - $response = $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'the-multi-day-event', - ]))->assertDownload('multi-day-event.ics'); - - $this->assertStringContainsString('DTSTART:'.now()->addDay()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); - } - - /** @test */ - public function throws404ErrorWhenEventDoesNotOccurOnDate() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'the-id', - ]))->assertStatus(404); - } - - /** @test */ - public function throws404ErrorWhenEventDoesNotExist() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'does-not-exist', - ]))->assertStatus(404); - } -} + ], + ])->save(); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDays(3)->toDateString(), + 'event' => 'the-multi-day-event', + ]))->assertStatus(404); + + $response = $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'the-multi-day-event', + ]))->assertDownload('multi-day-event.ics'); + + $this->assertStringContainsString('DTSTART:'.now()->addDay()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); +}); + +test('throws404 error when event does not occur on date', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'the-id', + ]))->assertStatus(404); +}); + +test('throws404 error when event does not exist', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'does-not-exist', + ]))->assertStatus(404); +}); \ No newline at end of file diff --git a/tests/Feature/TagTest.php b/tests/Feature/TagTest.php index 141199d..a887366 100755 --- a/tests/Feature/TagTest.php +++ b/tests/Feature/TagTest.php @@ -1,355 +1,317 @@ collection('events') - ->slug('recurring-event') - ->id('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - 'categories' => ['one'], - ])->save(); - - $this->tag = app(Events::class); - } - - /** @test */ - public function canGenerateBetweenOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'from' => Carbon::now(), - 'to' => Carbon::now()->addWeek(3), - ]); - - $occurrences = $this->tag->between(); - - $this->assertCount(4, $occurrences); - } - - /** @test */ - public function canGenerateBetweenOccurrencesWithDefaultFrom() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'to' => Carbon::now()->addWeeks(3), - ]); - - $occurrences = $this->tag->between(); - - $this->assertCount(4, $occurrences); - } - - /** @test */ - public function canGenerateCalendarOccurrences() - { - Carbon::setTestNow('jan 1, 2022 10:00'); - - Entry::all()->each->delete(); - - Entry::make() - ->collection('events') - ->slug('single-event-start-of-month') - ->data([ - 'title' => 'Single Event - Start of Month', - 'start_date' => Carbon::now()->startOfMonth()->toDateString(), - 'start_time' => '13:00', - 'end_time' => '15:00', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('recurring-event-start-of-month') - ->data([ - 'title' => 'Recurring Event - Start of Month', - 'start_date' => Carbon::now()->startOfMonth()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - 'categories' => ['one'], - ])->save(); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'month' => now()->englishMonth, - 'year' => now()->year, - ]); - - $occurrences = $this->tag->calendar(); - - $this->assertCount(42, $occurrences); - $this->assertCount(2, Arr::get($occurrences, '6.dates')); - $this->assertTrue(Arr::get($occurrences, '7.no_results')); - $this->assertCount(1, Arr::get($occurrences, '13.dates')); - } - - /** @test */ - public function canGenerateInOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'next' => '3 weeks', - ]); - - $occurrences = $this->tag->in(); - - $this->assertCount(4, $occurrences); - } - - /** @test */ - public function canGenerateTodayOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '13:00', - 'end_time' => '15:00', - ])->save(); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - ]); - - $this->assertCount(2, $this->tag->today()); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'ignore_finished' => true, - ]); - - $this->assertCount(1, $this->tag->today()); - } - - /** @test */ - public function canGenerateUpcomingOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'limit' => 3, - ]); - - $occurrences = $this->tag->upcoming(); - - $this->assertCount(3, $occurrences); - } - - /** @test */ - public function canGenerateUpcomingLimitedOccurrences() - { - Entry::make() - ->collection('events') - ->slug('another-recurring-event') - ->id('another-recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'limit' => 3, - ]); - - $occurrences = $this->tag->upcoming(); - - $this->assertCount(3, $occurrences); - } - - /** @test */ - public function canPaginateUpcomingOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'paginate' => 2, - 'limit' => 10, - ]); - - Cascade::partialMock()->shouldReceive('get') - ->with('uri') - ->andReturn('/events'); - - $pagination = $this->tag->upcoming(); - - $this->assertArrayHasKey('results', $pagination); - $this->assertArrayHasKey('paginate', $pagination); - $this->assertArrayHasKey('total_results', $pagination); - - $this->assertCount(2, $pagination['results']); - $this->assertEquals(2, $pagination['total_results']); - $this->assertEquals('/events?page=2', $pagination['paginate']['next_page']); - } - - /** @test */ - public function canGenerateUpcomingOccurrencesWithTaxonomyTerms() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->id('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '17:00', - 'end_time' => '19:00', - ])->save(); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'from' => Carbon::now()->toDateString(), - 'to' => Carbon::now()->addDay()->toDateString(), - 'taxonomy:categories' => 'one', - ]); - - $occurrences = $this->tag->between(); - - $this->assertCount(1, $occurrences); - } - - /** @test */ - public function canGenerateUpcomingOccurrencesWithFilter() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->id('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '17:00', - 'end_time' => '19:00', - ])->save(); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'from' => Carbon::now()->toDateString(), - 'to' => Carbon::now()->addDay()->toDateString(), - 'title:contains' => 'Single', - ]); - - $occurrences = $this->tag->between(); - - $this->assertCount(1, $occurrences); - } - - /** @test */ - public function canGenerateDateEventDownloadLink() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'date' => now(), - 'event' => 'recurring-event', - ]); - - $url = $this->tag->downloadLink(); - - $this->assertEquals('http://localhost/!/events/ics?collection=events&date='.now()->toDateString().'&event=recurring-event', $url); - } - - /** @test */ - public function canGenerateEventDownloadLink() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'event' => 'recurring-event', - ]); - - $url = $this->tag->downloadLink(); - - $this->assertEquals('http://localhost/!/events/ics?collection=events&event=recurring-event', $url); - } - - /** @test */ - public function canSortOccurrencesDesc() - { - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'limit' => 3, - 'sort' => 'desc', - ]); - - $occurrences = $this->tag->upcoming(); - - $this->assertTrue($occurrences[0]->start->isAfter($occurrences[1]->start)); - $this->assertTrue($occurrences[1]->start->isAfter($occurrences[2]->start)); - } -} + +uses(\TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk::class); + +beforeEach(function () { + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->id('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + 'categories' => ['one'], + ])->save(); + + $this->tag = app(Events::class); +}); + +test('can generate between occurrences', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'from' => Carbon::now(), + 'to' => Carbon::now()->addWeek(3), + ]); + + $occurrences = $this->tag->between(); + + expect($occurrences)->toHaveCount(4); +}); + +test('can generate between occurrences with default from', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'to' => Carbon::now()->addWeeks(3), + ]); + + $occurrences = $this->tag->between(); + + expect($occurrences)->toHaveCount(4); +}); + +test('can generate calendar occurrences', function () { + Carbon::setTestNow('jan 1, 2022 10:00'); + + Entry::all()->each->delete(); + + Entry::make() + ->collection('events') + ->slug('single-event-start-of-month') + ->data([ + 'title' => 'Single Event - Start of Month', + 'start_date' => Carbon::now()->startOfMonth()->toDateString(), + 'start_time' => '13:00', + 'end_time' => '15:00', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('recurring-event-start-of-month') + ->data([ + 'title' => 'Recurring Event - Start of Month', + 'start_date' => Carbon::now()->startOfMonth()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + 'categories' => ['one'], + ])->save(); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'month' => now()->englishMonth, + 'year' => now()->year, + ]); + + $occurrences = $this->tag->calendar(); + + expect($occurrences)->toHaveCount(42); + expect(Arr::get($occurrences, '6.dates'))->toHaveCount(2); + expect(Arr::get($occurrences, '7.no_results'))->toBeTrue(); + expect(Arr::get($occurrences, '13.dates'))->toHaveCount(1); +}); + +test('can generate in occurrences', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'next' => '3 weeks', + ]); + + $occurrences = $this->tag->in(); + + expect($occurrences)->toHaveCount(4); +}); + +test('can generate today occurrences', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '13:00', + 'end_time' => '15:00', + ])->save(); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + ]); + + expect($this->tag->today())->toHaveCount(2); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'ignore_finished' => true, + ]); + + expect($this->tag->today())->toHaveCount(1); +}); + +test('can generate upcoming occurrences', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'limit' => 3, + ]); + + $occurrences = $this->tag->upcoming(); + + expect($occurrences)->toHaveCount(3); +}); + +test('can generate upcoming limited occurrences', function () { + Entry::make() + ->collection('events') + ->slug('another-recurring-event') + ->id('another-recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'limit' => 3, + ]); + + $occurrences = $this->tag->upcoming(); + + expect($occurrences)->toHaveCount(3); +}); + +test('can paginate upcoming occurrences', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'paginate' => 2, + 'limit' => 10, + ]); + + Cascade::partialMock()->shouldReceive('get') + ->with('uri') + ->andReturn('/events'); + + $pagination = $this->tag->upcoming(); + + expect($pagination)->toHaveKey('results'); + expect($pagination)->toHaveKey('paginate'); + expect($pagination)->toHaveKey('total_results'); + + expect($pagination['results'])->toHaveCount(2); + expect($pagination['total_results'])->toEqual(2); + expect($pagination['paginate']['next_page'])->toEqual('/events?page=2'); +}); + +test('can generate upcoming occurrences with taxonomy terms', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->id('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '17:00', + 'end_time' => '19:00', + ])->save(); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'from' => Carbon::now()->toDateString(), + 'to' => Carbon::now()->addDay()->toDateString(), + 'taxonomy:categories' => 'one', + ]); + + $occurrences = $this->tag->between(); + + expect($occurrences)->toHaveCount(1); +}); + +test('can generate upcoming occurrences with filter', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->id('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '17:00', + 'end_time' => '19:00', + ])->save(); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'from' => Carbon::now()->toDateString(), + 'to' => Carbon::now()->addDay()->toDateString(), + 'title:contains' => 'Single', + ]); + + $occurrences = $this->tag->between(); + + expect($occurrences)->toHaveCount(1); +}); + +test('can generate date event download link', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'date' => now(), + 'event' => 'recurring-event', + ]); + + $url = $this->tag->downloadLink(); + + expect($url)->toEqual('http://localhost/!/events/ics?collection=events&date='.now()->toDateString().'&event=recurring-event'); +}); + +test('can generate event download link', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'event' => 'recurring-event', + ]); + + $url = $this->tag->downloadLink(); + + expect($url)->toEqual('http://localhost/!/events/ics?collection=events&event=recurring-event'); +}); + +test('can sort occurrences desc', function () { + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'limit' => 3, + 'sort' => 'desc', + ]); + + $occurrences = $this->tag->upcoming(); + + expect($occurrences[0]->start->isAfter($occurrences[1]->start))->toBeTrue(); + expect($occurrences[1]->start->isAfter($occurrences[2]->start))->toBeTrue(); +}); \ No newline at end of file diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000..fd279ad --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,45 @@ +extend(Tests\TestCase::class)->in('Feature'); + +/* +|-------------------------------------------------------------------------- +| Expectations +|-------------------------------------------------------------------------- +| +| When you're writing tests, you often need to check that values meet certain conditions. The +| "expect()" function gives you access to a set of "expectations" methods that you can use +| to assert different things. Of course, you may extend the Expectation API at any time. +| +*/ + +expect()->extend('toBeOne', function () { + return $this->toBe(1); +}); + +/* +|-------------------------------------------------------------------------- +| Functions +|-------------------------------------------------------------------------- +| +| While Pest is very powerful out-of-the-box, you may have some testing code specific to your +| project that you don't want to repeat in every file. Here you can also expose helpers as +| global functions to help you to reduce the number of lines of code in your test files. +| +*/ + +function something() +{ + // .. +} diff --git a/tests/Unit/DayTest.php b/tests/Unit/DayTest.php index 5a5b9d0..d9c2d48 100755 --- a/tests/Unit/DayTest.php +++ b/tests/Unit/DayTest.php @@ -1,39 +1,27 @@ '2019-11-23', - 'start_time' => '19:00', - ]; +test('can get end when no end time', function () { + $dayData = [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + ]; - $day = new Day(data: $dayData, timezone: 'America/Vancouver'); + $day = new Day(data: $dayData, timezone: 'America/Vancouver'); - $this->assertEquals( - Carbon::parse('2019-11-23')->shiftTimezone('America/Vancouver')->endOfDay(), - $day->end() - ); - } + expect($day->end())->toEqual(Carbon::parse('2019-11-23')->shiftTimezone('America/Vancouver')->endOfDay()); +}); - /** @test */ - public function hasNoEndTimeWhenNoEndTime() - { - $dayData = [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - ]; +test('has no end time when no end time', function () { + $dayData = [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + ]; - $day = new Day(data: $dayData, timezone: 'America/Vancouver'); + $day = new Day(data: $dayData, timezone: 'America/Vancouver'); - $this->assertFalse($day->hasEndTime()); - } -} + expect($day->hasEndTime())->toBeFalse(); +}); diff --git a/tests/Unit/EventFactoryTest.php b/tests/Unit/EventFactoryTest.php index 3986c1e..a11d30a 100755 --- a/tests/Unit/EventFactoryTest.php +++ b/tests/Unit/EventFactoryTest.php @@ -1,97 +1,80 @@ collection('events') - ->data($data); - $this->assertEquals($class, EventFactory::getTypeClass($entry)); - } +test('can get event type class', function (string $class, array $data) { + $entry = Entry::make() + ->collection('events') + ->data($data); + + expect(EventFactory::getTypeClass($entry))->toEqual($class); +})->with('provideEventData'); - /** - * @test - * - * @dataProvider provideEventData - */ - public function canCreateCorrectEventType(string $class, array $data) - { - $entry = Entry::make() - ->collection('events') - ->data($data); +test('can create correct event type', function (string $class, array $data) { + $entry = Entry::make() + ->collection('events') + ->data($data); - $this->assertInstanceOf($class, EventFactory::createFromEntry($entry)); - } + expect(EventFactory::createFromEntry($entry))->toBeInstanceOf($class); +})->with('provideEventData'); - public static function provideEventData() - { - return [ +dataset('provideEventData', function () { + return [ + [ + SingleDayEvent::class, [ - SingleDayEvent::class, - [ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'timezone' => 'America/Vancouver', - ], + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'timezone' => 'America/Vancouver', ], + ], + [ + SingleDayEvent::class, [ - SingleDayEvent::class, - [ - 'multi_day' => true, - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'timezone' => 'America/Vancouver', - ], + 'multi_day' => true, + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'timezone' => 'America/Vancouver', ], + ], + [ + RecurringEvent::class, [ - RecurringEvent::class, - [ - 'start_date' => Carbon::now()->toDateString(), - 'end_date' => Carbon::now()->addWeek()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'timezone' => 'America/Vancouver', - ], + 'start_date' => Carbon::now()->toDateString(), + 'end_date' => Carbon::now()->addWeek()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'timezone' => 'America/Vancouver', ], + ], + [ + MultiDayEvent::class, [ - MultiDayEvent::class, - [ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - 'end_time' => '21:00', - ], - [ - 'date' => '2019-11-24', - 'start_time' => '11:00', - 'end_time' => '15:00', - ], + 'recurrence' => 'multi_day', + 'days' => [ + [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => '2019-11-24', + 'start_time' => '11:00', + 'end_time' => '15:00', ], - 'timezone' => 'America/Vancouver', ], + 'timezone' => 'America/Vancouver', ], - ]; - } -} + ], + ]; +}); diff --git a/tests/Unit/EventsTest.php b/tests/Unit/EventsTest.php index c927612..699f5b0 100755 --- a/tests/Unit/EventsTest.php +++ b/tests/Unit/EventsTest.php @@ -1,416 +1,387 @@ setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'end_date' => Carbon::now()->addDays(2)->toDateString(), - 'recurrence' => 'daily', - ])->save(); - - $event = tap(Entry::make() - ->collection('events') - ->slug('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '13:00', - ]))->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(now(), now()->addDays(2)->endOfDay()); - - $expectedStartDates = [ - now()->setTimeFromTimeString('11:00'), - now()->setTimeFromTimeString('13:00'), - now()->addDay()->setTimeFromTimeString('11:00'), - now()->addDays(2)->setTimeFromTimeString('11:00'), - ]; - $this->assertCount(4, $occurrences); - - $this->assertEquals($expectedStartDates[0], $occurrences[0]->start); - $this->assertEquals($expectedStartDates[1], $occurrences[1]->start); - $this->assertEquals($expectedStartDates[2], $occurrences[2]->start); - $this->assertEquals($expectedStartDates[3], $occurrences[3]->start); - } - - /** @test */ - public function canPaginateUpcomingOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->upcoming(10); - - $this->assertCount(10, $occurrences); - $paginator = Events::fromCollection(handle: 'events') - ->pagination(perPage: 2) - ->upcoming(10); - - $this->assertInstanceOf(LengthAwarePaginator::class, $paginator); - $this->assertCount(2, $occurrences = $paginator->items()); - $this->assertEquals(now()->addDay()->setTimeFromTimeString('11:00'), $paginator->items()[1]->start); - - $paginator = Events::fromCollection(handle: 'events') - ->pagination(perPage: 3, page: 3) - ->upcoming(10); - - $this->assertInstanceOf(LengthAwarePaginator::class, $paginator); - $this->assertCount(3, $occurrences = $paginator->items()); - $this->assertEquals(3, $paginator->currentPage()); - } - - /** @test */ - public function canPaginateOccurrencesBetween() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(now(), now()->addDays(9)->endOfDay()); - - $this->assertCount(10, $occurrences); - $paginator = Events::fromCollection(handle: 'events') - ->pagination(perPage: 2) - ->between(now(), now()->addDays(9)->endOfDay()); - - $this->assertInstanceOf(LengthAwarePaginator::class, $paginator); - - $this->assertCount(2, $occurrences = $paginator->items()); - - $this->assertEquals(now()->addDay()->setTimeFromTimeString('11:00'), $paginator->items()[1]->start); - } - - /** @test */ - public function canFilterEvents() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->filter('title:contains', 'Other') - ->between(now(), now()->addDays(9)->endOfDay()); - - $this->assertCount(10, $occurrences); - } - - /** @test */ - public function canFilterMultipleEvents() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event 2', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->filter('title:contains', 'Other') - ->filter('recurrence:is', 'daily') - ->between(now(), now()->addDays(9)->endOfDay()); - - $this->assertCount(10, $occurrences); - } - - /** @test */ - public function canFilterByTermEvents() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'categories' => ['one'], - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'categories' => ['two'], - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->terms('categories::two') - ->between(now(), now()->addDays(9)->endOfDay()); - - $this->assertCount(10, $occurrences); - } - - /** @test */ - public function canFilterByFilterEvents() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->filter('title:contains', 'Recurring') - ->between(now(), now()->addDays(9)->endOfDay()); - - $this->assertCount(10, $occurrences); - } - - /** @test */ - public function canDetermineOccursAtForSingleEvent() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $entry = Entry::make() - ->collection('events') - ->slug('single-event') - ->id('the-id') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - ]); - - $event = EventFactory::createFromEntry($entry); - - $this->assertTrue($event->occursOnDate(now())); - } - - /** @test */ - public function canDetermineOccursAtForMultidayEvent() - { - Carbon::setTestNow(now()); - - $entry = Entry::make() - ->slug('multi-day-event') - ->collection('events') - ->data([ - 'multi_day' => true, - 'days' => [ - [ - 'date' => now()->toDateString(), - 'start_time' => '19:00', - 'end_time' => '21:00', - ], - [ - 'date' => now()->addDay()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '15:00', - ], - [ - 'date' => now()->addDays(2)->toDateString(), - 'start_time' => '11:00', - 'end_time' => '15:00', - ], + +test('can generate dates when now before start', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'end_date' => Carbon::now()->addDays(2)->toDateString(), + 'recurrence' => 'daily', + ])->save(); + + $event = tap(Entry::make() + ->collection('events') + ->slug('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '13:00', + ]))->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(now(), now()->addDays(2)->endOfDay()); + + $expectedStartDates = [ + now()->setTimeFromTimeString('11:00'), + now()->setTimeFromTimeString('13:00'), + now()->addDay()->setTimeFromTimeString('11:00'), + now()->addDays(2)->setTimeFromTimeString('11:00'), + ]; + expect($occurrences)->toHaveCount(4); + + expect($occurrences[0]->start)->toEqual($expectedStartDates[0]); + expect($occurrences[1]->start)->toEqual($expectedStartDates[1]); + expect($occurrences[2]->start)->toEqual($expectedStartDates[2]); + expect($occurrences[3]->start)->toEqual($expectedStartDates[3]); +}); + +test('can paginate upcoming occurrences', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->upcoming(10); + + expect($occurrences)->toHaveCount(10); + $paginator = Events::fromCollection(handle: 'events') + ->pagination(perPage: 2) + ->upcoming(10); + + expect($paginator)->toBeInstanceOf(LengthAwarePaginator::class); + expect($occurrences = $paginator->items())->toHaveCount(2); + expect($paginator->items()[1]->start)->toEqual(now()->addDay()->setTimeFromTimeString('11:00')); + + $paginator = Events::fromCollection(handle: 'events') + ->pagination(perPage: 3, page: 3) + ->upcoming(10); + + expect($paginator)->toBeInstanceOf(LengthAwarePaginator::class); + expect($occurrences = $paginator->items())->toHaveCount(3); + expect($paginator->currentPage())->toEqual(3); +}); + +test('can paginate occurrences between', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(now(), now()->addDays(9)->endOfDay()); + + expect($occurrences)->toHaveCount(10); + $paginator = Events::fromCollection(handle: 'events') + ->pagination(perPage: 2) + ->between(now(), now()->addDays(9)->endOfDay()); + + expect($paginator)->toBeInstanceOf(LengthAwarePaginator::class); + + expect($occurrences = $paginator->items())->toHaveCount(2); + + expect($paginator->items()[1]->start)->toEqual(now()->addDay()->setTimeFromTimeString('11:00')); +}); + +test('can filter events', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->filter('title:contains', 'Other') + ->between(now(), now()->addDays(9)->endOfDay()); + + expect($occurrences)->toHaveCount(10); +}); + +test('can filter multiple events', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event 2', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->filter('title:contains', 'Other') + ->filter('recurrence:is', 'daily') + ->between(now(), now()->addDays(9)->endOfDay()); + + expect($occurrences)->toHaveCount(10); +}); + +test('can filter by term events', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'categories' => ['one'], + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'categories' => ['two'], + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->terms('categories::two') + ->between(now(), now()->addDays(9)->endOfDay()); + + expect($occurrences)->toHaveCount(10); +}); + +test('can filter by filter events', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->filter('title:contains', 'Recurring') + ->between(now(), now()->addDays(9)->endOfDay()); + + expect($occurrences)->toHaveCount(10); +}); + +test('can determine occurs at for single event', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $entry = Entry::make() + ->collection('events') + ->slug('single-event') + ->id('the-id') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + ]); + + $event = EventFactory::createFromEntry($entry); + + expect($event->occursOnDate(now()))->toBeTrue(); +}); + +test('can determine occurs at for multiday event', function () { + Carbon::setTestNow(now()); + + $entry = Entry::make() + ->slug('multi-day-event') + ->collection('events') + ->data([ + 'multi_day' => true, + 'days' => [ + [ + 'date' => now()->toDateString(), + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => now()->addDay()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', ], - ]); - - $event = EventFactory::createFromEntry($entry); - - $this->assertFalse($event->occursOnDate(now()->subDay())); - $this->assertTrue($event->occursOnDate(now())); - $this->assertTrue($event->occursOnDate(now()->addDay())); - $this->assertTrue($event->occursOnDate(now()->addDays(2))); - $this->assertFalse($event->occursOnDate(now()->addDays(3))); - } - - /** @test */ - public function canExcludeDates() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'exclude_dates' => [['date' => Carbon::now()->addDay()->toDateString()]], - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(now(), now()->addDays(3)->endOfDay()); - - $this->assertCount(3, $occurrences); - } - - /** @test */ - public function canHandleEmptyExcludeDates() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'exclude_dates' => [['id' => 'random-id']], - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(now(), now()->addDays(3)->endOfDay()); - - $this->assertCount(4, $occurrences); - } - - /** @test */ - public function canFilterOurEventsWithNoStartDate() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->data([ - 'title' => 'Single Event', - 'start_time' => '11:00', - 'end_time' => '12:00', - ])->save(); - Entry::make() - ->collection('events') - ->slug('legacy-multi-day-event') - ->data([ - 'title' => 'Legacy Multi-day Event', - 'multi_day' => true, - 'days' => [ - ['date' => 'bad-date'], + [ + 'date' => now()->addDays(2)->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', ], - ])->save(); - Entry::make() - ->collection('events') - ->slug('legacy-multi-day-event-2') - ->data([ - 'title' => 'Legacy Multi-day Event', - 'multi_day' => true, - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->upcoming(5); - - $this->assertEmpty($occurrences); - } -} + ], + ]); + + $event = EventFactory::createFromEntry($entry); + + expect($event->occursOnDate(now()->subDay()))->toBeFalse(); + expect($event->occursOnDate(now()))->toBeTrue(); + expect($event->occursOnDate(now()->addDay()))->toBeTrue(); + expect($event->occursOnDate(now()->addDays(2)))->toBeTrue(); + expect($event->occursOnDate(now()->addDays(3)))->toBeFalse(); +}); + +test('can exclude dates', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'exclude_dates' => [['date' => Carbon::now()->addDay()->toDateString()]], + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(now(), now()->addDays(3)->endOfDay()); + + expect($occurrences)->toHaveCount(3); +}); + +test('can handle empty exclude dates', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'exclude_dates' => [['id' => 'random-id']], + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(now(), now()->addDays(3)->endOfDay()); + + expect($occurrences)->toHaveCount(4); +}); + +test('can filter our events with no start date', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->data([ + 'title' => 'Single Event', + 'start_time' => '11:00', + 'end_time' => '12:00', + ])->save(); + Entry::make() + ->collection('events') + ->slug('legacy-multi-day-event') + ->data([ + 'title' => 'Legacy Multi-day Event', + 'multi_day' => true, + 'days' => [ + ['date' => 'bad-date'], + ], + ])->save(); + Entry::make() + ->collection('events') + ->slug('legacy-multi-day-event-2') + ->data([ + 'title' => 'Legacy Multi-day Event', + 'multi_day' => true, + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->upcoming(5); + + expect($occurrences)->toBeEmpty(); +}); diff --git a/tests/Unit/MultiDayEventsTest.php b/tests/Unit/MultiDayEventsTest.php index 57605e2..dc5d6d8 100755 --- a/tests/Unit/MultiDayEventsTest.php +++ b/tests/Unit/MultiDayEventsTest.php @@ -1,169 +1,121 @@ slug('multi-day-event') - ->collection('events') - ->data([ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - 'end_time' => '21:00', - ], - [ - 'date' => '2019-11-24', - 'start_time' => '11:00', - 'end_time' => '15:00', - ], - [ - 'date' => '2019-11-25', - 'start_time' => '11:00', - 'end_time' => '15:00', - ], + +beforeEach(function () { + Carbon::setTestNowAndTimezone(now(), 'America/Vancouver'); + + $entry = Entry::make() + ->slug('multi-day-event') + ->collection('events') + ->data([ + 'recurrence' => 'multi_day', + 'days' => [ + [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => '2019-11-24', + 'start_time' => '11:00', + 'end_time' => '15:00', + ], + [ + 'date' => '2019-11-25', + 'start_time' => '11:00', + 'end_time' => '15:00', + ], + ], + 'timezone' => 'America/Vancouver', + ]); + + $this->event = EventFactory::createFromEntry($entry); + + $noEndTimeEntry = Entry::make() + ->collection('events') + ->slug('no-end-time') + ->data([ + 'recurrence' => 'multi_day', + 'days' => [ + [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + ], + [ + 'date' => '2019-11-24', + 'start_time' => '15:00', ], - 'timezone' => 'America/Vancouver', - ]); - - $this->event = EventFactory::createFromEntry($entry); - - $noEndTimeEntry = Entry::make() - ->collection('events') - ->slug('no-end-time') - ->data([ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - ], - [ - 'date' => '2019-11-24', - 'start_time' => '15:00', - ], + ], + 'timezone' => 'America/Vancouver', + ]); + + $this->noEndTimeEvent = EventFactory::createFromEntry($noEndTimeEntry); + + $allDayEntry = Entry::make() + ->collection('events') + ->data([ + 'recurrence' => 'multi_day', + 'days' => [ + [ + 'date' => '2019-11-20', ], - 'timezone' => 'America/Vancouver', - ]); - - $this->noEndTimeEvent = EventFactory::createFromEntry($noEndTimeEntry); - - $allDayEntry = Entry::make() - ->collection('events') - ->data([ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-20', - ], - [ - 'date' => '2019-11-21', - ], + [ + 'date' => '2019-11-21', ], - 'timezone' => 'America/Vancouver', - ]); - $this->allDayEvent = EventFactory::createFromEntry($allDayEntry); - } - - /** @test */ - public function canCreateMultiDayEvent() - { - $this->assertTrue($this->event instanceof MultiDayEvent); - $this->assertTrue($this->allDayEvent instanceof MultiDayEvent); - $this->assertTrue($this->noEndTimeEvent instanceof MultiDayEvent); - $this->assertTrue($this->event->isMultiDay()); - $this->assertTrue($this->allDayEvent->isMultiDay()); - $this->assertTrue($this->noEndTimeEvent->isMultiDay()); - } - - /** @test */ - public function canGetStart() - { - $this->assertEquals( - Carbon::parse('2019-11-23 19:00')->shiftTimezone('America/Vancouver'), - $this->event->start() - ); - $this->assertEquals( - Carbon::parse('2019-11-20 0:00')->shiftTimezone('America/Vancouver'), - $this->allDayEvent->start() - ); - $this->assertEquals( - Carbon::parse('2019-11-20 0:00')->shiftTimezone('America/Vancouver')->timezone, - $this->event->start()->timezone - ); - } - - /** @test */ - public function noOccurrencesIfNowAfterEndDate() - { - Carbon::setTestNow('2019-11-26'); - $this->assertEmpty($this->event->nextOccurrences(1)); - } - - /** @test */ - public function canGenerateNextOccurrenceIfBefore() - { - Carbon::setTestNowAndTimezone('2019-11-22', 'America/Vancouver'); - - $this->assertEquals( - Carbon::parse('2019-11-23')->setTimeFromTimeString('19:00:00'), - $this->event->nextOccurrences()[0]->start - ); - $this->assertEquals( - Carbon::parse('2019-11-23')->setTimeFromTimeString('21:00'), - $this->event->nextOccurrences()[0]->end - ); - } - - /** @test */ - public function canGenerateNextOccurrenceIfDuring() - { - Carbon::setTestNowAndTimezone('2019-11-24 10:00', 'America/Vancouver'); - $this->assertEquals( - Carbon::parse('2019-11-24')->setTimeFromTimeString('11:00:00'), - $this->event->nextOccurrences()[0]->start - ); - } - - /** @test */ - public function canGenerateICalendar() - { - $this->markTestSkipped('revisit'); - $events = $this->event->toICalendarEvents(); - - dd($events); - } - - /** @test */ - public function dayIsAllDayWhenNoStartAndEndTime() - { - $days = $this->allDayEvent->days(); - - $this->assertTrue($days[0]->isAllDay()); - } -} + ], + 'timezone' => 'America/Vancouver', + ]); + $this->allDayEvent = EventFactory::createFromEntry($allDayEntry); +}); + +test('can create multi day event', function () { + expect($this->event instanceof MultiDayEvent)->toBeTrue(); + expect($this->allDayEvent instanceof MultiDayEvent)->toBeTrue(); + expect($this->noEndTimeEvent instanceof MultiDayEvent)->toBeTrue(); + expect($this->event->isMultiDay())->toBeTrue(); + expect($this->allDayEvent->isMultiDay())->toBeTrue(); + expect($this->noEndTimeEvent->isMultiDay())->toBeTrue(); +}); + +test('can get start', function () { + expect($this->event->start())->toEqual(Carbon::parse('2019-11-23 19:00')->shiftTimezone('America/Vancouver')); + expect($this->allDayEvent->start())->toEqual(Carbon::parse('2019-11-20 0:00')->shiftTimezone('America/Vancouver')); + expect($this->event->start()->timezone)->toEqual(Carbon::parse('2019-11-20 0:00')->shiftTimezone('America/Vancouver')->timezone); +}); + +test('no occurrences if now after end date', function () { + Carbon::setTestNow('2019-11-26'); + expect($this->event->nextOccurrences(1))->toBeEmpty(); +}); + +test('can generate next occurrence if before', function () { + Carbon::setTestNowAndTimezone('2019-11-22', 'America/Vancouver'); + + expect($this->event->nextOccurrences()[0]->start)->toEqual(Carbon::parse('2019-11-23')->setTimeFromTimeString('19:00:00')); + expect($this->event->nextOccurrences()[0]->end)->toEqual(Carbon::parse('2019-11-23')->setTimeFromTimeString('21:00')); +}); + +test('can generate next occurrence if during', function () { + Carbon::setTestNowAndTimezone('2019-11-24 10:00', 'America/Vancouver'); + expect($this->event->nextOccurrences()[0]->start)->toEqual(Carbon::parse('2019-11-24')->setTimeFromTimeString('11:00:00')); +}); + +test('can generate icalendar', function () { + $this->markTestSkipped('revisit'); + $events = $this->event->toICalendarEvents(); + + dd($events); +}); + +test('day is all day when no start and end time', function () { + $days = $this->allDayEvent->days(); + + expect($days[0]->isAllDay())->toBeTrue(); +}); \ No newline at end of file diff --git a/tests/Unit/RecurringDailyEventsTest.php b/tests/Unit/RecurringDailyEventsTest.php index a6b905e..6487576 100755 --- a/tests/Unit/RecurringDailyEventsTest.php +++ b/tests/Unit/RecurringDailyEventsTest.php @@ -1,274 +1,216 @@ collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'end_date' => Carbon::now()->addDays(2)->toDateString(), - 'recurrence' => 'daily', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow(now()->addDays(3)); - $nextOccurrences = $event->nextOccurrences(); - - $this->assertEmpty($nextOccurrences); - } - - /** @test */ - public function canGenerateNextDayIfNowIsBefore() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow($startDate->setTimeFromTimeString('10:59:00')); - - $nextOccurrences = $event->nextOccurrences(3); - - $this->assertCount(3, $nextOccurrences); - - $this->assertEquals($startDate, $nextOccurrences->first()->start); - } - - /** @test */ - public function canGenerateNextOccurrenceIfNowIsDuring() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ]); - - Carbon::setTestNow($startDate->addMinutes(10)); - - $event = EventFactory::createFromEntry($recurringEntry); - $nextOccurrences = $event->nextOccurrences(); - - $this->assertEquals($startDate, $nextOccurrences[0]->start); - } - - // public function test_can_generate_next_day_if_after() - // { - // $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - - // $event = [ - // 'start_date' => $startDate->toDateString(), - // 'start_time' => '11:00', - // 'end_time' => '12:00', - // 'recurrence' => 'daily', - // ]; - - // Carbon::setTestNow($startDate->addMinute()); - - // $event = EventFactory::createFromArray($event); - - // $nextOccurrences = $event->nextOccurrences(1); - - // $this->assertEquals($startDate->addDay(), $nextDate->start()); - // } - - // public function test_can_generate_next_x_dates_from_today_before_event_time() - // { - // $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); - // $event = EventFactory::createFromArray( - // [ - // 'start_date' => $startDate->toDateString(), - // 'start_time' => '11:00', - // 'end_time' => '12:00', - // 'recurrence' => 'daily', - // ] - // ); - - // for ($x = 0; $x < 2; $x++) { - // $events[] = $startDate->copy()->addDays($x); - // } - - // $this->events->add($event); - - // Carbon::setTestNow($startDate->copy()->subMinutes(1)); - - // $nextDates = $this->events->upcoming(2); - - // $this->assertCount(2, $nextDates); - - // $this->assertEquals($events[0], $nextDates[0]->start()); - // $this->assertEquals($events[1], $nextDates[1]->start()); - // } - - // public function test_can_generate_next_x_dates_from_today() - // { - // $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); - // $event = EventFactory::createFromArray([ - // 'start_date' => $startDate->toDateString(), - // 'start_time' => '11:00', - // 'end_time' => '12:00', - // 'recurrence' => 'daily', - // ]); - - // for ($x = 0; $x < 3; $x++) { - // $events[] = $startDate->copy()->addDays($x); - // } - - // $this->events->add($event); - - // Carbon::setTestNow($startDate->copy()->addMinutes(1)); - - // $nextDates = $this->events->upcoming(3); - - // $this->assertCount(3, $nextDates); - - // $this->assertEquals($events[0], $nextDates[0]->start()); - // $this->assertEquals($events[1], $nextDates[1]->start()); - // $this->assertEquals($events[2], $nextDates[2]->start()); - // } - - // public function test_generates_all_occurrences_when_daily_after_start_date() - // { - // $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); - - // $event = EventFactory::createFromArray( - // [ - // 'start_date' => $startDate->copy()->addDay()->toDateString(), - // 'start_time' => '11:00', - // 'end_time' => '12:00', - // 'end_date' => $startDate->copy()->addDays(3)->toDateString(), - // 'recurrence' => 'daily', - // ] - // ); - - // for ($x = 2; $x <= 3; $x++) { - // $events[] = $startDate->copy()->addDays($x); - // } - - // $this->events->add($event); - - // Carbon::setTestNow($startDate->copy()->addDays(1)->addHour(1)); - // $nextEvents = $this->events->upcoming(3); - - // $this->assertCount(2, $nextEvents); - - // $this->assertEquals($events[0], $nextEvents[0]->start()); - // $this->assertEquals($events[1], $nextEvents[1]->start()); - // } - - // public function test_can_get_last_day_when_before() - // { - // Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); - - // $this->events->add(EventFactory::createFromArray([ - // 'id' => 'daily-event', - // 'start_date' => Carbon::now()->toDateString(), - // 'start_time' => '13:00', - // 'end_time' => '15:00', - // 'recurrence' => 'daily', - // 'end_date' => Carbon::now()->addDays(7)->toDateString(), - // ])); - - // $from = Carbon::now()->addDays(7); - // $to = Carbon::now()->endOfDay()->addDays(10); - - // $events = $this->events->all($from, $to); - - // $this->assertCount(1, $events); - // } - - // public function test_generates_all_daily_occurrences_single_event_from_to() - // { - // Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); - - // $this->events->add(EventFactory::createFromArray([ - // 'id' => 'daily-event', - // 'start_date' => Carbon::now()->toDateString(), - // 'start_time' => '13:00', - // 'end_time' => '15:00', - // 'recurrence' => 'daily', - // 'end_date' => Carbon::now()->addDays(7)->toDateString(), - // ])); - - // $from = Carbon::now()->subDays(1); - // $to = Carbon::now()->endOfDay()->addDays(10); - - // $events = $this->events->all($from, $to); - - // $this->assertCount(8, $events); - // } - - // public function test_generates_all_daily_occurrences_single_event_from_to_without_end_date() - // { - // Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); - - // $this->events->add(EventFactory::createFromArray([ - // 'id' => 'daily-event', - // 'start_date' => Carbon::now()->toDateString(), - // 'start_time' => '13:00', - // 'end_time' => '15:00', - // 'recurrence' => 'daily', - // ])); - - // $from = Carbon::now()->subDays(1); - // $to = Carbon::now()->endOfDay()->addDays(10); - - // $events = $this->events->all($from, $to); - - // $this->assertCount(11, $events); - // } - - // public function test_can_exclude_dates() - // { - // Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); - - // $this->events->add(EventFactory::createFromArray([ - // 'id' => 'daily-event', - // 'start_date' => Carbon::now()->toDateString(), - // 'start_time' => '13:00', - // 'end_time' => '15:00', - // 'recurrence' => 'daily', - // 'except' => [ - // ['date' => Carbon::now()->addDays(2)->toDateString()], - // ['date' => Carbon::now()->addDays(4)->toDateString()], - // ], - // ])); - - // $from = Carbon::now()->subDays(1); - // $to = Carbon::now()->endOfDay()->addDays(5); - - // $events = $this->events->all($from, $to)->toArray(); - - // $this->assertCount(4, $events); - // $this->assertEquals(Carbon::now()->toDateString(), $events[0]['start_date']); - // $this->assertEquals(Carbon::now()->addDays(1)->toDateString(), $events[1]['start_date']); - // $this->assertEquals(Carbon::now()->addDays(3)->toDateString(), $events[2]['start_date']); - // $this->assertEquals(Carbon::now()->addDays(5)->toDateString(), $events[3]['start_date']); - // } -} +test('null next date if now after end date', function () { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'end_date' => Carbon::now()->addDays(2)->toDateString(), + 'recurrence' => 'daily', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow(now()->addDays(3)); + $nextOccurrences = $event->nextOccurrences(); + + expect($nextOccurrences)->toBeEmpty(); +}); + +test('can generate next day if now is before', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow($startDate->setTimeFromTimeString('10:59:00')); + + $nextOccurrences = $event->nextOccurrences(3); + + expect($nextOccurrences)->toHaveCount(3); + + expect($nextOccurrences->first()->start)->toEqual($startDate); +}); + +test('can generate next occurrence if now is during', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ]); + + Carbon::setTestNow($startDate->addMinutes(10)); + + $event = EventFactory::createFromEntry($recurringEntry); + $nextOccurrences = $event->nextOccurrences(); + + expect($nextOccurrences[0]->start)->toEqual($startDate); +}); + +// public function test_can_generate_next_day_if_after() +// { +// $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); +// $event = [ +// 'start_date' => $startDate->toDateString(), +// 'start_time' => '11:00', +// 'end_time' => '12:00', +// 'recurrence' => 'daily', +// ]; +// Carbon::setTestNow($startDate->addMinute()); +// $event = EventFactory::createFromArray($event); +// $nextOccurrences = $event->nextOccurrences(1); +// $this->assertEquals($startDate->addDay(), $nextDate->start()); +// } +// public function test_can_generate_next_x_dates_from_today_before_event_time() +// { +// $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); +// $event = EventFactory::createFromArray( +// [ +// 'start_date' => $startDate->toDateString(), +// 'start_time' => '11:00', +// 'end_time' => '12:00', +// 'recurrence' => 'daily', +// ] +// ); +// for ($x = 0; $x < 2; $x++) { +// $events[] = $startDate->copy()->addDays($x); +// } +// $this->events->add($event); +// Carbon::setTestNow($startDate->copy()->subMinutes(1)); +// $nextDates = $this->events->upcoming(2); +// $this->assertCount(2, $nextDates); +// $this->assertEquals($events[0], $nextDates[0]->start()); +// $this->assertEquals($events[1], $nextDates[1]->start()); +// } +// public function test_can_generate_next_x_dates_from_today() +// { +// $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); +// $event = EventFactory::createFromArray([ +// 'start_date' => $startDate->toDateString(), +// 'start_time' => '11:00', +// 'end_time' => '12:00', +// 'recurrence' => 'daily', +// ]); +// for ($x = 0; $x < 3; $x++) { +// $events[] = $startDate->copy()->addDays($x); +// } +// $this->events->add($event); +// Carbon::setTestNow($startDate->copy()->addMinutes(1)); +// $nextDates = $this->events->upcoming(3); +// $this->assertCount(3, $nextDates); +// $this->assertEquals($events[0], $nextDates[0]->start()); +// $this->assertEquals($events[1], $nextDates[1]->start()); +// $this->assertEquals($events[2], $nextDates[2]->start()); +// } +// public function test_generates_all_occurrences_when_daily_after_start_date() +// { +// $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); +// $event = EventFactory::createFromArray( +// [ +// 'start_date' => $startDate->copy()->addDay()->toDateString(), +// 'start_time' => '11:00', +// 'end_time' => '12:00', +// 'end_date' => $startDate->copy()->addDays(3)->toDateString(), +// 'recurrence' => 'daily', +// ] +// ); +// for ($x = 2; $x <= 3; $x++) { +// $events[] = $startDate->copy()->addDays($x); +// } +// $this->events->add($event); +// Carbon::setTestNow($startDate->copy()->addDays(1)->addHour(1)); +// $nextEvents = $this->events->upcoming(3); +// $this->assertCount(2, $nextEvents); +// $this->assertEquals($events[0], $nextEvents[0]->start()); +// $this->assertEquals($events[1], $nextEvents[1]->start()); +// } +// public function test_can_get_last_day_when_before() +// { +// Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); +// $this->events->add(EventFactory::createFromArray([ +// 'id' => 'daily-event', +// 'start_date' => Carbon::now()->toDateString(), +// 'start_time' => '13:00', +// 'end_time' => '15:00', +// 'recurrence' => 'daily', +// 'end_date' => Carbon::now()->addDays(7)->toDateString(), +// ])); +// $from = Carbon::now()->addDays(7); +// $to = Carbon::now()->endOfDay()->addDays(10); +// $events = $this->events->all($from, $to); +// $this->assertCount(1, $events); +// } +// public function test_generates_all_daily_occurrences_single_event_from_to() +// { +// Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); +// $this->events->add(EventFactory::createFromArray([ +// 'id' => 'daily-event', +// 'start_date' => Carbon::now()->toDateString(), +// 'start_time' => '13:00', +// 'end_time' => '15:00', +// 'recurrence' => 'daily', +// 'end_date' => Carbon::now()->addDays(7)->toDateString(), +// ])); +// $from = Carbon::now()->subDays(1); +// $to = Carbon::now()->endOfDay()->addDays(10); +// $events = $this->events->all($from, $to); +// $this->assertCount(8, $events); +// } +// public function test_generates_all_daily_occurrences_single_event_from_to_without_end_date() +// { +// Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); +// $this->events->add(EventFactory::createFromArray([ +// 'id' => 'daily-event', +// 'start_date' => Carbon::now()->toDateString(), +// 'start_time' => '13:00', +// 'end_time' => '15:00', +// 'recurrence' => 'daily', +// ])); +// $from = Carbon::now()->subDays(1); +// $to = Carbon::now()->endOfDay()->addDays(10); +// $events = $this->events->all($from, $to); +// $this->assertCount(11, $events); +// } +// public function test_can_exclude_dates() +// { +// Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); +// $this->events->add(EventFactory::createFromArray([ +// 'id' => 'daily-event', +// 'start_date' => Carbon::now()->toDateString(), +// 'start_time' => '13:00', +// 'end_time' => '15:00', +// 'recurrence' => 'daily', +// 'except' => [ +// ['date' => Carbon::now()->addDays(2)->toDateString()], +// ['date' => Carbon::now()->addDays(4)->toDateString()], +// ], +// ])); +// $from = Carbon::now()->subDays(1); +// $to = Carbon::now()->endOfDay()->addDays(5); +// $events = $this->events->all($from, $to)->toArray(); +// $this->assertCount(4, $events); +// $this->assertEquals(Carbon::now()->toDateString(), $events[0]['start_date']); +// $this->assertEquals(Carbon::now()->addDays(1)->toDateString(), $events[1]['start_date']); +// $this->assertEquals(Carbon::now()->addDays(3)->toDateString(), $events[2]['start_date']); +// $this->assertEquals(Carbon::now()->addDays(5)->toDateString(), $events[3]['start_date']); +// } \ No newline at end of file diff --git a/tests/Unit/RecurringEventsTest.php b/tests/Unit/RecurringEventsTest.php index 587145c..5a06c26 100755 --- a/tests/Unit/RecurringEventsTest.php +++ b/tests/Unit/RecurringEventsTest.php @@ -1,72 +1,62 @@ collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'recurrence' => 'daily', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - $this->assertTrue($event instanceof RecurringEvent); - $this->assertTrue($event->isRecurring()); - $this->assertFalse($event->isMultiDay()); - } - - /** @test */ - public function wontCreateRecurringEventWhenMultiDay() - { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'recurrence' => 'multi_day', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - $this->assertTrue($event instanceof SingleDayEvent); - $this->assertFalse($event->isRecurring()); - $this->assertFalse($event->isMultiDay()); - } - - /** @test */ - public function canShowLastOccurrenceWhenNoEndTime() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $recurringEntry = tap(Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->addDays(1)->toDateString(), - 'start_time' => '22:00', - 'recurrence' => 'daily', - 'end_date' => Carbon::now()->addDays(2)->toDateString(), - 'timezone' => 'America/Chicago', - ]))->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(Carbon::now(), Carbon::now()->addDays(5)->endOfDay()); - $this->assertCount(2, $occurrences); - } -} +test('can create recurring event', function () { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'recurrence' => 'daily', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + expect($event instanceof RecurringEvent)->toBeTrue(); + expect($event->isRecurring())->toBeTrue(); + expect($event->isMultiDay())->toBeFalse(); +}); + +test('wont create recurring event when multi day', function () { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'recurrence' => 'multi_day', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + expect($event instanceof SingleDayEvent)->toBeTrue(); + expect($event->isRecurring())->toBeFalse(); + expect($event->isMultiDay())->toBeFalse(); +}); + +test('can show last occurrence when no end time', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $recurringEntry = tap(Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->addDays(1)->toDateString(), + 'start_time' => '22:00', + 'recurrence' => 'daily', + 'end_date' => Carbon::now()->addDays(2)->toDateString(), + 'timezone' => 'America/Chicago', + ]))->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(Carbon::now(), Carbon::now()->addDays(5)->endOfDay()); + + expect($occurrences)->toHaveCount(2); +}); diff --git a/tests/Unit/RecurringEveryXEventsTest.php b/tests/Unit/RecurringEveryXEventsTest.php index ad46b16..87bf15c 100755 --- a/tests/Unit/RecurringEveryXEventsTest.php +++ b/tests/Unit/RecurringEveryXEventsTest.php @@ -1,275 +1,252 @@ collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'weeks', - ]); - $event = EventFactory::createFromEntry($recurringEntry); +test('can create every xevent', function () { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'weeks', + ]); - $this->assertInstanceOf(RecurringEvent::class, $event); - } + $event = EventFactory::createFromEntry($recurringEntry); - /** @test */ - public function noOccurencesWhenNowAfterEndDate() - { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'end_date' => Carbon::now()->addDays(2)->toDateString(), - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); + expect($event)->toBeInstanceOf(RecurringEvent::class); +}); - $event = EventFactory::createFromEntry($recurringEntry); +test('no occurences when now after end date', function () { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'end_date' => Carbon::now()->addDays(2)->toDateString(), + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - Carbon::setTestNow(now()->addDays(3)); - $nextOccurrences = $event->nextOccurrences(); + $event = EventFactory::createFromEntry($recurringEntry); - $this->assertEmpty($nextOccurrences); - } + Carbon::setTestNow(now()->addDays(3)); + $nextOccurrences = $event->nextOccurrences(); - /** @test */ - public function canGenerateOccurrenceIfNowBefore() - { - $startDate = Carbon::now()->addDay()->setTimeFromTimeString('11:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); + expect($nextOccurrences)->toBeEmpty(); +}); - $occurrences = EventFactory::createFromEntry($recurringEntry) - ->nextOccurrences(1); +test('can generate occurrence if now before', function () { + $startDate = Carbon::now()->addDay()->setTimeFromTimeString('11:00'); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - $this->assertCount(1, $occurrences); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); - $this->assertEquals($startDate, $occurrences[0]->start); + expect($occurrences)->toHaveCount(1); - Carbon::setTestNow(now()->setTimeFromTimeString('10:59:59')); - $occurrences = EventFactory::createFromEntry($recurringEntry) - ->nextOccurrences(1); + expect($occurrences[0]->start)->toEqual($startDate); - $this->assertEquals($startDate, $occurrences[0]->start); - } + Carbon::setTestNow(now()->setTimeFromTimeString('10:59:59')); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); - /** @test */ - public function canGenerateOccurrenceIfDuring() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); + expect($occurrences[0]->start)->toEqual($startDate); +}); - Carbon::setTestNow($startDate->addMinutes(10)); - $occurrences = EventFactory::createFromEntry($recurringEntry) - ->nextOccurrences(1); +test('can generate occurrence if during', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - $this->assertEquals($startDate, $occurrences[0]->start); - } + Carbon::setTestNow($startDate->addMinutes(10)); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); - /** @test */ - public function canGenerateOccurrenceIfNowAfterFirstDate() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + expect($occurrences[0]->start)->toEqual($startDate); +}); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); +test('can generate occurrence if now after first date', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - Carbon::setTestNow($startDate->addMinutes(1)->addHour()); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - $event = EventFactory::createFromEntry($recurringEntry); + Carbon::setTestNow($startDate->addMinutes(1)->addHour()); - $occurrences = $event->nextOccurrences(1); + $event = EventFactory::createFromEntry($recurringEntry); - $this->assertEquals($startDate->addDays(2), $occurrences[0]->start); + $occurrences = $event->nextOccurrences(1); - // $nextDate = $event->upcomingDate(Carbon::now()->addDays(2)); + expect($occurrences[0]->start)->toEqual($startDate->addDays(2)); - // $this->assertEquals($startDate, $nextDate->start()); - } + // $nextDate = $event->upcomingDate(Carbon::now()->addDays(2)); + // $this->assertEquals($startDate, $nextDate->start()); +}); - /** @test */ - public function canGenerateNextOccurrenceInWeeksIfNowAfterStart() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); +test('can generate next occurrence in weeks if now after start', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'weeks', - ]); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'weeks', + ]); - Carbon::setTestNow($startDate->addHours(2)); + Carbon::setTestNow($startDate->addHours(2)); - $event = EventFactory::createFromEntry($recurringEntry); + $event = EventFactory::createFromEntry($recurringEntry); - $occurrences = $event->nextOccurrences(1); + $occurrences = $event->nextOccurrences(1); - $this->assertEquals($startDate->addWeeks(2), $occurrences[0]->start); - } + expect($occurrences[0]->start)->toEqual($startDate->addWeeks(2)); +}); - /** @test */ - public function canGenerateNextOccurrenceIfNow_after_weeks() - { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => '2021-01-18', - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'weeks', - ]); +test('can generate next occurrence if now after weeks', function () { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => '2021-01-18', + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'weeks', + ]); - $event = EventFactory::createFromEntry($recurringEntry); + $event = EventFactory::createFromEntry($recurringEntry); - Carbon::setTestNow(Carbon::parse('2021-03-04')->setTimeFromTimeString('11:00:00')); + Carbon::setTestNow(Carbon::parse('2021-03-04')->setTimeFromTimeString('11:00:00')); - $occurrences = $event->nextOccurrences(1); + $occurrences = $event->nextOccurrences(1); - $this->assertNotEmpty($occurrences); + expect($occurrences)->not->toBeEmpty(); - $this->assertEquals(Carbon::parse('2021-03-15')->setTimeFromTimeString('11:00:00'), $occurrences[0]->start); - } + expect($occurrences[0]->start)->toEqual(Carbon::parse('2021-03-15')->setTimeFromTimeString('11:00:00')); +}); - /** @test */ - public function canGenerateNextOccurrenceIfNowDuringMonths() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); +test('can generate next occurrence if now during months', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'months', - ]); - - Carbon::setTestNow($startDate->addMinutes(1)); - - $event = EventFactory::createFromEntry($recurringEntry); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'months', + ]); - $occurrences = $event->nextOccurrences(1); + Carbon::setTestNow($startDate->addMinutes(1)); - $this->assertEquals($startDate->setTimeFromTimeString('11:00:00'), $occurrences[0]->start); - } + $event = EventFactory::createFromEntry($recurringEntry); - /** @test */ - public function canGenerateNextXOccurrencesFromTodayBeforeEventTime() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); - $event = EventFactory::createFromEntry($recurringEntry); - - for ($x = 0; $x < 2; $x++) { - $events[] = $startDate->addDays($x * 2); - } - - Carbon::setTestNow($startDate->subMinutes(1)); - - $occurrences = $event->nextOccurrences(2); - - $this->assertCount(2, $occurrences); - - $this->assertEquals($events[0], $occurrences[0]->start); - $this->assertEquals($events[1], $occurrences[1]->start); - } + $occurrences = $event->nextOccurrences(1); - /** @test */ - public function canGenerateAllOccurrencesWhenAfterStartDateDaily() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + expect($occurrences[0]->start)->toEqual($startDate->setTimeFromTimeString('11:00:00')); +}); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->addDay()->toDateString(), +test('can generate next xoccurrences from today before event time', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), 'start_time' => '11:00', 'end_time' => '12:00', - 'end_date' => $startDate->addDays(5)->toDateString(), 'recurrence' => 'every', 'interval' => 2, 'period' => 'days', ]); + $event = EventFactory::createFromEntry($recurringEntry); + + for ($x = 0; $x < 2; $x++) { + $events[] = $startDate->addDays($x * 2); + } + + Carbon::setTestNow($startDate->subMinutes(1)); - for ($x = 1; $x <= 2; $x++) { - $events[] = $startDate->addDays($x * 2 + 1); - } + $occurrences = $event->nextOccurrences(2); - $event = EventFactory::createFromEntry($recurringEntry); + expect($occurrences)->toHaveCount(2); - Carbon::setTestNow($startDate->addDays(1)->addHour(2)); - $occurrences = $event->nextOccurrences(5); + expect($occurrences[0]->start)->toEqual($events[0]); + expect($occurrences[1]->start)->toEqual($events[1]); +}); - $this->assertCount(2, $occurrences); +test('can generate all occurrences when after start date daily', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - $this->assertEquals($events[0], $occurrences[0]->start); - $this->assertEquals($events[1], $occurrences[1]->start); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->addDay()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'end_date' => $startDate->addDays(5)->toDateString(), + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); + + for ($x = 1; $x <= 2; $x++) { + $events[] = $startDate->addDays($x * 2 + 1); } - /* + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow($startDate->addDays(1)->addHour(2)); + $occurrences = $event->nextOccurrences(5); + + expect($occurrences)->toHaveCount(2); + + expect($occurrences[0]->start)->toEqual($events[0]); + expect($occurrences[1]->start)->toEqual($events[1]); +}); + +/* public function test_can_get_last_day_when_before() { Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); @@ -384,5 +361,4 @@ public function test_returns_null_when_dates_between_dont_have_event() $this->assertEmpty($dates); } -*/ -} +*/ \ No newline at end of file diff --git a/tests/Unit/SingleDayEventsTest.php b/tests/Unit/SingleDayEventsTest.php index ebe2242..1381c11 100755 --- a/tests/Unit/SingleDayEventsTest.php +++ b/tests/Unit/SingleDayEventsTest.php @@ -1,164 +1,146 @@ collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'timezone' => 'America/Vancouver', - ]); - - $event = EventFactory::createFromEntry($entry); - - $this->assertTrue($event instanceof SingleDayEvent); - $this->assertFalse($event->isRecurring()); - $this->assertFalse($event->isMultiDay()); - $this->assertTrue($event->hasEndTime()); - $this->assertEquals(new CarbonTimeZone('America/Vancouver'), $event->start()->timezone); - $this->assertEquals(new CarbonTimeZone('America/Vancouver'), $event->end()->timezone); - } - - /** @test */ - public function canCreateSingleAllDayEvent() - { - $entry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'all_day' => true, - ]); - - $event = EventFactory::createFromEntry($entry); - - $this->assertTrue($event instanceof SingleDayEvent); - $this->assertTrue($event->isAllDay()); - } - - /** @test */ - public function endIsEndOfDayWhenNoEndTime() - { - Carbon::setTestNow(now()); - - $entry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - ]); - - $event = EventFactory::createFromEntry($entry); - - $this->assertEquals('23:59:59', $event->endTime()); - $nextOccurrences = $event->nextOccurrences(); - - $this->assertFalse($nextOccurrences[0]->has_end_time); - $this->assertEquals(now()->endOfDay()->setMicrosecond(0), $nextOccurrences[0]->end); - } - - /** @test */ - public function emptyOccurrencesIfNowAfterEndDate() - { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow(now()->addDays(1)); - $nextOccurrences = $event->nextOccurrences(); - - $this->assertEmpty($nextOccurrences); - } - - /** @test */ - public function canGenerateNextDayIfNowIsBefore() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow($startDate->setTimeFromTimeString('10:59:00')); - - $nextOccurrences = $event->nextOccurrences(2); - - $this->assertCount(1, $nextOccurrences); - - $this->assertEquals($startDate, $nextOccurrences->first()->start); - } - - /** @test */ - public function canGenerateNextOccurrenceIfNowIsDuring() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - $single = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - ]); - - $singleNoEndTime = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - ]); - - Carbon::setTestNow($startDate->addMinutes(10)); - - $event = EventFactory::createFromEntry($single); - $noEndTimeEvent = EventFactory::createFromEntry($singleNoEndTime); - $nextOccurrences = $event->nextOccurrences(); - - $this->assertEquals($startDate, $nextOccurrences[0]->start); - $this->assertEquals($startDate, $noEndTimeEvent->nextOccurrences()[0]->start); - } - - /** @test */ - public function canSupplementNoEndTime() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - $noEndTimeEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - ]); - - Carbon::setTestNow($startDate->addMinutes(10)); - - $event = EventFactory::createFromEntry($noEndTimeEntry); - $nextOccurrences = $event->nextOccurrences(); - - $this->assertFalse($nextOccurrences[0]->has_end_time); - } -} + +test('can create single event', function () { + $entry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'timezone' => 'America/Vancouver', + ]); + + $event = EventFactory::createFromEntry($entry); + + expect($event instanceof SingleDayEvent)->toBeTrue(); + expect($event->isRecurring())->toBeFalse(); + expect($event->isMultiDay())->toBeFalse(); + expect($event->hasEndTime())->toBeTrue(); + expect($event->start()->timezone)->toEqual(new CarbonTimeZone('America/Vancouver')); + expect($event->end()->timezone)->toEqual(new CarbonTimeZone('America/Vancouver')); +}); + +test('can create single all day event', function () { + $entry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'all_day' => true, + ]); + + $event = EventFactory::createFromEntry($entry); + + expect($event instanceof SingleDayEvent)->toBeTrue(); + expect($event->isAllDay())->toBeTrue(); +}); + +test('end is end of day when no end time', function () { + Carbon::setTestNow(now()); + + $entry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + ]); + + $event = EventFactory::createFromEntry($entry); + + expect($event->endTime())->toEqual('23:59:59'); + $nextOccurrences = $event->nextOccurrences(); + + expect($nextOccurrences[0]->has_end_time)->toBeFalse(); + expect($nextOccurrences[0]->end)->toEqual(now()->endOfDay()->setMicrosecond(0)); +}); + +test('empty occurrences if now after end date', function () { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow(now()->addDays(1)); + $nextOccurrences = $event->nextOccurrences(); + + expect($nextOccurrences)->toBeEmpty(); +}); + +test('can generate next day if now is before', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow($startDate->setTimeFromTimeString('10:59:00')); + + $nextOccurrences = $event->nextOccurrences(2); + + expect($nextOccurrences)->toHaveCount(1); + + expect($nextOccurrences->first()->start)->toEqual($startDate); +}); + +test('can generate next occurrence if now is during', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + $single = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + ]); + + $singleNoEndTime = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + ]); + + Carbon::setTestNow($startDate->addMinutes(10)); + + $event = EventFactory::createFromEntry($single); + $noEndTimeEvent = EventFactory::createFromEntry($singleNoEndTime); + $nextOccurrences = $event->nextOccurrences(); + + expect($nextOccurrences[0]->start)->toEqual($startDate); + expect($noEndTimeEvent->nextOccurrences()[0]->start)->toEqual($startDate); +}); + +test('can supplement no end time', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + $noEndTimeEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + ]); + + Carbon::setTestNow($startDate->addMinutes(10)); + + $event = EventFactory::createFromEntry($noEndTimeEntry); + $nextOccurrences = $event->nextOccurrences(); + + expect($nextOccurrences[0]->has_end_time)->toBeFalse(); +}); From 56dc5626c9a84485097facde6d8cb7ad36fae2ae Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 13:59:15 -0800 Subject: [PATCH 02/13] pest --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 32c6fa2..bdbb8c6 100644 --- a/composer.json +++ b/composer.json @@ -46,9 +46,8 @@ "require-dev": { "mockery/mockery": "^1.3.1", "nunomaduro/collision": "^6.0 || ^7.0 || ^8.0", - "pestphp/pest-plugin-drift": "^3.0", - "phpunit/phpunit": "^9.0 || ^10.0 || ^11.0", "orchestra/testbench": "^7.0 || ^8.0 || ^9.0", + "pestphp/pest": "^3.7", "spatie/laravel-ray": "^1.35", "spatie/test-time": "^1.2" }, From 1040036e23361e2e6980dc3470275c236337c94a Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 14:01:31 -0800 Subject: [PATCH 03/13] new test harness --- tests/PreventSavingStacheItemsToDisk.php | 30 ----------- tests/TestCase.php | 64 +++--------------------- 2 files changed, 6 insertions(+), 88 deletions(-) delete mode 100644 tests/PreventSavingStacheItemsToDisk.php diff --git a/tests/PreventSavingStacheItemsToDisk.php b/tests/PreventSavingStacheItemsToDisk.php deleted file mode 100644 index 22451c7..0000000 --- a/tests/PreventSavingStacheItemsToDisk.php +++ /dev/null @@ -1,30 +0,0 @@ -fakeStacheDirectory = Path::tidy($this->fakeStacheDirectory); - - Stache::stores()->each(function ($store) { - $dir = Path::tidy(__DIR__ . '/__fixtures__'); - $relative = str_after(str_after($store->directory(), $dir), '/'); - $store->directory($this->fakeStacheDirectory . '/' . $relative); - }); - } - - protected function deleteFakeStacheDirectory() - { - app('files')->deleteDirectory($this->fakeStacheDirectory); - - mkdir($this->fakeStacheDirectory); - touch($this->fakeStacheDirectory . '/.gitkeep'); - } -} diff --git a/tests/TestCase.php b/tests/TestCase.php index ac4df4b..203cae0 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,84 +2,32 @@ namespace TransformStudios\Events\Tests; -use Orchestra\Testbench\TestCase as OrchestraTestCase; use Statamic\Entries\Collection; -use Statamic\Extend\Manifest; use Statamic\Facades\Collection as CollectionFacade; use Statamic\Facades\Fieldset; use Statamic\Facades\Taxonomy; use Statamic\Facades\Term; use Statamic\Fields\Blueprint; use Statamic\Fields\BlueprintRepository; -use Statamic\Providers\StatamicServiceProvider; use Statamic\Statamic; +use Statamic\Testing\AddonTestCase; +use Statamic\Testing\Concerns\PreventsSavingStacheItemsToDisk; use TransformStudios\Events\ServiceProvider; -abstract class TestCase extends OrchestraTestCase +abstract class TestCase extends AddonTestCase { - use PreventSavingStacheItemsToDisk; + use PreventsSavingStacheItemsToDisk; + + protected string $addonServiceProvider = ServiceProvider::class; protected Collection $collection; protected Blueprint $blueprint; - public function setup(): void - { - parent::setup(); - $this->preventSavingStacheItemsToDisk(); - } - - public function tearDown(): void - { - $this->deleteFakeStacheDirectory(); - - parent::tearDown(); - } - - protected function getPackageProviders($app) - { - return [ - StatamicServiceProvider::class, - ServiceProvider::class, - ]; - } - - protected function getPackageAliases($app) - { - return [ - 'Statamic' => Statamic::class, - ]; - } - protected function getEnvironmentSetUp($app) { parent::getEnvironmentSetUp($app); - $app->make(Manifest::class)->manifest = [ - 'transformstudios/events' => [ - 'id' => 'transformstudios/events', - 'namespace' => 'TransformStudios\\Events', - ], - ]; - - // Statamic::pushActionRoutes(function () { - // return require_once realpath(__DIR__.'/../routes/actions.php'); - // }); - } - - protected function resolveApplicationConfiguration($app) - { - parent::resolveApplicationConfiguration($app); - - $configs = ['assets', 'cp', 'forms', 'routes', 'static_caching', 'sites', 'stache', 'system', 'users']; - - foreach ($configs as $config) { - $app['config']->set("statamic.$config", require __DIR__."/../vendor/statamic/cms/config/{$config}.php"); - } - - // Setting the user repository to the default flat file system - $app['config']->set('statamic.users.repository', 'file'); - // Assume the pro edition within tests $app['config']->set('statamic.editions.pro', true); $app['config']->set('events.timezone', 'UTC'); From 0efe6786eb77bb7930efa70444f131e7e1811f06 Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 15:50:17 -0800 Subject: [PATCH 04/13] Revert "pest" This reverts commit 56dc5626c9a84485097facde6d8cb7ad36fae2ae. --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index bdbb8c6..32c6fa2 100644 --- a/composer.json +++ b/composer.json @@ -46,8 +46,9 @@ "require-dev": { "mockery/mockery": "^1.3.1", "nunomaduro/collision": "^6.0 || ^7.0 || ^8.0", + "pestphp/pest-plugin-drift": "^3.0", + "phpunit/phpunit": "^9.0 || ^10.0 || ^11.0", "orchestra/testbench": "^7.0 || ^8.0 || ^9.0", - "pestphp/pest": "^3.7", "spatie/laravel-ray": "^1.35", "spatie/test-time": "^1.2" }, From 278c107e0df2ec83f5e70d7a7eb000cd17d13415 Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 15:50:28 -0800 Subject: [PATCH 05/13] Revert "convert to pest" This reverts commit 3e27dfb4e720d9ce20cd37bb69e2af6366384307. --- composer.json | 8 +- tests/Feature/EventsOffsetTest.php | 87 ++- tests/Feature/IcsControllerTest.php | 251 ++++---- tests/Feature/TagTest.php | 658 ++++++++++--------- tests/Pest.php | 45 -- tests/Unit/DayTest.php | 46 +- tests/Unit/EventFactoryTest.php | 131 ++-- tests/Unit/EventsTest.php | 785 ++++++++++++----------- tests/Unit/MultiDayEventsTest.php | 268 ++++---- tests/Unit/RecurringDailyEventsTest.php | 476 ++++++++------ tests/Unit/RecurringEventsTest.php | 112 ++-- tests/Unit/RecurringEveryXEventsTest.php | 400 ++++++------ tests/Unit/SingleDayEventsTest.php | 292 +++++---- 13 files changed, 1902 insertions(+), 1657 deletions(-) delete mode 100644 tests/Pest.php diff --git a/composer.json b/composer.json index 32c6fa2..5002b64 100644 --- a/composer.json +++ b/composer.json @@ -45,10 +45,9 @@ }, "require-dev": { "mockery/mockery": "^1.3.1", - "nunomaduro/collision": "^6.0 || ^7.0 || ^8.0", - "pestphp/pest-plugin-drift": "^3.0", - "phpunit/phpunit": "^9.0 || ^10.0 || ^11.0", - "orchestra/testbench": "^7.0 || ^8.0 || ^9.0", + "nunomaduro/collision": "^6.0 || ^7.0", + "phpunit/phpunit": "^9.0 || ^10.0", + "orchestra/testbench": "^7.0 || ^8.0", "spatie/laravel-ray": "^1.35", "spatie/test-time": "^1.2" }, @@ -57,7 +56,6 @@ "preferred-install": "dist", "sort-packages": true, "allow-plugins": { - "pestphp/pest-plugin": true, "pixelfear/composer-dist-plugin": true } }, diff --git a/tests/Feature/EventsOffsetTest.php b/tests/Feature/EventsOffsetTest.php index a48893a..d947ef1 100644 --- a/tests/Feature/EventsOffsetTest.php +++ b/tests/Feature/EventsOffsetTest.php @@ -1,31 +1,43 @@ collection('events') - ->slug('recurring-event') - ->id('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - 'categories' => ['one'], - ])->save(); - - $this->tag = app(Events::class); -}); - -test('can offset upcoming occurrences', function () { +use TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk; +use TransformStudios\Events\Tests\TestCase; + +class EventsOffsetTest extends TestCase +{ + use PreventSavingStacheItemsToDisk; + + private Events $tag; + + public function setUp(): void + { + parent::setUp(); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->id('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + 'categories' => ['one'], + ])->save(); + + $this->tag = app(Events::class); + } + + /** @test */ + public function canOffsetUpcomingOccurrences() + { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); $this->tag @@ -38,10 +50,12 @@ $occurrences = $this->tag->upcoming(); - expect($occurrences)->toHaveCount(3); -}); + $this->assertCount(3, $occurrences); + } -test('can offset between occurrences', function () { + /** @test */ + public function canOffsetBetweenOccurrences() + { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); $this->tag->setContext([]) @@ -54,10 +68,12 @@ $occurrences = $this->tag->between(); - expect($occurrences)->toHaveCount(2); -}); + $this->assertCount(2, $occurrences); + } -test('can offset today occurrences', function () { + /** @test */ + public function canOffsetTodayOccurrences() + { Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); Entry::make() @@ -76,7 +92,7 @@ 'offset' => 1, ]); - expect($this->tag->today())->toHaveCount(1); + $this->assertCount(1, $this->tag->today()); $this->tag->setContext([]) ->setParameters([ @@ -85,10 +101,12 @@ 'offset' => 1, ]); - expect($this->tag->today())->toHaveCount(0); -}); + $this->assertCount(0, $this->tag->today()); + } -test('can offset single day occurrences', function () { + /** @test */ + public function canOffsetSingleDayOccurrences() + { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); $this->tag->setContext([]) @@ -97,5 +115,6 @@ 'offset' => 1, ]); - expect($this->tag->today())->toHaveCount(0); -}); \ No newline at end of file + $this->assertCount(0, $this->tag->today()); + } +} diff --git a/tests/Feature/IcsControllerTest.php b/tests/Feature/IcsControllerTest.php index 708a29b..3dcf1ec 100755 --- a/tests/Feature/IcsControllerTest.php +++ b/tests/Feature/IcsControllerTest.php @@ -1,121 +1,140 @@ collection('events') - ->slug('single-event') - ->id('the-id') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'location' => 'The Location', - ])->save(); -}); - -test('can create single day event ics file', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $response = $this->get(route('statamic.events.ics.show', [ - 'date' => now()->toDateString(), - 'event' => 'the-id', - ]))->assertDownload('single-event.ics'); - - $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); - $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); -}); - -test('can create single day recurring event ics file', function () { - Carbon::setTestNow(now()->addDay()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->id('the-recurring-id') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - ])->save(); - - $response = $this->get(route('statamic.events.ics.show', [ - 'date' => now()->toDateString(), - 'event' => 'the-recurring-id', - ]))->assertDownload('recurring-event.ics'); - - $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'the-recurring-id', - ]))->assertStatus(404); -}); - -test('can create single day multiday event ics file', function () { - Carbon::setTestNow(now()); - - $entry = Entry::make() - ->slug('multi-day-event') - ->collection('events') - ->id('the-multi-day-event') - ->data([ - 'title' => 'Multi-day Event', - 'multi_day' => true, - 'days' => [ - [ - 'date' => now()->toDateString(), - 'start_time' => '19:00', - 'end_time' => '21:00', - ], - [ - 'date' => now()->addDay()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '15:00', - ], - [ - 'date' => now()->addDays(2)->toDateString(), - 'start_time' => '11:00', - 'end_time' => '15:00', +use TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk; +use TransformStudios\Events\Tests\TestCase; + +class IcsControllerTest extends TestCase +{ + use PreventSavingStacheItemsToDisk; + + public function setUp(): void + { + parent::setUp(); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->id('the-id') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'location' => 'The Location', + ])->save(); + } + + /** @test */ + public function canCreateSingleDayEventIcsFile() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $response = $this->get(route('statamic.events.ics.show', [ + 'date' => now()->toDateString(), + 'event' => 'the-id', + ]))->assertDownload('single-event.ics'); + + $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); + $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); + } + + /** @test */ + public function canCreateSingleDayRecurringEventIcsFile() + { + Carbon::setTestNow(now()->addDay()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->id('the-recurring-id') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + ])->save(); + + $response = $this->get(route('statamic.events.ics.show', [ + 'date' => now()->toDateString(), + 'event' => 'the-recurring-id', + ]))->assertDownload('recurring-event.ics'); + + $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'the-recurring-id', + ]))->assertStatus(404); + } + + /** @test */ + public function canCreateSingleDayMultidayEventIcsFile() + { + Carbon::setTestNow(now()); + + $entry = Entry::make() + ->slug('multi-day-event') + ->collection('events') + ->id('the-multi-day-event') + ->data([ + 'title' => 'Multi-day Event', + 'multi_day' => true, + 'days' => [ + [ + 'date' => now()->toDateString(), + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => now()->addDay()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', + ], + [ + 'date' => now()->addDays(2)->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', + ], ], - ], - ])->save(); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDays(3)->toDateString(), - 'event' => 'the-multi-day-event', - ]))->assertStatus(404); - - $response = $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'the-multi-day-event', - ]))->assertDownload('multi-day-event.ics'); - - $this->assertStringContainsString('DTSTART:'.now()->addDay()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); -}); - -test('throws404 error when event does not occur on date', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'the-id', - ]))->assertStatus(404); -}); - -test('throws404 error when event does not exist', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'does-not-exist', - ]))->assertStatus(404); -}); \ No newline at end of file + ])->save(); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDays(3)->toDateString(), + 'event' => 'the-multi-day-event', + ]))->assertStatus(404); + + $response = $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'the-multi-day-event', + ]))->assertDownload('multi-day-event.ics'); + + $this->assertStringContainsString('DTSTART:'.now()->addDay()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); + } + + /** @test */ + public function throws404ErrorWhenEventDoesNotOccurOnDate() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'the-id', + ]))->assertStatus(404); + } + + /** @test */ + public function throws404ErrorWhenEventDoesNotExist() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'does-not-exist', + ]))->assertStatus(404); + } +} diff --git a/tests/Feature/TagTest.php b/tests/Feature/TagTest.php index a887366..141199d 100755 --- a/tests/Feature/TagTest.php +++ b/tests/Feature/TagTest.php @@ -1,317 +1,355 @@ collection('events') - ->slug('recurring-event') - ->id('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - 'categories' => ['one'], - ])->save(); - - $this->tag = app(Events::class); -}); - -test('can generate between occurrences', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'from' => Carbon::now(), - 'to' => Carbon::now()->addWeek(3), - ]); - - $occurrences = $this->tag->between(); - - expect($occurrences)->toHaveCount(4); -}); - -test('can generate between occurrences with default from', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'to' => Carbon::now()->addWeeks(3), - ]); - - $occurrences = $this->tag->between(); - - expect($occurrences)->toHaveCount(4); -}); - -test('can generate calendar occurrences', function () { - Carbon::setTestNow('jan 1, 2022 10:00'); - - Entry::all()->each->delete(); - - Entry::make() - ->collection('events') - ->slug('single-event-start-of-month') - ->data([ - 'title' => 'Single Event - Start of Month', - 'start_date' => Carbon::now()->startOfMonth()->toDateString(), - 'start_time' => '13:00', - 'end_time' => '15:00', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('recurring-event-start-of-month') - ->data([ - 'title' => 'Recurring Event - Start of Month', - 'start_date' => Carbon::now()->startOfMonth()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - 'categories' => ['one'], - ])->save(); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'month' => now()->englishMonth, - 'year' => now()->year, - ]); - - $occurrences = $this->tag->calendar(); - - expect($occurrences)->toHaveCount(42); - expect(Arr::get($occurrences, '6.dates'))->toHaveCount(2); - expect(Arr::get($occurrences, '7.no_results'))->toBeTrue(); - expect(Arr::get($occurrences, '13.dates'))->toHaveCount(1); -}); - -test('can generate in occurrences', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'next' => '3 weeks', - ]); - - $occurrences = $this->tag->in(); - - expect($occurrences)->toHaveCount(4); -}); - -test('can generate today occurrences', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '13:00', - 'end_time' => '15:00', - ])->save(); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - ]); - - expect($this->tag->today())->toHaveCount(2); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'ignore_finished' => true, - ]); - - expect($this->tag->today())->toHaveCount(1); -}); - -test('can generate upcoming occurrences', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'limit' => 3, - ]); - - $occurrences = $this->tag->upcoming(); - - expect($occurrences)->toHaveCount(3); -}); - -test('can generate upcoming limited occurrences', function () { - Entry::make() - ->collection('events') - ->slug('another-recurring-event') - ->id('another-recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'limit' => 3, - ]); - - $occurrences = $this->tag->upcoming(); - - expect($occurrences)->toHaveCount(3); -}); - -test('can paginate upcoming occurrences', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'paginate' => 2, - 'limit' => 10, - ]); - - Cascade::partialMock()->shouldReceive('get') - ->with('uri') - ->andReturn('/events'); - - $pagination = $this->tag->upcoming(); - - expect($pagination)->toHaveKey('results'); - expect($pagination)->toHaveKey('paginate'); - expect($pagination)->toHaveKey('total_results'); - - expect($pagination['results'])->toHaveCount(2); - expect($pagination['total_results'])->toEqual(2); - expect($pagination['paginate']['next_page'])->toEqual('/events?page=2'); -}); - -test('can generate upcoming occurrences with taxonomy terms', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->id('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '17:00', - 'end_time' => '19:00', - ])->save(); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'from' => Carbon::now()->toDateString(), - 'to' => Carbon::now()->addDay()->toDateString(), - 'taxonomy:categories' => 'one', - ]); - - $occurrences = $this->tag->between(); - - expect($occurrences)->toHaveCount(1); -}); - -test('can generate upcoming occurrences with filter', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->id('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '17:00', - 'end_time' => '19:00', - ])->save(); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'from' => Carbon::now()->toDateString(), - 'to' => Carbon::now()->addDay()->toDateString(), - 'title:contains' => 'Single', - ]); - - $occurrences = $this->tag->between(); - - expect($occurrences)->toHaveCount(1); -}); - -test('can generate date event download link', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'date' => now(), - 'event' => 'recurring-event', - ]); - - $url = $this->tag->downloadLink(); - - expect($url)->toEqual('http://localhost/!/events/ics?collection=events&date='.now()->toDateString().'&event=recurring-event'); -}); - -test('can generate event download link', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'event' => 'recurring-event', - ]); - - $url = $this->tag->downloadLink(); - - expect($url)->toEqual('http://localhost/!/events/ics?collection=events&event=recurring-event'); -}); - -test('can sort occurrences desc', function () { - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'limit' => 3, - 'sort' => 'desc', - ]); - - $occurrences = $this->tag->upcoming(); - - expect($occurrences[0]->start->isAfter($occurrences[1]->start))->toBeTrue(); - expect($occurrences[1]->start->isAfter($occurrences[2]->start))->toBeTrue(); -}); \ No newline at end of file +use TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk; +use TransformStudios\Events\Tests\TestCase; + +class TagTest extends TestCase +{ + use PreventSavingStacheItemsToDisk; + + private Events $tag; + + public function setUp(): void + { + parent::setUp(); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->id('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + 'categories' => ['one'], + ])->save(); + + $this->tag = app(Events::class); + } + + /** @test */ + public function canGenerateBetweenOccurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'from' => Carbon::now(), + 'to' => Carbon::now()->addWeek(3), + ]); + + $occurrences = $this->tag->between(); + + $this->assertCount(4, $occurrences); + } + + /** @test */ + public function canGenerateBetweenOccurrencesWithDefaultFrom() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'to' => Carbon::now()->addWeeks(3), + ]); + + $occurrences = $this->tag->between(); + + $this->assertCount(4, $occurrences); + } + + /** @test */ + public function canGenerateCalendarOccurrences() + { + Carbon::setTestNow('jan 1, 2022 10:00'); + + Entry::all()->each->delete(); + + Entry::make() + ->collection('events') + ->slug('single-event-start-of-month') + ->data([ + 'title' => 'Single Event - Start of Month', + 'start_date' => Carbon::now()->startOfMonth()->toDateString(), + 'start_time' => '13:00', + 'end_time' => '15:00', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('recurring-event-start-of-month') + ->data([ + 'title' => 'Recurring Event - Start of Month', + 'start_date' => Carbon::now()->startOfMonth()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + 'categories' => ['one'], + ])->save(); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'month' => now()->englishMonth, + 'year' => now()->year, + ]); + + $occurrences = $this->tag->calendar(); + + $this->assertCount(42, $occurrences); + $this->assertCount(2, Arr::get($occurrences, '6.dates')); + $this->assertTrue(Arr::get($occurrences, '7.no_results')); + $this->assertCount(1, Arr::get($occurrences, '13.dates')); + } + + /** @test */ + public function canGenerateInOccurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'next' => '3 weeks', + ]); + + $occurrences = $this->tag->in(); + + $this->assertCount(4, $occurrences); + } + + /** @test */ + public function canGenerateTodayOccurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '13:00', + 'end_time' => '15:00', + ])->save(); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + ]); + + $this->assertCount(2, $this->tag->today()); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'ignore_finished' => true, + ]); + + $this->assertCount(1, $this->tag->today()); + } + + /** @test */ + public function canGenerateUpcomingOccurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'limit' => 3, + ]); + + $occurrences = $this->tag->upcoming(); + + $this->assertCount(3, $occurrences); + } + + /** @test */ + public function canGenerateUpcomingLimitedOccurrences() + { + Entry::make() + ->collection('events') + ->slug('another-recurring-event') + ->id('another-recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'limit' => 3, + ]); + + $occurrences = $this->tag->upcoming(); + + $this->assertCount(3, $occurrences); + } + + /** @test */ + public function canPaginateUpcomingOccurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'paginate' => 2, + 'limit' => 10, + ]); + + Cascade::partialMock()->shouldReceive('get') + ->with('uri') + ->andReturn('/events'); + + $pagination = $this->tag->upcoming(); + + $this->assertArrayHasKey('results', $pagination); + $this->assertArrayHasKey('paginate', $pagination); + $this->assertArrayHasKey('total_results', $pagination); + + $this->assertCount(2, $pagination['results']); + $this->assertEquals(2, $pagination['total_results']); + $this->assertEquals('/events?page=2', $pagination['paginate']['next_page']); + } + + /** @test */ + public function canGenerateUpcomingOccurrencesWithTaxonomyTerms() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->id('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '17:00', + 'end_time' => '19:00', + ])->save(); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'from' => Carbon::now()->toDateString(), + 'to' => Carbon::now()->addDay()->toDateString(), + 'taxonomy:categories' => 'one', + ]); + + $occurrences = $this->tag->between(); + + $this->assertCount(1, $occurrences); + } + + /** @test */ + public function canGenerateUpcomingOccurrencesWithFilter() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->id('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '17:00', + 'end_time' => '19:00', + ])->save(); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'from' => Carbon::now()->toDateString(), + 'to' => Carbon::now()->addDay()->toDateString(), + 'title:contains' => 'Single', + ]); + + $occurrences = $this->tag->between(); + + $this->assertCount(1, $occurrences); + } + + /** @test */ + public function canGenerateDateEventDownloadLink() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'date' => now(), + 'event' => 'recurring-event', + ]); + + $url = $this->tag->downloadLink(); + + $this->assertEquals('http://localhost/!/events/ics?collection=events&date='.now()->toDateString().'&event=recurring-event', $url); + } + + /** @test */ + public function canGenerateEventDownloadLink() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'event' => 'recurring-event', + ]); + + $url = $this->tag->downloadLink(); + + $this->assertEquals('http://localhost/!/events/ics?collection=events&event=recurring-event', $url); + } + + /** @test */ + public function canSortOccurrencesDesc() + { + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'limit' => 3, + 'sort' => 'desc', + ]); + + $occurrences = $this->tag->upcoming(); + + $this->assertTrue($occurrences[0]->start->isAfter($occurrences[1]->start)); + $this->assertTrue($occurrences[1]->start->isAfter($occurrences[2]->start)); + } +} diff --git a/tests/Pest.php b/tests/Pest.php deleted file mode 100644 index fd279ad..0000000 --- a/tests/Pest.php +++ /dev/null @@ -1,45 +0,0 @@ -extend(Tests\TestCase::class)->in('Feature'); - -/* -|-------------------------------------------------------------------------- -| Expectations -|-------------------------------------------------------------------------- -| -| When you're writing tests, you often need to check that values meet certain conditions. The -| "expect()" function gives you access to a set of "expectations" methods that you can use -| to assert different things. Of course, you may extend the Expectation API at any time. -| -*/ - -expect()->extend('toBeOne', function () { - return $this->toBe(1); -}); - -/* -|-------------------------------------------------------------------------- -| Functions -|-------------------------------------------------------------------------- -| -| While Pest is very powerful out-of-the-box, you may have some testing code specific to your -| project that you don't want to repeat in every file. Here you can also expose helpers as -| global functions to help you to reduce the number of lines of code in your test files. -| -*/ - -function something() -{ - // .. -} diff --git a/tests/Unit/DayTest.php b/tests/Unit/DayTest.php index d9c2d48..5a5b9d0 100755 --- a/tests/Unit/DayTest.php +++ b/tests/Unit/DayTest.php @@ -1,27 +1,39 @@ '2019-11-23', - 'start_time' => '19:00', - ]; +class DayTest extends TestCase +{ + /** @test */ + public function canGetEndWhenNoEndTime() + { + $dayData = [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + ]; - $day = new Day(data: $dayData, timezone: 'America/Vancouver'); + $day = new Day(data: $dayData, timezone: 'America/Vancouver'); - expect($day->end())->toEqual(Carbon::parse('2019-11-23')->shiftTimezone('America/Vancouver')->endOfDay()); -}); + $this->assertEquals( + Carbon::parse('2019-11-23')->shiftTimezone('America/Vancouver')->endOfDay(), + $day->end() + ); + } -test('has no end time when no end time', function () { - $dayData = [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - ]; + /** @test */ + public function hasNoEndTimeWhenNoEndTime() + { + $dayData = [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + ]; - $day = new Day(data: $dayData, timezone: 'America/Vancouver'); + $day = new Day(data: $dayData, timezone: 'America/Vancouver'); - expect($day->hasEndTime())->toBeFalse(); -}); + $this->assertFalse($day->hasEndTime()); + } +} diff --git a/tests/Unit/EventFactoryTest.php b/tests/Unit/EventFactoryTest.php index a11d30a..3986c1e 100755 --- a/tests/Unit/EventFactoryTest.php +++ b/tests/Unit/EventFactoryTest.php @@ -1,80 +1,97 @@ collection('events') + ->data($data); -test('can get event type class', function (string $class, array $data) { - $entry = Entry::make() - ->collection('events') - ->data($data); - - expect(EventFactory::getTypeClass($entry))->toEqual($class); -})->with('provideEventData'); + $this->assertEquals($class, EventFactory::getTypeClass($entry)); + } -test('can create correct event type', function (string $class, array $data) { - $entry = Entry::make() - ->collection('events') - ->data($data); + /** + * @test + * + * @dataProvider provideEventData + */ + public function canCreateCorrectEventType(string $class, array $data) + { + $entry = Entry::make() + ->collection('events') + ->data($data); - expect(EventFactory::createFromEntry($entry))->toBeInstanceOf($class); -})->with('provideEventData'); + $this->assertInstanceOf($class, EventFactory::createFromEntry($entry)); + } -dataset('provideEventData', function () { - return [ - [ - SingleDayEvent::class, + public static function provideEventData() + { + return [ [ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'timezone' => 'America/Vancouver', + SingleDayEvent::class, + [ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'timezone' => 'America/Vancouver', + ], ], - ], - [ - SingleDayEvent::class, [ - 'multi_day' => true, - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'timezone' => 'America/Vancouver', + SingleDayEvent::class, + [ + 'multi_day' => true, + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'timezone' => 'America/Vancouver', + ], ], - ], - [ - RecurringEvent::class, [ - 'start_date' => Carbon::now()->toDateString(), - 'end_date' => Carbon::now()->addWeek()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'timezone' => 'America/Vancouver', + RecurringEvent::class, + [ + 'start_date' => Carbon::now()->toDateString(), + 'end_date' => Carbon::now()->addWeek()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'timezone' => 'America/Vancouver', + ], ], - ], - [ - MultiDayEvent::class, [ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - 'end_time' => '21:00', - ], - [ - 'date' => '2019-11-24', - 'start_time' => '11:00', - 'end_time' => '15:00', + MultiDayEvent::class, + [ + 'recurrence' => 'multi_day', + 'days' => [ + [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => '2019-11-24', + 'start_time' => '11:00', + 'end_time' => '15:00', + ], ], + 'timezone' => 'America/Vancouver', ], - 'timezone' => 'America/Vancouver', ], - ], - ]; -}); + ]; + } +} diff --git a/tests/Unit/EventsTest.php b/tests/Unit/EventsTest.php index 699f5b0..c927612 100755 --- a/tests/Unit/EventsTest.php +++ b/tests/Unit/EventsTest.php @@ -1,387 +1,416 @@ setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'end_date' => Carbon::now()->addDays(2)->toDateString(), - 'recurrence' => 'daily', - ])->save(); - - $event = tap(Entry::make() - ->collection('events') - ->slug('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '13:00', - ]))->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(now(), now()->addDays(2)->endOfDay()); - - $expectedStartDates = [ - now()->setTimeFromTimeString('11:00'), - now()->setTimeFromTimeString('13:00'), - now()->addDay()->setTimeFromTimeString('11:00'), - now()->addDays(2)->setTimeFromTimeString('11:00'), - ]; - expect($occurrences)->toHaveCount(4); - - expect($occurrences[0]->start)->toEqual($expectedStartDates[0]); - expect($occurrences[1]->start)->toEqual($expectedStartDates[1]); - expect($occurrences[2]->start)->toEqual($expectedStartDates[2]); - expect($occurrences[3]->start)->toEqual($expectedStartDates[3]); -}); - -test('can paginate upcoming occurrences', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->upcoming(10); - - expect($occurrences)->toHaveCount(10); - $paginator = Events::fromCollection(handle: 'events') - ->pagination(perPage: 2) - ->upcoming(10); - - expect($paginator)->toBeInstanceOf(LengthAwarePaginator::class); - expect($occurrences = $paginator->items())->toHaveCount(2); - expect($paginator->items()[1]->start)->toEqual(now()->addDay()->setTimeFromTimeString('11:00')); - - $paginator = Events::fromCollection(handle: 'events') - ->pagination(perPage: 3, page: 3) - ->upcoming(10); - - expect($paginator)->toBeInstanceOf(LengthAwarePaginator::class); - expect($occurrences = $paginator->items())->toHaveCount(3); - expect($paginator->currentPage())->toEqual(3); -}); - -test('can paginate occurrences between', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(now(), now()->addDays(9)->endOfDay()); - - expect($occurrences)->toHaveCount(10); - $paginator = Events::fromCollection(handle: 'events') - ->pagination(perPage: 2) - ->between(now(), now()->addDays(9)->endOfDay()); - - expect($paginator)->toBeInstanceOf(LengthAwarePaginator::class); - - expect($occurrences = $paginator->items())->toHaveCount(2); - - expect($paginator->items()[1]->start)->toEqual(now()->addDay()->setTimeFromTimeString('11:00')); -}); - -test('can filter events', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->filter('title:contains', 'Other') - ->between(now(), now()->addDays(9)->endOfDay()); - - expect($occurrences)->toHaveCount(10); -}); - -test('can filter multiple events', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event 2', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->filter('title:contains', 'Other') - ->filter('recurrence:is', 'daily') - ->between(now(), now()->addDays(9)->endOfDay()); - - expect($occurrences)->toHaveCount(10); -}); - -test('can filter by term events', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'categories' => ['one'], - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'categories' => ['two'], - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->terms('categories::two') - ->between(now(), now()->addDays(9)->endOfDay()); - - expect($occurrences)->toHaveCount(10); -}); - -test('can filter by filter events', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - Entry::make() - ->collection('events') - ->slug('other-event') - ->data([ - 'title' => 'Other Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->filter('title:contains', 'Recurring') - ->between(now(), now()->addDays(9)->endOfDay()); - - expect($occurrences)->toHaveCount(10); -}); - -test('can determine occurs at for single event', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $entry = Entry::make() - ->collection('events') - ->slug('single-event') - ->id('the-id') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - ]); - - $event = EventFactory::createFromEntry($entry); - - expect($event->occursOnDate(now()))->toBeTrue(); -}); - -test('can determine occurs at for multiday event', function () { - Carbon::setTestNow(now()); - - $entry = Entry::make() - ->slug('multi-day-event') - ->collection('events') - ->data([ - 'multi_day' => true, - 'days' => [ - [ - 'date' => now()->toDateString(), - 'start_time' => '19:00', - 'end_time' => '21:00', - ], - [ - 'date' => now()->addDay()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '15:00', +use TransformStudios\Events\Tests\TestCase; + +class EventsTest extends TestCase +{ + /** @test */ + public function canGenerateDatesWhenNowBeforeStart() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'end_date' => Carbon::now()->addDays(2)->toDateString(), + 'recurrence' => 'daily', + ])->save(); + + $event = tap(Entry::make() + ->collection('events') + ->slug('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '13:00', + ]))->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(now(), now()->addDays(2)->endOfDay()); + + $expectedStartDates = [ + now()->setTimeFromTimeString('11:00'), + now()->setTimeFromTimeString('13:00'), + now()->addDay()->setTimeFromTimeString('11:00'), + now()->addDays(2)->setTimeFromTimeString('11:00'), + ]; + $this->assertCount(4, $occurrences); + + $this->assertEquals($expectedStartDates[0], $occurrences[0]->start); + $this->assertEquals($expectedStartDates[1], $occurrences[1]->start); + $this->assertEquals($expectedStartDates[2], $occurrences[2]->start); + $this->assertEquals($expectedStartDates[3], $occurrences[3]->start); + } + + /** @test */ + public function canPaginateUpcomingOccurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->upcoming(10); + + $this->assertCount(10, $occurrences); + $paginator = Events::fromCollection(handle: 'events') + ->pagination(perPage: 2) + ->upcoming(10); + + $this->assertInstanceOf(LengthAwarePaginator::class, $paginator); + $this->assertCount(2, $occurrences = $paginator->items()); + $this->assertEquals(now()->addDay()->setTimeFromTimeString('11:00'), $paginator->items()[1]->start); + + $paginator = Events::fromCollection(handle: 'events') + ->pagination(perPage: 3, page: 3) + ->upcoming(10); + + $this->assertInstanceOf(LengthAwarePaginator::class, $paginator); + $this->assertCount(3, $occurrences = $paginator->items()); + $this->assertEquals(3, $paginator->currentPage()); + } + + /** @test */ + public function canPaginateOccurrencesBetween() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(now(), now()->addDays(9)->endOfDay()); + + $this->assertCount(10, $occurrences); + $paginator = Events::fromCollection(handle: 'events') + ->pagination(perPage: 2) + ->between(now(), now()->addDays(9)->endOfDay()); + + $this->assertInstanceOf(LengthAwarePaginator::class, $paginator); + + $this->assertCount(2, $occurrences = $paginator->items()); + + $this->assertEquals(now()->addDay()->setTimeFromTimeString('11:00'), $paginator->items()[1]->start); + } + + /** @test */ + public function canFilterEvents() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->filter('title:contains', 'Other') + ->between(now(), now()->addDays(9)->endOfDay()); + + $this->assertCount(10, $occurrences); + } + + /** @test */ + public function canFilterMultipleEvents() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event 2', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->filter('title:contains', 'Other') + ->filter('recurrence:is', 'daily') + ->between(now(), now()->addDays(9)->endOfDay()); + + $this->assertCount(10, $occurrences); + } + + /** @test */ + public function canFilterByTermEvents() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'categories' => ['one'], + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'categories' => ['two'], + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->terms('categories::two') + ->between(now(), now()->addDays(9)->endOfDay()); + + $this->assertCount(10, $occurrences); + } + + /** @test */ + public function canFilterByFilterEvents() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + Entry::make() + ->collection('events') + ->slug('other-event') + ->data([ + 'title' => 'Other Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->filter('title:contains', 'Recurring') + ->between(now(), now()->addDays(9)->endOfDay()); + + $this->assertCount(10, $occurrences); + } + + /** @test */ + public function canDetermineOccursAtForSingleEvent() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $entry = Entry::make() + ->collection('events') + ->slug('single-event') + ->id('the-id') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + ]); + + $event = EventFactory::createFromEntry($entry); + + $this->assertTrue($event->occursOnDate(now())); + } + + /** @test */ + public function canDetermineOccursAtForMultidayEvent() + { + Carbon::setTestNow(now()); + + $entry = Entry::make() + ->slug('multi-day-event') + ->collection('events') + ->data([ + 'multi_day' => true, + 'days' => [ + [ + 'date' => now()->toDateString(), + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => now()->addDay()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', + ], + [ + 'date' => now()->addDays(2)->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', + ], ], - [ - 'date' => now()->addDays(2)->toDateString(), - 'start_time' => '11:00', - 'end_time' => '15:00', + ]); + + $event = EventFactory::createFromEntry($entry); + + $this->assertFalse($event->occursOnDate(now()->subDay())); + $this->assertTrue($event->occursOnDate(now())); + $this->assertTrue($event->occursOnDate(now()->addDay())); + $this->assertTrue($event->occursOnDate(now()->addDays(2))); + $this->assertFalse($event->occursOnDate(now()->addDays(3))); + } + + /** @test */ + public function canExcludeDates() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'exclude_dates' => [['date' => Carbon::now()->addDay()->toDateString()]], + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(now(), now()->addDays(3)->endOfDay()); + + $this->assertCount(3, $occurrences); + } + + /** @test */ + public function canHandleEmptyExcludeDates() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + 'exclude_dates' => [['id' => 'random-id']], + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(now(), now()->addDays(3)->endOfDay()); + + $this->assertCount(4, $occurrences); + } + + /** @test */ + public function canFilterOurEventsWithNoStartDate() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->data([ + 'title' => 'Single Event', + 'start_time' => '11:00', + 'end_time' => '12:00', + ])->save(); + Entry::make() + ->collection('events') + ->slug('legacy-multi-day-event') + ->data([ + 'title' => 'Legacy Multi-day Event', + 'multi_day' => true, + 'days' => [ + ['date' => 'bad-date'], ], - ], - ]); - - $event = EventFactory::createFromEntry($entry); - - expect($event->occursOnDate(now()->subDay()))->toBeFalse(); - expect($event->occursOnDate(now()))->toBeTrue(); - expect($event->occursOnDate(now()->addDay()))->toBeTrue(); - expect($event->occursOnDate(now()->addDays(2)))->toBeTrue(); - expect($event->occursOnDate(now()->addDays(3)))->toBeFalse(); -}); - -test('can exclude dates', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'exclude_dates' => [['date' => Carbon::now()->addDay()->toDateString()]], - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(now(), now()->addDays(3)->endOfDay()); - - expect($occurrences)->toHaveCount(3); -}); - -test('can handle empty exclude dates', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - 'exclude_dates' => [['id' => 'random-id']], - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(now(), now()->addDays(3)->endOfDay()); - - expect($occurrences)->toHaveCount(4); -}); - -test('can filter our events with no start date', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->data([ - 'title' => 'Single Event', - 'start_time' => '11:00', - 'end_time' => '12:00', - ])->save(); - Entry::make() - ->collection('events') - ->slug('legacy-multi-day-event') - ->data([ - 'title' => 'Legacy Multi-day Event', - 'multi_day' => true, - 'days' => [ - ['date' => 'bad-date'], - ], - ])->save(); - Entry::make() - ->collection('events') - ->slug('legacy-multi-day-event-2') - ->data([ - 'title' => 'Legacy Multi-day Event', - 'multi_day' => true, - ])->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->upcoming(5); - - expect($occurrences)->toBeEmpty(); -}); + ])->save(); + Entry::make() + ->collection('events') + ->slug('legacy-multi-day-event-2') + ->data([ + 'title' => 'Legacy Multi-day Event', + 'multi_day' => true, + ])->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->upcoming(5); + + $this->assertEmpty($occurrences); + } +} diff --git a/tests/Unit/MultiDayEventsTest.php b/tests/Unit/MultiDayEventsTest.php index dc5d6d8..57605e2 100755 --- a/tests/Unit/MultiDayEventsTest.php +++ b/tests/Unit/MultiDayEventsTest.php @@ -1,121 +1,169 @@ slug('multi-day-event') - ->collection('events') - ->data([ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - 'end_time' => '21:00', - ], - [ - 'date' => '2019-11-24', - 'start_time' => '11:00', - 'end_time' => '15:00', - ], - [ - 'date' => '2019-11-25', - 'start_time' => '11:00', - 'end_time' => '15:00', - ], - ], - 'timezone' => 'America/Vancouver', - ]); - - $this->event = EventFactory::createFromEntry($entry); - - $noEndTimeEntry = Entry::make() - ->collection('events') - ->slug('no-end-time') - ->data([ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - ], - [ - 'date' => '2019-11-24', - 'start_time' => '15:00', +class MultiDayEventsTest extends TestCase +{ + /** @var MultiDayEvent */ + private $allDayEvent; + + /** @var MultiDayEvent */ + private $event; + + /** @var MultiDayEvent */ + private $noEndTimeEvnt; + + public function setUp(): void + { + parent::setUp(); + + Carbon::setTestNowAndTimezone(now(), 'America/Vancouver'); + + $entry = Entry::make() + ->slug('multi-day-event') + ->collection('events') + ->data([ + 'recurrence' => 'multi_day', + 'days' => [ + [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => '2019-11-24', + 'start_time' => '11:00', + 'end_time' => '15:00', + ], + [ + 'date' => '2019-11-25', + 'start_time' => '11:00', + 'end_time' => '15:00', + ], ], - ], - 'timezone' => 'America/Vancouver', - ]); - - $this->noEndTimeEvent = EventFactory::createFromEntry($noEndTimeEntry); - - $allDayEntry = Entry::make() - ->collection('events') - ->data([ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-20', + 'timezone' => 'America/Vancouver', + ]); + + $this->event = EventFactory::createFromEntry($entry); + + $noEndTimeEntry = Entry::make() + ->collection('events') + ->slug('no-end-time') + ->data([ + 'recurrence' => 'multi_day', + 'days' => [ + [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + ], + [ + 'date' => '2019-11-24', + 'start_time' => '15:00', + ], ], - [ - 'date' => '2019-11-21', + 'timezone' => 'America/Vancouver', + ]); + + $this->noEndTimeEvent = EventFactory::createFromEntry($noEndTimeEntry); + + $allDayEntry = Entry::make() + ->collection('events') + ->data([ + 'recurrence' => 'multi_day', + 'days' => [ + [ + 'date' => '2019-11-20', + ], + [ + 'date' => '2019-11-21', + ], ], - ], - 'timezone' => 'America/Vancouver', - ]); - $this->allDayEvent = EventFactory::createFromEntry($allDayEntry); -}); - -test('can create multi day event', function () { - expect($this->event instanceof MultiDayEvent)->toBeTrue(); - expect($this->allDayEvent instanceof MultiDayEvent)->toBeTrue(); - expect($this->noEndTimeEvent instanceof MultiDayEvent)->toBeTrue(); - expect($this->event->isMultiDay())->toBeTrue(); - expect($this->allDayEvent->isMultiDay())->toBeTrue(); - expect($this->noEndTimeEvent->isMultiDay())->toBeTrue(); -}); - -test('can get start', function () { - expect($this->event->start())->toEqual(Carbon::parse('2019-11-23 19:00')->shiftTimezone('America/Vancouver')); - expect($this->allDayEvent->start())->toEqual(Carbon::parse('2019-11-20 0:00')->shiftTimezone('America/Vancouver')); - expect($this->event->start()->timezone)->toEqual(Carbon::parse('2019-11-20 0:00')->shiftTimezone('America/Vancouver')->timezone); -}); - -test('no occurrences if now after end date', function () { - Carbon::setTestNow('2019-11-26'); - expect($this->event->nextOccurrences(1))->toBeEmpty(); -}); - -test('can generate next occurrence if before', function () { - Carbon::setTestNowAndTimezone('2019-11-22', 'America/Vancouver'); - - expect($this->event->nextOccurrences()[0]->start)->toEqual(Carbon::parse('2019-11-23')->setTimeFromTimeString('19:00:00')); - expect($this->event->nextOccurrences()[0]->end)->toEqual(Carbon::parse('2019-11-23')->setTimeFromTimeString('21:00')); -}); - -test('can generate next occurrence if during', function () { - Carbon::setTestNowAndTimezone('2019-11-24 10:00', 'America/Vancouver'); - expect($this->event->nextOccurrences()[0]->start)->toEqual(Carbon::parse('2019-11-24')->setTimeFromTimeString('11:00:00')); -}); - -test('can generate icalendar', function () { - $this->markTestSkipped('revisit'); - $events = $this->event->toICalendarEvents(); - - dd($events); -}); - -test('day is all day when no start and end time', function () { - $days = $this->allDayEvent->days(); - - expect($days[0]->isAllDay())->toBeTrue(); -}); \ No newline at end of file + 'timezone' => 'America/Vancouver', + ]); + $this->allDayEvent = EventFactory::createFromEntry($allDayEntry); + } + + /** @test */ + public function canCreateMultiDayEvent() + { + $this->assertTrue($this->event instanceof MultiDayEvent); + $this->assertTrue($this->allDayEvent instanceof MultiDayEvent); + $this->assertTrue($this->noEndTimeEvent instanceof MultiDayEvent); + $this->assertTrue($this->event->isMultiDay()); + $this->assertTrue($this->allDayEvent->isMultiDay()); + $this->assertTrue($this->noEndTimeEvent->isMultiDay()); + } + + /** @test */ + public function canGetStart() + { + $this->assertEquals( + Carbon::parse('2019-11-23 19:00')->shiftTimezone('America/Vancouver'), + $this->event->start() + ); + $this->assertEquals( + Carbon::parse('2019-11-20 0:00')->shiftTimezone('America/Vancouver'), + $this->allDayEvent->start() + ); + $this->assertEquals( + Carbon::parse('2019-11-20 0:00')->shiftTimezone('America/Vancouver')->timezone, + $this->event->start()->timezone + ); + } + + /** @test */ + public function noOccurrencesIfNowAfterEndDate() + { + Carbon::setTestNow('2019-11-26'); + $this->assertEmpty($this->event->nextOccurrences(1)); + } + + /** @test */ + public function canGenerateNextOccurrenceIfBefore() + { + Carbon::setTestNowAndTimezone('2019-11-22', 'America/Vancouver'); + + $this->assertEquals( + Carbon::parse('2019-11-23')->setTimeFromTimeString('19:00:00'), + $this->event->nextOccurrences()[0]->start + ); + $this->assertEquals( + Carbon::parse('2019-11-23')->setTimeFromTimeString('21:00'), + $this->event->nextOccurrences()[0]->end + ); + } + + /** @test */ + public function canGenerateNextOccurrenceIfDuring() + { + Carbon::setTestNowAndTimezone('2019-11-24 10:00', 'America/Vancouver'); + $this->assertEquals( + Carbon::parse('2019-11-24')->setTimeFromTimeString('11:00:00'), + $this->event->nextOccurrences()[0]->start + ); + } + + /** @test */ + public function canGenerateICalendar() + { + $this->markTestSkipped('revisit'); + $events = $this->event->toICalendarEvents(); + + dd($events); + } + + /** @test */ + public function dayIsAllDayWhenNoStartAndEndTime() + { + $days = $this->allDayEvent->days(); + + $this->assertTrue($days[0]->isAllDay()); + } +} diff --git a/tests/Unit/RecurringDailyEventsTest.php b/tests/Unit/RecurringDailyEventsTest.php index 6487576..a6b905e 100755 --- a/tests/Unit/RecurringDailyEventsTest.php +++ b/tests/Unit/RecurringDailyEventsTest.php @@ -1,216 +1,274 @@ collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'end_date' => Carbon::now()->addDays(2)->toDateString(), + 'recurrence' => 'daily', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow(now()->addDays(3)); + $nextOccurrences = $event->nextOccurrences(); + + $this->assertEmpty($nextOccurrences); + } + + /** @test */ + public function canGenerateNextDayIfNowIsBefore() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow($startDate->setTimeFromTimeString('10:59:00')); + + $nextOccurrences = $event->nextOccurrences(3); + + $this->assertCount(3, $nextOccurrences); + + $this->assertEquals($startDate, $nextOccurrences->first()->start); + } + + /** @test */ + public function canGenerateNextOccurrenceIfNowIsDuring() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'daily', + ]); + + Carbon::setTestNow($startDate->addMinutes(10)); + + $event = EventFactory::createFromEntry($recurringEntry); + $nextOccurrences = $event->nextOccurrences(); + + $this->assertEquals($startDate, $nextOccurrences[0]->start); + } + + // public function test_can_generate_next_day_if_after() + // { + // $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + + // $event = [ + // 'start_date' => $startDate->toDateString(), + // 'start_time' => '11:00', + // 'end_time' => '12:00', + // 'recurrence' => 'daily', + // ]; + + // Carbon::setTestNow($startDate->addMinute()); + + // $event = EventFactory::createFromArray($event); + + // $nextOccurrences = $event->nextOccurrences(1); + + // $this->assertEquals($startDate->addDay(), $nextDate->start()); + // } + + // public function test_can_generate_next_x_dates_from_today_before_event_time() + // { + // $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); + // $event = EventFactory::createFromArray( + // [ + // 'start_date' => $startDate->toDateString(), + // 'start_time' => '11:00', + // 'end_time' => '12:00', + // 'recurrence' => 'daily', + // ] + // ); + + // for ($x = 0; $x < 2; $x++) { + // $events[] = $startDate->copy()->addDays($x); + // } + + // $this->events->add($event); + + // Carbon::setTestNow($startDate->copy()->subMinutes(1)); + + // $nextDates = $this->events->upcoming(2); + + // $this->assertCount(2, $nextDates); + + // $this->assertEquals($events[0], $nextDates[0]->start()); + // $this->assertEquals($events[1], $nextDates[1]->start()); + // } + + // public function test_can_generate_next_x_dates_from_today() + // { + // $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); + // $event = EventFactory::createFromArray([ + // 'start_date' => $startDate->toDateString(), + // 'start_time' => '11:00', + // 'end_time' => '12:00', + // 'recurrence' => 'daily', + // ]); + + // for ($x = 0; $x < 3; $x++) { + // $events[] = $startDate->copy()->addDays($x); + // } + + // $this->events->add($event); + + // Carbon::setTestNow($startDate->copy()->addMinutes(1)); + + // $nextDates = $this->events->upcoming(3); + + // $this->assertCount(3, $nextDates); + + // $this->assertEquals($events[0], $nextDates[0]->start()); + // $this->assertEquals($events[1], $nextDates[1]->start()); + // $this->assertEquals($events[2], $nextDates[2]->start()); + // } + + // public function test_generates_all_occurrences_when_daily_after_start_date() + // { + // $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); + + // $event = EventFactory::createFromArray( + // [ + // 'start_date' => $startDate->copy()->addDay()->toDateString(), + // 'start_time' => '11:00', + // 'end_time' => '12:00', + // 'end_date' => $startDate->copy()->addDays(3)->toDateString(), + // 'recurrence' => 'daily', + // ] + // ); + + // for ($x = 2; $x <= 3; $x++) { + // $events[] = $startDate->copy()->addDays($x); + // } + + // $this->events->add($event); + + // Carbon::setTestNow($startDate->copy()->addDays(1)->addHour(1)); + // $nextEvents = $this->events->upcoming(3); + + // $this->assertCount(2, $nextEvents); + + // $this->assertEquals($events[0], $nextEvents[0]->start()); + // $this->assertEquals($events[1], $nextEvents[1]->start()); + // } + + // public function test_can_get_last_day_when_before() + // { + // Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); + + // $this->events->add(EventFactory::createFromArray([ + // 'id' => 'daily-event', + // 'start_date' => Carbon::now()->toDateString(), + // 'start_time' => '13:00', + // 'end_time' => '15:00', + // 'recurrence' => 'daily', + // 'end_date' => Carbon::now()->addDays(7)->toDateString(), + // ])); + + // $from = Carbon::now()->addDays(7); + // $to = Carbon::now()->endOfDay()->addDays(10); + + // $events = $this->events->all($from, $to); + + // $this->assertCount(1, $events); + // } + + // public function test_generates_all_daily_occurrences_single_event_from_to() + // { + // Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); + + // $this->events->add(EventFactory::createFromArray([ + // 'id' => 'daily-event', + // 'start_date' => Carbon::now()->toDateString(), + // 'start_time' => '13:00', + // 'end_time' => '15:00', + // 'recurrence' => 'daily', + // 'end_date' => Carbon::now()->addDays(7)->toDateString(), + // ])); + + // $from = Carbon::now()->subDays(1); + // $to = Carbon::now()->endOfDay()->addDays(10); + + // $events = $this->events->all($from, $to); + + // $this->assertCount(8, $events); + // } + + // public function test_generates_all_daily_occurrences_single_event_from_to_without_end_date() + // { + // Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); + + // $this->events->add(EventFactory::createFromArray([ + // 'id' => 'daily-event', + // 'start_date' => Carbon::now()->toDateString(), + // 'start_time' => '13:00', + // 'end_time' => '15:00', + // 'recurrence' => 'daily', + // ])); + + // $from = Carbon::now()->subDays(1); + // $to = Carbon::now()->endOfDay()->addDays(10); + + // $events = $this->events->all($from, $to); + + // $this->assertCount(11, $events); + // } + + // public function test_can_exclude_dates() + // { + // Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); + + // $this->events->add(EventFactory::createFromArray([ + // 'id' => 'daily-event', + // 'start_date' => Carbon::now()->toDateString(), + // 'start_time' => '13:00', + // 'end_time' => '15:00', + // 'recurrence' => 'daily', + // 'except' => [ + // ['date' => Carbon::now()->addDays(2)->toDateString()], + // ['date' => Carbon::now()->addDays(4)->toDateString()], + // ], + // ])); + + // $from = Carbon::now()->subDays(1); + // $to = Carbon::now()->endOfDay()->addDays(5); + + // $events = $this->events->all($from, $to)->toArray(); + + // $this->assertCount(4, $events); -test('null next date if now after end date', function () { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'end_date' => Carbon::now()->addDays(2)->toDateString(), - 'recurrence' => 'daily', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow(now()->addDays(3)); - $nextOccurrences = $event->nextOccurrences(); - - expect($nextOccurrences)->toBeEmpty(); -}); - -test('can generate next day if now is before', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow($startDate->setTimeFromTimeString('10:59:00')); - - $nextOccurrences = $event->nextOccurrences(3); - - expect($nextOccurrences)->toHaveCount(3); - - expect($nextOccurrences->first()->start)->toEqual($startDate); -}); - -test('can generate next occurrence if now is during', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'daily', - ]); - - Carbon::setTestNow($startDate->addMinutes(10)); - - $event = EventFactory::createFromEntry($recurringEntry); - $nextOccurrences = $event->nextOccurrences(); - - expect($nextOccurrences[0]->start)->toEqual($startDate); -}); - -// public function test_can_generate_next_day_if_after() -// { -// $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); -// $event = [ -// 'start_date' => $startDate->toDateString(), -// 'start_time' => '11:00', -// 'end_time' => '12:00', -// 'recurrence' => 'daily', -// ]; -// Carbon::setTestNow($startDate->addMinute()); -// $event = EventFactory::createFromArray($event); -// $nextOccurrences = $event->nextOccurrences(1); -// $this->assertEquals($startDate->addDay(), $nextDate->start()); -// } -// public function test_can_generate_next_x_dates_from_today_before_event_time() -// { -// $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); -// $event = EventFactory::createFromArray( -// [ -// 'start_date' => $startDate->toDateString(), -// 'start_time' => '11:00', -// 'end_time' => '12:00', -// 'recurrence' => 'daily', -// ] -// ); -// for ($x = 0; $x < 2; $x++) { -// $events[] = $startDate->copy()->addDays($x); -// } -// $this->events->add($event); -// Carbon::setTestNow($startDate->copy()->subMinutes(1)); -// $nextDates = $this->events->upcoming(2); -// $this->assertCount(2, $nextDates); -// $this->assertEquals($events[0], $nextDates[0]->start()); -// $this->assertEquals($events[1], $nextDates[1]->start()); -// } -// public function test_can_generate_next_x_dates_from_today() -// { -// $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); -// $event = EventFactory::createFromArray([ -// 'start_date' => $startDate->toDateString(), -// 'start_time' => '11:00', -// 'end_time' => '12:00', -// 'recurrence' => 'daily', -// ]); -// for ($x = 0; $x < 3; $x++) { -// $events[] = $startDate->copy()->addDays($x); -// } -// $this->events->add($event); -// Carbon::setTestNow($startDate->copy()->addMinutes(1)); -// $nextDates = $this->events->upcoming(3); -// $this->assertCount(3, $nextDates); -// $this->assertEquals($events[0], $nextDates[0]->start()); -// $this->assertEquals($events[1], $nextDates[1]->start()); -// $this->assertEquals($events[2], $nextDates[2]->start()); -// } -// public function test_generates_all_occurrences_when_daily_after_start_date() -// { -// $startDate = Carbon::now()->setTimeFromTimeString('11:00:00'); -// $event = EventFactory::createFromArray( -// [ -// 'start_date' => $startDate->copy()->addDay()->toDateString(), -// 'start_time' => '11:00', -// 'end_time' => '12:00', -// 'end_date' => $startDate->copy()->addDays(3)->toDateString(), -// 'recurrence' => 'daily', -// ] -// ); -// for ($x = 2; $x <= 3; $x++) { -// $events[] = $startDate->copy()->addDays($x); -// } -// $this->events->add($event); -// Carbon::setTestNow($startDate->copy()->addDays(1)->addHour(1)); -// $nextEvents = $this->events->upcoming(3); -// $this->assertCount(2, $nextEvents); -// $this->assertEquals($events[0], $nextEvents[0]->start()); -// $this->assertEquals($events[1], $nextEvents[1]->start()); -// } -// public function test_can_get_last_day_when_before() -// { -// Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); -// $this->events->add(EventFactory::createFromArray([ -// 'id' => 'daily-event', -// 'start_date' => Carbon::now()->toDateString(), -// 'start_time' => '13:00', -// 'end_time' => '15:00', -// 'recurrence' => 'daily', -// 'end_date' => Carbon::now()->addDays(7)->toDateString(), -// ])); -// $from = Carbon::now()->addDays(7); -// $to = Carbon::now()->endOfDay()->addDays(10); -// $events = $this->events->all($from, $to); -// $this->assertCount(1, $events); -// } -// public function test_generates_all_daily_occurrences_single_event_from_to() -// { -// Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); -// $this->events->add(EventFactory::createFromArray([ -// 'id' => 'daily-event', -// 'start_date' => Carbon::now()->toDateString(), -// 'start_time' => '13:00', -// 'end_time' => '15:00', -// 'recurrence' => 'daily', -// 'end_date' => Carbon::now()->addDays(7)->toDateString(), -// ])); -// $from = Carbon::now()->subDays(1); -// $to = Carbon::now()->endOfDay()->addDays(10); -// $events = $this->events->all($from, $to); -// $this->assertCount(8, $events); -// } -// public function test_generates_all_daily_occurrences_single_event_from_to_without_end_date() -// { -// Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); -// $this->events->add(EventFactory::createFromArray([ -// 'id' => 'daily-event', -// 'start_date' => Carbon::now()->toDateString(), -// 'start_time' => '13:00', -// 'end_time' => '15:00', -// 'recurrence' => 'daily', -// ])); -// $from = Carbon::now()->subDays(1); -// $to = Carbon::now()->endOfDay()->addDays(10); -// $events = $this->events->all($from, $to); -// $this->assertCount(11, $events); -// } -// public function test_can_exclude_dates() -// { -// Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); -// $this->events->add(EventFactory::createFromArray([ -// 'id' => 'daily-event', -// 'start_date' => Carbon::now()->toDateString(), -// 'start_time' => '13:00', -// 'end_time' => '15:00', -// 'recurrence' => 'daily', -// 'except' => [ -// ['date' => Carbon::now()->addDays(2)->toDateString()], -// ['date' => Carbon::now()->addDays(4)->toDateString()], -// ], -// ])); -// $from = Carbon::now()->subDays(1); -// $to = Carbon::now()->endOfDay()->addDays(5); -// $events = $this->events->all($from, $to)->toArray(); -// $this->assertCount(4, $events); -// $this->assertEquals(Carbon::now()->toDateString(), $events[0]['start_date']); -// $this->assertEquals(Carbon::now()->addDays(1)->toDateString(), $events[1]['start_date']); -// $this->assertEquals(Carbon::now()->addDays(3)->toDateString(), $events[2]['start_date']); -// $this->assertEquals(Carbon::now()->addDays(5)->toDateString(), $events[3]['start_date']); -// } \ No newline at end of file + // $this->assertEquals(Carbon::now()->toDateString(), $events[0]['start_date']); + // $this->assertEquals(Carbon::now()->addDays(1)->toDateString(), $events[1]['start_date']); + // $this->assertEquals(Carbon::now()->addDays(3)->toDateString(), $events[2]['start_date']); + // $this->assertEquals(Carbon::now()->addDays(5)->toDateString(), $events[3]['start_date']); + // } +} diff --git a/tests/Unit/RecurringEventsTest.php b/tests/Unit/RecurringEventsTest.php index 5a06c26..587145c 100755 --- a/tests/Unit/RecurringEventsTest.php +++ b/tests/Unit/RecurringEventsTest.php @@ -1,62 +1,72 @@ collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'recurrence' => 'daily', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + $this->assertTrue($event instanceof RecurringEvent); + $this->assertTrue($event->isRecurring()); + $this->assertFalse($event->isMultiDay()); + } + + /** @test */ + public function wontCreateRecurringEventWhenMultiDay() + { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'recurrence' => 'multi_day', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + $this->assertTrue($event instanceof SingleDayEvent); + $this->assertFalse($event->isRecurring()); + $this->assertFalse($event->isMultiDay()); + } + + /** @test */ + public function canShowLastOccurrenceWhenNoEndTime() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $recurringEntry = tap(Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->addDays(1)->toDateString(), + 'start_time' => '22:00', + 'recurrence' => 'daily', + 'end_date' => Carbon::now()->addDays(2)->toDateString(), + 'timezone' => 'America/Chicago', + ]))->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(Carbon::now(), Carbon::now()->addDays(5)->endOfDay()); -test('can create recurring event', function () { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'recurrence' => 'daily', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - expect($event instanceof RecurringEvent)->toBeTrue(); - expect($event->isRecurring())->toBeTrue(); - expect($event->isMultiDay())->toBeFalse(); -}); - -test('wont create recurring event when multi day', function () { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'recurrence' => 'multi_day', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - expect($event instanceof SingleDayEvent)->toBeTrue(); - expect($event->isRecurring())->toBeFalse(); - expect($event->isMultiDay())->toBeFalse(); -}); - -test('can show last occurrence when no end time', function () { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $recurringEntry = tap(Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->addDays(1)->toDateString(), - 'start_time' => '22:00', - 'recurrence' => 'daily', - 'end_date' => Carbon::now()->addDays(2)->toDateString(), - 'timezone' => 'America/Chicago', - ]))->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(Carbon::now(), Carbon::now()->addDays(5)->endOfDay()); - - expect($occurrences)->toHaveCount(2); -}); + $this->assertCount(2, $occurrences); + } +} diff --git a/tests/Unit/RecurringEveryXEventsTest.php b/tests/Unit/RecurringEveryXEventsTest.php index 87bf15c..ad46b16 100755 --- a/tests/Unit/RecurringEveryXEventsTest.php +++ b/tests/Unit/RecurringEveryXEventsTest.php @@ -1,252 +1,275 @@ collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'weeks', + ]); -test('can create every xevent', function () { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'weeks', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - expect($event)->toBeInstanceOf(RecurringEvent::class); -}); - -test('no occurences when now after end date', function () { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'end_date' => Carbon::now()->addDays(2)->toDateString(), - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow(now()->addDays(3)); - $nextOccurrences = $event->nextOccurrences(); + $event = EventFactory::createFromEntry($recurringEntry); - expect($nextOccurrences)->toBeEmpty(); -}); + $this->assertInstanceOf(RecurringEvent::class, $event); + } -test('can generate occurrence if now before', function () { - $startDate = Carbon::now()->addDay()->setTimeFromTimeString('11:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); + /** @test */ + public function noOccurencesWhenNowAfterEndDate() + { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'end_date' => Carbon::now()->addDays(2)->toDateString(), + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - $occurrences = EventFactory::createFromEntry($recurringEntry) - ->nextOccurrences(1); + $event = EventFactory::createFromEntry($recurringEntry); - expect($occurrences)->toHaveCount(1); + Carbon::setTestNow(now()->addDays(3)); + $nextOccurrences = $event->nextOccurrences(); - expect($occurrences[0]->start)->toEqual($startDate); + $this->assertEmpty($nextOccurrences); + } - Carbon::setTestNow(now()->setTimeFromTimeString('10:59:59')); - $occurrences = EventFactory::createFromEntry($recurringEntry) - ->nextOccurrences(1); + /** @test */ + public function canGenerateOccurrenceIfNowBefore() + { + $startDate = Carbon::now()->addDay()->setTimeFromTimeString('11:00'); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - expect($occurrences[0]->start)->toEqual($startDate); -}); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); -test('can generate occurrence if during', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); + $this->assertCount(1, $occurrences); - Carbon::setTestNow($startDate->addMinutes(10)); - $occurrences = EventFactory::createFromEntry($recurringEntry) - ->nextOccurrences(1); + $this->assertEquals($startDate, $occurrences[0]->start); - expect($occurrences[0]->start)->toEqual($startDate); -}); + Carbon::setTestNow(now()->setTimeFromTimeString('10:59:59')); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); -test('can generate occurrence if now after first date', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + $this->assertEquals($startDate, $occurrences[0]->start); + } - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); + /** @test */ + public function canGenerateOccurrenceIfDuring() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - Carbon::setTestNow($startDate->addMinutes(1)->addHour()); + Carbon::setTestNow($startDate->addMinutes(10)); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); - $event = EventFactory::createFromEntry($recurringEntry); + $this->assertEquals($startDate, $occurrences[0]->start); + } - $occurrences = $event->nextOccurrences(1); + /** @test */ + public function canGenerateOccurrenceIfNowAfterFirstDate() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - expect($occurrences[0]->start)->toEqual($startDate->addDays(2)); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - // $nextDate = $event->upcomingDate(Carbon::now()->addDays(2)); - // $this->assertEquals($startDate, $nextDate->start()); -}); + Carbon::setTestNow($startDate->addMinutes(1)->addHour()); -test('can generate next occurrence in weeks if now after start', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + $event = EventFactory::createFromEntry($recurringEntry); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'weeks', - ]); + $occurrences = $event->nextOccurrences(1); - Carbon::setTestNow($startDate->addHours(2)); + $this->assertEquals($startDate->addDays(2), $occurrences[0]->start); - $event = EventFactory::createFromEntry($recurringEntry); + // $nextDate = $event->upcomingDate(Carbon::now()->addDays(2)); - $occurrences = $event->nextOccurrences(1); + // $this->assertEquals($startDate, $nextDate->start()); + } - expect($occurrences[0]->start)->toEqual($startDate->addWeeks(2)); -}); + /** @test */ + public function canGenerateNextOccurrenceInWeeksIfNowAfterStart() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); -test('can generate next occurrence if now after weeks', function () { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => '2021-01-18', - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'weeks', - ]); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'weeks', + ]); - $event = EventFactory::createFromEntry($recurringEntry); + Carbon::setTestNow($startDate->addHours(2)); - Carbon::setTestNow(Carbon::parse('2021-03-04')->setTimeFromTimeString('11:00:00')); + $event = EventFactory::createFromEntry($recurringEntry); - $occurrences = $event->nextOccurrences(1); + $occurrences = $event->nextOccurrences(1); - expect($occurrences)->not->toBeEmpty(); + $this->assertEquals($startDate->addWeeks(2), $occurrences[0]->start); + } - expect($occurrences[0]->start)->toEqual(Carbon::parse('2021-03-15')->setTimeFromTimeString('11:00:00')); -}); + /** @test */ + public function canGenerateNextOccurrenceIfNow_after_weeks() + { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => '2021-01-18', + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'weeks', + ]); -test('can generate next occurrence if now during months', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + $event = EventFactory::createFromEntry($recurringEntry); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'months', - ]); + Carbon::setTestNow(Carbon::parse('2021-03-04')->setTimeFromTimeString('11:00:00')); - Carbon::setTestNow($startDate->addMinutes(1)); + $occurrences = $event->nextOccurrences(1); - $event = EventFactory::createFromEntry($recurringEntry); + $this->assertNotEmpty($occurrences); - $occurrences = $event->nextOccurrences(1); + $this->assertEquals(Carbon::parse('2021-03-15')->setTimeFromTimeString('11:00:00'), $occurrences[0]->start); + } - expect($occurrences[0]->start)->toEqual($startDate->setTimeFromTimeString('11:00:00')); -}); + /** @test */ + public function canGenerateNextOccurrenceIfNowDuringMonths() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); -test('can generate next xoccurrences from today before event time', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - $recurringEntry = Entry::make() - ->collection('events') - ->data([ + $recurringEntry = Entry::make() + ->collection('events') + ->data([ 'start_date' => $startDate->toDateString(), 'start_time' => '11:00', 'end_time' => '12:00', 'recurrence' => 'every', 'interval' => 2, - 'period' => 'days', - ]); - $event = EventFactory::createFromEntry($recurringEntry); + 'period' => 'months', + ]); - for ($x = 0; $x < 2; $x++) { - $events[] = $startDate->addDays($x * 2); - } + Carbon::setTestNow($startDate->addMinutes(1)); - Carbon::setTestNow($startDate->subMinutes(1)); + $event = EventFactory::createFromEntry($recurringEntry); - $occurrences = $event->nextOccurrences(2); + $occurrences = $event->nextOccurrences(1); - expect($occurrences)->toHaveCount(2); - - expect($occurrences[0]->start)->toEqual($events[0]); - expect($occurrences[1]->start)->toEqual($events[1]); -}); + $this->assertEquals($startDate->setTimeFromTimeString('11:00:00'), $occurrences[0]->start); + } -test('can generate all occurrences when after start date daily', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + /** @test */ + public function canGenerateNextXOccurrencesFromTodayBeforeEventTime() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); + $event = EventFactory::createFromEntry($recurringEntry); + + for ($x = 0; $x < 2; $x++) { + $events[] = $startDate->addDays($x * 2); + } + + Carbon::setTestNow($startDate->subMinutes(1)); + + $occurrences = $event->nextOccurrences(2); + + $this->assertCount(2, $occurrences); + + $this->assertEquals($events[0], $occurrences[0]->start); + $this->assertEquals($events[1], $occurrences[1]->start); + } - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->addDay()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'end_date' => $startDate->addDays(5)->toDateString(), - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', - ]); + /** @test */ + public function canGenerateAllOccurrencesWhenAfterStartDateDaily() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - for ($x = 1; $x <= 2; $x++) { - $events[] = $startDate->addDays($x * 2 + 1); - } + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->addDay()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'end_date' => $startDate->addDays(5)->toDateString(), + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); - $event = EventFactory::createFromEntry($recurringEntry); + for ($x = 1; $x <= 2; $x++) { + $events[] = $startDate->addDays($x * 2 + 1); + } - Carbon::setTestNow($startDate->addDays(1)->addHour(2)); - $occurrences = $event->nextOccurrences(5); + $event = EventFactory::createFromEntry($recurringEntry); - expect($occurrences)->toHaveCount(2); + Carbon::setTestNow($startDate->addDays(1)->addHour(2)); + $occurrences = $event->nextOccurrences(5); - expect($occurrences[0]->start)->toEqual($events[0]); - expect($occurrences[1]->start)->toEqual($events[1]); -}); + $this->assertCount(2, $occurrences); -/* + $this->assertEquals($events[0], $occurrences[0]->start); + $this->assertEquals($events[1], $occurrences[1]->start); + } + /* public function test_can_get_last_day_when_before() { Carbon::setTestNow(Carbon::now()->setTimeFromTimeString('10:30')); @@ -361,4 +384,5 @@ public function test_returns_null_when_dates_between_dont_have_event() $this->assertEmpty($dates); } -*/ \ No newline at end of file +*/ +} diff --git a/tests/Unit/SingleDayEventsTest.php b/tests/Unit/SingleDayEventsTest.php index 1381c11..ebe2242 100755 --- a/tests/Unit/SingleDayEventsTest.php +++ b/tests/Unit/SingleDayEventsTest.php @@ -1,146 +1,164 @@ collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'timezone' => 'America/Vancouver', - ]); - - $event = EventFactory::createFromEntry($entry); - - expect($event instanceof SingleDayEvent)->toBeTrue(); - expect($event->isRecurring())->toBeFalse(); - expect($event->isMultiDay())->toBeFalse(); - expect($event->hasEndTime())->toBeTrue(); - expect($event->start()->timezone)->toEqual(new CarbonTimeZone('America/Vancouver')); - expect($event->end()->timezone)->toEqual(new CarbonTimeZone('America/Vancouver')); -}); - -test('can create single all day event', function () { - $entry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'all_day' => true, - ]); - - $event = EventFactory::createFromEntry($entry); - - expect($event instanceof SingleDayEvent)->toBeTrue(); - expect($event->isAllDay())->toBeTrue(); -}); - -test('end is end of day when no end time', function () { - Carbon::setTestNow(now()); - - $entry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - ]); - - $event = EventFactory::createFromEntry($entry); - - expect($event->endTime())->toEqual('23:59:59'); - $nextOccurrences = $event->nextOccurrences(); - - expect($nextOccurrences[0]->has_end_time)->toBeFalse(); - expect($nextOccurrences[0]->end)->toEqual(now()->endOfDay()->setMicrosecond(0)); -}); - -test('empty occurrences if now after end date', function () { - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow(now()->addDays(1)); - $nextOccurrences = $event->nextOccurrences(); - - expect($nextOccurrences)->toBeEmpty(); -}); - -test('can generate next day if now is before', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - - $recurringEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - ]); - - $event = EventFactory::createFromEntry($recurringEntry); - - Carbon::setTestNow($startDate->setTimeFromTimeString('10:59:00')); - - $nextOccurrences = $event->nextOccurrences(2); - - expect($nextOccurrences)->toHaveCount(1); - - expect($nextOccurrences->first()->start)->toEqual($startDate); -}); - -test('can generate next occurrence if now is during', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - $single = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - ]); - - $singleNoEndTime = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - ]); - - Carbon::setTestNow($startDate->addMinutes(10)); - - $event = EventFactory::createFromEntry($single); - $noEndTimeEvent = EventFactory::createFromEntry($singleNoEndTime); - $nextOccurrences = $event->nextOccurrences(); - - expect($nextOccurrences[0]->start)->toEqual($startDate); - expect($noEndTimeEvent->nextOccurrences()[0]->start)->toEqual($startDate); -}); - -test('can supplement no end time', function () { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); - $noEndTimeEntry = Entry::make() - ->collection('events') - ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - ]); - - Carbon::setTestNow($startDate->addMinutes(10)); - - $event = EventFactory::createFromEntry($noEndTimeEntry); - $nextOccurrences = $event->nextOccurrences(); - - expect($nextOccurrences[0]->has_end_time)->toBeFalse(); -}); +class SingleDayEventsTest extends TestCase +{ + /** @test */ + public function canCreateSingleEvent() + { + $entry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'timezone' => 'America/Vancouver', + ]); + + $event = EventFactory::createFromEntry($entry); + + $this->assertTrue($event instanceof SingleDayEvent); + $this->assertFalse($event->isRecurring()); + $this->assertFalse($event->isMultiDay()); + $this->assertTrue($event->hasEndTime()); + $this->assertEquals(new CarbonTimeZone('America/Vancouver'), $event->start()->timezone); + $this->assertEquals(new CarbonTimeZone('America/Vancouver'), $event->end()->timezone); + } + + /** @test */ + public function canCreateSingleAllDayEvent() + { + $entry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'all_day' => true, + ]); + + $event = EventFactory::createFromEntry($entry); + + $this->assertTrue($event instanceof SingleDayEvent); + $this->assertTrue($event->isAllDay()); + } + + /** @test */ + public function endIsEndOfDayWhenNoEndTime() + { + Carbon::setTestNow(now()); + + $entry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + ]); + + $event = EventFactory::createFromEntry($entry); + + $this->assertEquals('23:59:59', $event->endTime()); + $nextOccurrences = $event->nextOccurrences(); + + $this->assertFalse($nextOccurrences[0]->has_end_time); + $this->assertEquals(now()->endOfDay()->setMicrosecond(0), $nextOccurrences[0]->end); + } + + /** @test */ + public function emptyOccurrencesIfNowAfterEndDate() + { + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow(now()->addDays(1)); + $nextOccurrences = $event->nextOccurrences(); + + $this->assertEmpty($nextOccurrences); + } + + /** @test */ + public function canGenerateNextDayIfNowIsBefore() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + + $recurringEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + ]); + + $event = EventFactory::createFromEntry($recurringEntry); + + Carbon::setTestNow($startDate->setTimeFromTimeString('10:59:00')); + + $nextOccurrences = $event->nextOccurrences(2); + + $this->assertCount(1, $nextOccurrences); + + $this->assertEquals($startDate, $nextOccurrences->first()->start); + } + + /** @test */ + public function canGenerateNextOccurrenceIfNowIsDuring() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + $single = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + ]); + + $singleNoEndTime = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + ]); + + Carbon::setTestNow($startDate->addMinutes(10)); + + $event = EventFactory::createFromEntry($single); + $noEndTimeEvent = EventFactory::createFromEntry($singleNoEndTime); + $nextOccurrences = $event->nextOccurrences(); + + $this->assertEquals($startDate, $nextOccurrences[0]->start); + $this->assertEquals($startDate, $noEndTimeEvent->nextOccurrences()[0]->start); + } + + /** @test */ + public function canSupplementNoEndTime() + { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); + $noEndTimeEntry = Entry::make() + ->collection('events') + ->data([ + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + ]); + + Carbon::setTestNow($startDate->addMinutes(10)); + + $event = EventFactory::createFromEntry($noEndTimeEntry); + $nextOccurrences = $event->nextOccurrences(); + + $this->assertFalse($nextOccurrences[0]->has_end_time); + } +} From 9048407d59220a71520d719460815377169ed447 Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 16:08:45 -0800 Subject: [PATCH 06/13] suite runs now, at least --- composer.json | 6 +- phpunit.xml | 6 - tests/Feature/EventsOffsetTest.php | 212 ++++++++++++++-------------- tests/Feature/IcsControllerTest.php | 15 +- tests/Feature/TagTest.php | 31 ++-- tests/Unit/DayTest.php | 4 +- tests/Unit/EventFactoryTest.php | 4 +- tests/Unit/EventsTest.php | 24 ++-- 8 files changed, 143 insertions(+), 159 deletions(-) diff --git a/composer.json b/composer.json index 5002b64..7142f99 100644 --- a/composer.json +++ b/composer.json @@ -45,9 +45,9 @@ }, "require-dev": { "mockery/mockery": "^1.3.1", - "nunomaduro/collision": "^6.0 || ^7.0", - "phpunit/phpunit": "^9.0 || ^10.0", - "orchestra/testbench": "^7.0 || ^8.0", + "nunomaduro/collision": "^6.0 || ^7.0 || ^8.0", + "phpunit/phpunit": "^9.0 || ^10.0 || ^11.0", + "orchestra/testbench": "^7.0 || ^8.0 || ^9.0", "spatie/laravel-ray": "^1.35", "spatie/test-time": "^1.2" }, diff --git a/phpunit.xml b/phpunit.xml index 18f9dca..7d3ac12 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -2,12 +2,6 @@ - - ./tests/Unit - - - ./tests/Feature - ./tests diff --git a/tests/Feature/EventsOffsetTest.php b/tests/Feature/EventsOffsetTest.php index d947ef1..f81e1d6 100644 --- a/tests/Feature/EventsOffsetTest.php +++ b/tests/Feature/EventsOffsetTest.php @@ -3,118 +3,114 @@ namespace TransformStudios\Events\Tests\Feature; use Illuminate\Support\Carbon; -use Statamic\Facades\Cascade; use Statamic\Facades\Entry; use TransformStudios\Events\Tags\Events; -use TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk; use TransformStudios\Events\Tests\TestCase; class EventsOffsetTest extends TestCase { - use PreventSavingStacheItemsToDisk; - - private Events $tag; - - public function setUp(): void - { - parent::setUp(); - - Entry::make() - ->collection('events') - ->slug('recurring-event') - ->id('recurring-event') - ->data([ - 'title' => 'Recurring Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'weekly', - 'categories' => ['one'], - ])->save(); - - $this->tag = app(Events::class); - } - - /** @test */ - public function canOffsetUpcomingOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'limit' => 5, - 'offset' => 2, - ]); - - $occurrences = $this->tag->upcoming(); - - $this->assertCount(3, $occurrences); - } - - /** @test */ - public function canOffsetBetweenOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'from' => Carbon::now()->toDateString(), - 'to' => Carbon::now()->addWeek(3), - 'offset' => 2, - ]); - - $occurrences = $this->tag->between(); - - $this->assertCount(2, $occurrences); - } - - /** @test */ - public function canOffsetTodayOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); - - Entry::make() - ->collection('events') - ->slug('single-event') - ->data([ - 'title' => 'Single Event', - 'start_date' => Carbon::now()->toDateString(), - 'start_time' => '13:00', - 'end_time' => '15:00', - ])->save(); - - $this->tag->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'offset' => 1, - ]); - - $this->assertCount(1, $this->tag->today()); - - $this->tag->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'ignore_finished' => true, - 'offset' => 1, - ]); - - $this->assertCount(0, $this->tag->today()); - } - - /** @test */ - public function canOffsetSingleDayOccurrences() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $this->tag->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'offset' => 1, - ]); - - $this->assertCount(0, $this->tag->today()); - } + private Events $tag; + + protected function setUp(): void + { + parent::setUp(); + + Entry::make() + ->collection('events') + ->slug('recurring-event') + ->id('recurring-event') + ->data([ + 'title' => 'Recurring Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'weekly', + 'categories' => ['one'], + ])->save(); + + $this->tag = app(Events::class); + } + + /** @test */ + public function can_offset_upcoming_occurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'limit' => 5, + 'offset' => 2, + ]); + + $occurrences = $this->tag->upcoming(); + + $this->assertCount(3, $occurrences); + } + + /** @test */ + public function can_offset_between_occurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'from' => Carbon::now()->toDateString(), + 'to' => Carbon::now()->addWeek(3), + 'offset' => 2, + ]); + + $occurrences = $this->tag->between(); + + $this->assertCount(2, $occurrences); + } + + /** @test */ + public function can_offset_today_occurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); + + Entry::make() + ->collection('events') + ->slug('single-event') + ->data([ + 'title' => 'Single Event', + 'start_date' => Carbon::now()->toDateString(), + 'start_time' => '13:00', + 'end_time' => '15:00', + ])->save(); + + $this->tag->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'offset' => 1, + ]); + + $this->assertCount(1, $this->tag->today()); + + $this->tag->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'ignore_finished' => true, + 'offset' => 1, + ]); + + $this->assertCount(0, $this->tag->today()); + } + + /** @test */ + public function can_offset_single_day_occurrences() + { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'offset' => 1, + ]); + + $this->assertCount(0, $this->tag->today()); + } } diff --git a/tests/Feature/IcsControllerTest.php b/tests/Feature/IcsControllerTest.php index 3dcf1ec..8e6cc2f 100755 --- a/tests/Feature/IcsControllerTest.php +++ b/tests/Feature/IcsControllerTest.php @@ -4,14 +4,11 @@ use Illuminate\Support\Carbon; use Statamic\Facades\Entry; -use TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk; use TransformStudios\Events\Tests\TestCase; class IcsControllerTest extends TestCase { - use PreventSavingStacheItemsToDisk; - - public function setUp(): void + protected function setUp(): void { parent::setUp(); @@ -29,7 +26,7 @@ public function setUp(): void } /** @test */ - public function canCreateSingleDayEventIcsFile() + public function can_create_single_day_event_ics_file() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -43,7 +40,7 @@ public function canCreateSingleDayEventIcsFile() } /** @test */ - public function canCreateSingleDayRecurringEventIcsFile() + public function can_create_single_day_recurring_event_ics_file() { Carbon::setTestNow(now()->addDay()->setTimeFromTimeString('10:00')); @@ -73,7 +70,7 @@ public function canCreateSingleDayRecurringEventIcsFile() } /** @test */ - public function canCreateSingleDayMultidayEventIcsFile() + public function can_create_single_day_multiday_event_ics_file() { Carbon::setTestNow(now()); @@ -117,7 +114,7 @@ public function canCreateSingleDayMultidayEventIcsFile() } /** @test */ - public function throws404ErrorWhenEventDoesNotOccurOnDate() + public function throws404_error_when_event_does_not_occur_on_date() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -128,7 +125,7 @@ public function throws404ErrorWhenEventDoesNotOccurOnDate() } /** @test */ - public function throws404ErrorWhenEventDoesNotExist() + public function throws404_error_when_event_does_not_exist() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); diff --git a/tests/Feature/TagTest.php b/tests/Feature/TagTest.php index 141199d..94fb5f2 100755 --- a/tests/Feature/TagTest.php +++ b/tests/Feature/TagTest.php @@ -7,16 +7,13 @@ use Statamic\Facades\Entry; use Statamic\Support\Arr; use TransformStudios\Events\Tags\Events; -use TransformStudios\Events\Tests\PreventSavingStacheItemsToDisk; use TransformStudios\Events\Tests\TestCase; class TagTest extends TestCase { - use PreventSavingStacheItemsToDisk; - private Events $tag; - public function setUp(): void + protected function setUp(): void { parent::setUp(); @@ -37,7 +34,7 @@ public function setUp(): void } /** @test */ - public function canGenerateBetweenOccurrences() + public function can_generate_between_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -55,7 +52,7 @@ public function canGenerateBetweenOccurrences() } /** @test */ - public function canGenerateBetweenOccurrencesWithDefaultFrom() + public function can_generate_between_occurrences_with_default_from() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -72,7 +69,7 @@ public function canGenerateBetweenOccurrencesWithDefaultFrom() } /** @test */ - public function canGenerateCalendarOccurrences() + public function can_generate_calendar_occurrences() { Carbon::setTestNow('jan 1, 2022 10:00'); @@ -117,7 +114,7 @@ public function canGenerateCalendarOccurrences() } /** @test */ - public function canGenerateInOccurrences() + public function can_generate_in_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -134,7 +131,7 @@ public function canGenerateInOccurrences() } /** @test */ - public function canGenerateTodayOccurrences() + public function can_generate_today_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); @@ -167,7 +164,7 @@ public function canGenerateTodayOccurrences() } /** @test */ - public function canGenerateUpcomingOccurrences() + public function can_generate_upcoming_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -184,7 +181,7 @@ public function canGenerateUpcomingOccurrences() } /** @test */ - public function canGenerateUpcomingLimitedOccurrences() + public function can_generate_upcoming_limited_occurrences() { Entry::make() ->collection('events') @@ -213,7 +210,7 @@ public function canGenerateUpcomingLimitedOccurrences() } /** @test */ - public function canPaginateUpcomingOccurrences() + public function can_paginate_upcoming_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -241,7 +238,7 @@ public function canPaginateUpcomingOccurrences() } /** @test */ - public function canGenerateUpcomingOccurrencesWithTaxonomyTerms() + public function can_generate_upcoming_occurrences_with_taxonomy_terms() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -271,7 +268,7 @@ public function canGenerateUpcomingOccurrencesWithTaxonomyTerms() } /** @test */ - public function canGenerateUpcomingOccurrencesWithFilter() + public function can_generate_upcoming_occurrences_with_filter() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -301,7 +298,7 @@ public function canGenerateUpcomingOccurrencesWithFilter() } /** @test */ - public function canGenerateDateEventDownloadLink() + public function can_generate_date_event_download_link() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -319,7 +316,7 @@ public function canGenerateDateEventDownloadLink() } /** @test */ - public function canGenerateEventDownloadLink() + public function can_generate_event_download_link() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -336,7 +333,7 @@ public function canGenerateEventDownloadLink() } /** @test */ - public function canSortOccurrencesDesc() + public function can_sort_occurrences_desc() { $this->tag diff --git a/tests/Unit/DayTest.php b/tests/Unit/DayTest.php index 5a5b9d0..ecb5334 100755 --- a/tests/Unit/DayTest.php +++ b/tests/Unit/DayTest.php @@ -9,7 +9,7 @@ class DayTest extends TestCase { /** @test */ - public function canGetEndWhenNoEndTime() + public function can_get_end_when_no_end_time() { $dayData = [ 'date' => '2019-11-23', @@ -25,7 +25,7 @@ public function canGetEndWhenNoEndTime() } /** @test */ - public function hasNoEndTimeWhenNoEndTime() + public function has_no_end_time_when_no_end_time() { $dayData = [ 'date' => '2019-11-23', diff --git a/tests/Unit/EventFactoryTest.php b/tests/Unit/EventFactoryTest.php index 3986c1e..e07ffde 100755 --- a/tests/Unit/EventFactoryTest.php +++ b/tests/Unit/EventFactoryTest.php @@ -17,7 +17,7 @@ class EventFactoryTest extends TestCase * * @dataProvider provideEventData */ - public function canGetEventTypeClass(string $class, array $data) + public function can_get_event_type_class(string $class, array $data) { $entry = Entry::make() ->collection('events') @@ -31,7 +31,7 @@ public function canGetEventTypeClass(string $class, array $data) * * @dataProvider provideEventData */ - public function canCreateCorrectEventType(string $class, array $data) + public function can_create_correct_event_type(string $class, array $data) { $entry = Entry::make() ->collection('events') diff --git a/tests/Unit/EventsTest.php b/tests/Unit/EventsTest.php index c927612..ad607e3 100755 --- a/tests/Unit/EventsTest.php +++ b/tests/Unit/EventsTest.php @@ -12,7 +12,7 @@ class EventsTest extends TestCase { /** @test */ - public function canGenerateDatesWhenNowBeforeStart() + public function can_generate_dates_when_now_before_start() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -55,7 +55,7 @@ public function canGenerateDatesWhenNowBeforeStart() } /** @test */ - public function canPaginateUpcomingOccurrences() + public function can_paginate_upcoming_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -92,7 +92,7 @@ public function canPaginateUpcomingOccurrences() } /** @test */ - public function canPaginateOccurrencesBetween() + public function can_paginate_occurrences_between() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -123,7 +123,7 @@ public function canPaginateOccurrencesBetween() } /** @test */ - public function canFilterEvents() + public function can_filter_events() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -157,7 +157,7 @@ public function canFilterEvents() } /** @test */ - public function canFilterMultipleEvents() + public function can_filter_multiple_events() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -203,7 +203,7 @@ public function canFilterMultipleEvents() } /** @test */ - public function canFilterByTermEvents() + public function can_filter_by_term_events() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -239,7 +239,7 @@ public function canFilterByTermEvents() } /** @test */ - public function canFilterByFilterEvents() + public function can_filter_by_filter_events() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -273,7 +273,7 @@ public function canFilterByFilterEvents() } /** @test */ - public function canDetermineOccursAtForSingleEvent() + public function can_determine_occurs_at_for_single_event() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -294,7 +294,7 @@ public function canDetermineOccursAtForSingleEvent() } /** @test */ - public function canDetermineOccursAtForMultidayEvent() + public function can_determine_occurs_at_for_multiday_event() { Carbon::setTestNow(now()); @@ -332,7 +332,7 @@ public function canDetermineOccursAtForMultidayEvent() } /** @test */ - public function canExcludeDates() + public function can_exclude_dates() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -355,7 +355,7 @@ public function canExcludeDates() } /** @test */ - public function canHandleEmptyExcludeDates() + public function can_handle_empty_exclude_dates() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -378,7 +378,7 @@ public function canHandleEmptyExcludeDates() } /** @test */ - public function canFilterOurEventsWithNoStartDate() + public function can_filter_our_events_with_no_start_date() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); From 2277a985454eca0beec3db2c9a6b8c311cb75f5a Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 16:23:27 -0800 Subject: [PATCH 07/13] use attributes --- tests/Feature/EventsOffsetTest.php | 9 +++--- tests/Feature/IcsControllerTest.php | 17 ++++++------ tests/Feature/TagTest.php | 27 +++++++++--------- tests/Unit/DayTest.php | 5 ++-- tests/Unit/EventFactoryTest.php | 16 ++++------- tests/Unit/EventsTest.php | 25 +++++++++-------- tests/Unit/MultiDayEventsTest.php | 18 ++++++------ tests/Unit/RecurringDailyEventsTest.php | 7 +++-- tests/Unit/RecurringEventsTest.php | 8 +++--- tests/Unit/RecurringEveryXEventsTest.php | 35 ++++++++++++------------ tests/Unit/SingleDayEventsTest.php | 15 +++++----- 11 files changed, 93 insertions(+), 89 deletions(-) diff --git a/tests/Feature/EventsOffsetTest.php b/tests/Feature/EventsOffsetTest.php index f81e1d6..96d0a35 100644 --- a/tests/Feature/EventsOffsetTest.php +++ b/tests/Feature/EventsOffsetTest.php @@ -3,6 +3,7 @@ namespace TransformStudios\Events\Tests\Feature; use Illuminate\Support\Carbon; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Entry; use TransformStudios\Events\Tags\Events; use TransformStudios\Events\Tests\TestCase; @@ -31,7 +32,7 @@ protected function setUp(): void $this->tag = app(Events::class); } - /** @test */ + #[Test] public function can_offset_upcoming_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -49,7 +50,7 @@ public function can_offset_upcoming_occurrences() $this->assertCount(3, $occurrences); } - /** @test */ + #[Test] public function can_offset_between_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -67,7 +68,7 @@ public function can_offset_between_occurrences() $this->assertCount(2, $occurrences); } - /** @test */ + #[Test] public function can_offset_today_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); @@ -100,7 +101,7 @@ public function can_offset_today_occurrences() $this->assertCount(0, $this->tag->today()); } - /** @test */ + #[Test] public function can_offset_single_day_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); diff --git a/tests/Feature/IcsControllerTest.php b/tests/Feature/IcsControllerTest.php index 8e6cc2f..8aa8aa4 100755 --- a/tests/Feature/IcsControllerTest.php +++ b/tests/Feature/IcsControllerTest.php @@ -3,6 +3,7 @@ namespace TransformStudios\Events\Tests\Feature; use Illuminate\Support\Carbon; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Entry; use TransformStudios\Events\Tests\TestCase; @@ -25,7 +26,7 @@ protected function setUp(): void ])->save(); } - /** @test */ + #[Test] public function can_create_single_day_event_ics_file() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -35,11 +36,11 @@ public function can_create_single_day_event_ics_file() 'event' => 'the-id', ]))->assertDownload('single-event.ics'); - $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); + $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis'), $response->streamedContent()); $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); } - /** @test */ + #[Test] public function can_create_single_day_recurring_event_ics_file() { Carbon::setTestNow(now()->addDay()->setTimeFromTimeString('10:00')); @@ -61,7 +62,7 @@ public function can_create_single_day_recurring_event_ics_file() 'event' => 'the-recurring-id', ]))->assertDownload('recurring-event.ics'); - $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); + $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis'), $response->streamedContent()); $this->get(route('statamic.events.ics.show', [ 'date' => now()->addDay()->toDateString(), @@ -69,7 +70,7 @@ public function can_create_single_day_recurring_event_ics_file() ]))->assertStatus(404); } - /** @test */ + #[Test] public function can_create_single_day_multiday_event_ics_file() { Carbon::setTestNow(now()); @@ -110,10 +111,10 @@ public function can_create_single_day_multiday_event_ics_file() 'event' => 'the-multi-day-event', ]))->assertDownload('multi-day-event.ics'); - $this->assertStringContainsString('DTSTART:'.now()->addDay()->setTimeFromTimeString('11:00')->format('Ymd\THis\Z'), $response->streamedContent()); + $this->assertStringContainsString('DTSTART:'.now()->addDay()->setTimeFromTimeString('11:00')->format('Ymd\THis'), $response->streamedContent()); } - /** @test */ + #[Test] public function throws404_error_when_event_does_not_occur_on_date() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -124,7 +125,7 @@ public function throws404_error_when_event_does_not_occur_on_date() ]))->assertStatus(404); } - /** @test */ + #[Test] public function throws404_error_when_event_does_not_exist() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); diff --git a/tests/Feature/TagTest.php b/tests/Feature/TagTest.php index 94fb5f2..95f3d29 100755 --- a/tests/Feature/TagTest.php +++ b/tests/Feature/TagTest.php @@ -3,6 +3,7 @@ namespace TransformStudios\Events\Tests\Feature; use Illuminate\Support\Carbon; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Cascade; use Statamic\Facades\Entry; use Statamic\Support\Arr; @@ -33,7 +34,7 @@ protected function setUp(): void $this->tag = app(Events::class); } - /** @test */ + #[Test] public function can_generate_between_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -51,7 +52,7 @@ public function can_generate_between_occurrences() $this->assertCount(4, $occurrences); } - /** @test */ + #[Test] public function can_generate_between_occurrences_with_default_from() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -68,7 +69,7 @@ public function can_generate_between_occurrences_with_default_from() $this->assertCount(4, $occurrences); } - /** @test */ + #[Test] public function can_generate_calendar_occurrences() { Carbon::setTestNow('jan 1, 2022 10:00'); @@ -113,7 +114,7 @@ public function can_generate_calendar_occurrences() $this->assertCount(1, Arr::get($occurrences, '13.dates')); } - /** @test */ + #[Test] public function can_generate_in_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -130,7 +131,7 @@ public function can_generate_in_occurrences() $this->assertCount(4, $occurrences); } - /** @test */ + #[Test] public function can_generate_today_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('12:01')); @@ -163,7 +164,7 @@ public function can_generate_today_occurrences() $this->assertCount(1, $this->tag->today()); } - /** @test */ + #[Test] public function can_generate_upcoming_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -180,7 +181,7 @@ public function can_generate_upcoming_occurrences() $this->assertCount(3, $occurrences); } - /** @test */ + #[Test] public function can_generate_upcoming_limited_occurrences() { Entry::make() @@ -209,7 +210,7 @@ public function can_generate_upcoming_limited_occurrences() $this->assertCount(3, $occurrences); } - /** @test */ + #[Test] public function can_paginate_upcoming_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -237,7 +238,7 @@ public function can_paginate_upcoming_occurrences() $this->assertEquals('/events?page=2', $pagination['paginate']['next_page']); } - /** @test */ + #[Test] public function can_generate_upcoming_occurrences_with_taxonomy_terms() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -267,7 +268,7 @@ public function can_generate_upcoming_occurrences_with_taxonomy_terms() $this->assertCount(1, $occurrences); } - /** @test */ + #[Test] public function can_generate_upcoming_occurrences_with_filter() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -297,7 +298,7 @@ public function can_generate_upcoming_occurrences_with_filter() $this->assertCount(1, $occurrences); } - /** @test */ + #[Test] public function can_generate_date_event_download_link() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -315,7 +316,7 @@ public function can_generate_date_event_download_link() $this->assertEquals('http://localhost/!/events/ics?collection=events&date='.now()->toDateString().'&event=recurring-event', $url); } - /** @test */ + #[Test] public function can_generate_event_download_link() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -332,7 +333,7 @@ public function can_generate_event_download_link() $this->assertEquals('http://localhost/!/events/ics?collection=events&event=recurring-event', $url); } - /** @test */ + #[Test] public function can_sort_occurrences_desc() { diff --git a/tests/Unit/DayTest.php b/tests/Unit/DayTest.php index ecb5334..84c3ff5 100755 --- a/tests/Unit/DayTest.php +++ b/tests/Unit/DayTest.php @@ -3,12 +3,13 @@ namespace TransformStudios\Events\Tests\Unit; use Illuminate\Support\Carbon; +use PHPUnit\Framework\Attributes\Test; use TransformStudios\Events\Day; use TransformStudios\Events\Tests\TestCase; class DayTest extends TestCase { - /** @test */ + #[Test] public function can_get_end_when_no_end_time() { $dayData = [ @@ -24,7 +25,7 @@ public function can_get_end_when_no_end_time() ); } - /** @test */ + #[Test] public function has_no_end_time_when_no_end_time() { $dayData = [ diff --git a/tests/Unit/EventFactoryTest.php b/tests/Unit/EventFactoryTest.php index e07ffde..ad523d7 100755 --- a/tests/Unit/EventFactoryTest.php +++ b/tests/Unit/EventFactoryTest.php @@ -3,6 +3,8 @@ namespace TransformStudios\Events\Tests\Unit; use Illuminate\Support\Carbon; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Entry; use TransformStudios\Events\EventFactory; use TransformStudios\Events\Tests\TestCase; @@ -12,11 +14,8 @@ class EventFactoryTest extends TestCase { - /** - * @test - * - * @dataProvider provideEventData - */ + #[Test] + #[DataProvider('provideEventData')] public function can_get_event_type_class(string $class, array $data) { $entry = Entry::make() @@ -26,11 +25,8 @@ public function can_get_event_type_class(string $class, array $data) $this->assertEquals($class, EventFactory::getTypeClass($entry)); } - /** - * @test - * - * @dataProvider provideEventData - */ + #[Test] + #[DataProvider('provideEventData')] public function can_create_correct_event_type(string $class, array $data) { $entry = Entry::make() diff --git a/tests/Unit/EventsTest.php b/tests/Unit/EventsTest.php index ad607e3..54aefb4 100755 --- a/tests/Unit/EventsTest.php +++ b/tests/Unit/EventsTest.php @@ -3,6 +3,7 @@ namespace TransformStudios\Events\Tests\Unit; use Illuminate\Support\Carbon; +use PHPUnit\Framework\Attributes\Test; use Statamic\Extensions\Pagination\LengthAwarePaginator; use Statamic\Facades\Entry; use TransformStudios\Events\EventFactory; @@ -11,7 +12,7 @@ class EventsTest extends TestCase { - /** @test */ + #[Test] public function can_generate_dates_when_now_before_start() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -54,7 +55,7 @@ public function can_generate_dates_when_now_before_start() $this->assertEquals($expectedStartDates[3], $occurrences[3]->start); } - /** @test */ + #[Test] public function can_paginate_upcoming_occurrences() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -91,7 +92,7 @@ public function can_paginate_upcoming_occurrences() $this->assertEquals(3, $paginator->currentPage()); } - /** @test */ + #[Test] public function can_paginate_occurrences_between() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -122,7 +123,7 @@ public function can_paginate_occurrences_between() $this->assertEquals(now()->addDay()->setTimeFromTimeString('11:00'), $paginator->items()[1]->start); } - /** @test */ + #[Test] public function can_filter_events() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -156,7 +157,7 @@ public function can_filter_events() $this->assertCount(10, $occurrences); } - /** @test */ + #[Test] public function can_filter_multiple_events() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -202,7 +203,7 @@ public function can_filter_multiple_events() $this->assertCount(10, $occurrences); } - /** @test */ + #[Test] public function can_filter_by_term_events() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -238,7 +239,7 @@ public function can_filter_by_term_events() $this->assertCount(10, $occurrences); } - /** @test */ + #[Test] public function can_filter_by_filter_events() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -272,7 +273,7 @@ public function can_filter_by_filter_events() $this->assertCount(10, $occurrences); } - /** @test */ + #[Test] public function can_determine_occurs_at_for_single_event() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -293,7 +294,7 @@ public function can_determine_occurs_at_for_single_event() $this->assertTrue($event->occursOnDate(now())); } - /** @test */ + #[Test] public function can_determine_occurs_at_for_multiday_event() { Carbon::setTestNow(now()); @@ -331,7 +332,7 @@ public function can_determine_occurs_at_for_multiday_event() $this->assertFalse($event->occursOnDate(now()->addDays(3))); } - /** @test */ + #[Test] public function can_exclude_dates() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -354,7 +355,7 @@ public function can_exclude_dates() $this->assertCount(3, $occurrences); } - /** @test */ + #[Test] public function can_handle_empty_exclude_dates() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); @@ -377,7 +378,7 @@ public function can_handle_empty_exclude_dates() $this->assertCount(4, $occurrences); } - /** @test */ + #[Test] public function can_filter_our_events_with_no_start_date() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); diff --git a/tests/Unit/MultiDayEventsTest.php b/tests/Unit/MultiDayEventsTest.php index 57605e2..f0de6b4 100755 --- a/tests/Unit/MultiDayEventsTest.php +++ b/tests/Unit/MultiDayEventsTest.php @@ -3,7 +3,7 @@ namespace TransformStudios\Events\Tests\Unit; use Carbon\Carbon; -use Statamic\Facades\Blueprint; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Entry; use TransformStudios\Events\EventFactory; use TransformStudios\Events\Tests\TestCase; @@ -20,7 +20,7 @@ class MultiDayEventsTest extends TestCase /** @var MultiDayEvent */ private $noEndTimeEvnt; - public function setUp(): void + protected function setUp(): void { parent::setUp(); @@ -90,7 +90,7 @@ public function setUp(): void $this->allDayEvent = EventFactory::createFromEntry($allDayEntry); } - /** @test */ + #[Test] public function canCreateMultiDayEvent() { $this->assertTrue($this->event instanceof MultiDayEvent); @@ -101,7 +101,7 @@ public function canCreateMultiDayEvent() $this->assertTrue($this->noEndTimeEvent->isMultiDay()); } - /** @test */ + #[Test] public function canGetStart() { $this->assertEquals( @@ -118,14 +118,14 @@ public function canGetStart() ); } - /** @test */ + #[Test] public function noOccurrencesIfNowAfterEndDate() { Carbon::setTestNow('2019-11-26'); $this->assertEmpty($this->event->nextOccurrences(1)); } - /** @test */ + #[Test] public function canGenerateNextOccurrenceIfBefore() { Carbon::setTestNowAndTimezone('2019-11-22', 'America/Vancouver'); @@ -140,7 +140,7 @@ public function canGenerateNextOccurrenceIfBefore() ); } - /** @test */ + #[Test] public function canGenerateNextOccurrenceIfDuring() { Carbon::setTestNowAndTimezone('2019-11-24 10:00', 'America/Vancouver'); @@ -150,7 +150,7 @@ public function canGenerateNextOccurrenceIfDuring() ); } - /** @test */ + #[Test] public function canGenerateICalendar() { $this->markTestSkipped('revisit'); @@ -159,7 +159,7 @@ public function canGenerateICalendar() dd($events); } - /** @test */ + #[Test] public function dayIsAllDayWhenNoStartAndEndTime() { $days = $this->allDayEvent->days(); diff --git a/tests/Unit/RecurringDailyEventsTest.php b/tests/Unit/RecurringDailyEventsTest.php index a6b905e..d2ffb50 100755 --- a/tests/Unit/RecurringDailyEventsTest.php +++ b/tests/Unit/RecurringDailyEventsTest.php @@ -4,13 +4,14 @@ use Carbon\Carbon; use Carbon\CarbonImmutable; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Entry; use TransformStudios\Events\EventFactory; use TransformStudios\Events\Tests\TestCase; class RecurringDailyEventsTest extends TestCase { - /** @test */ + #[Test] public function nullNextDateIfNowAfterEndDate() { $recurringEntry = Entry::make() @@ -31,7 +32,7 @@ public function nullNextDateIfNowAfterEndDate() $this->assertEmpty($nextOccurrences); } - /** @test */ + #[Test] public function canGenerateNextDayIfNowIsBefore() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); @@ -56,7 +57,7 @@ public function canGenerateNextDayIfNowIsBefore() $this->assertEquals($startDate, $nextOccurrences->first()->start); } - /** @test */ + #[Test] public function canGenerateNextOccurrenceIfNowIsDuring() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); diff --git a/tests/Unit/RecurringEventsTest.php b/tests/Unit/RecurringEventsTest.php index 587145c..c5a80c7 100755 --- a/tests/Unit/RecurringEventsTest.php +++ b/tests/Unit/RecurringEventsTest.php @@ -3,17 +3,17 @@ namespace TransformStudios\Events\Tests\Unit; use Carbon\Carbon; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Entry; use TransformStudios\Events\EventFactory; use TransformStudios\Events\Events; use TransformStudios\Events\Tests\TestCase; -use TransformStudios\Events\Types\MultiDayEvent; use TransformStudios\Events\Types\RecurringEvent; use TransformStudios\Events\Types\SingleDayEvent; class RecurringEventsTest extends TestCase { - /** @test */ + #[Test] public function canCreateRecurringEvent() { $recurringEntry = Entry::make() @@ -31,7 +31,7 @@ public function canCreateRecurringEvent() $this->assertFalse($event->isMultiDay()); } - /** @test */ + #[Test] public function wontCreateRecurringEventWhenMultiDay() { $recurringEntry = Entry::make() @@ -49,7 +49,7 @@ public function wontCreateRecurringEventWhenMultiDay() $this->assertFalse($event->isMultiDay()); } - /** @test */ + #[Test] public function canShowLastOccurrenceWhenNoEndTime() { Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); diff --git a/tests/Unit/RecurringEveryXEventsTest.php b/tests/Unit/RecurringEveryXEventsTest.php index ad46b16..e05d604 100755 --- a/tests/Unit/RecurringEveryXEventsTest.php +++ b/tests/Unit/RecurringEveryXEventsTest.php @@ -4,6 +4,7 @@ use Carbon\Carbon; use Carbon\CarbonImmutable; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Entry; use TransformStudios\Events\EventFactory; use TransformStudios\Events\Tests\TestCase; @@ -11,7 +12,7 @@ class RecurringEveryXEventsTest extends TestCase { - /** @test */ + #[Test] public function canCreateEveryXEvent() { $recurringEntry = Entry::make() @@ -30,7 +31,7 @@ public function canCreateEveryXEvent() $this->assertInstanceOf(RecurringEvent::class, $event); } - /** @test */ + #[Test] public function noOccurencesWhenNowAfterEndDate() { $recurringEntry = Entry::make() @@ -53,7 +54,7 @@ public function noOccurencesWhenNowAfterEndDate() $this->assertEmpty($nextOccurrences); } - /** @test */ + #[Test] public function canGenerateOccurrenceIfNowBefore() { $startDate = Carbon::now()->addDay()->setTimeFromTimeString('11:00'); @@ -82,7 +83,7 @@ public function canGenerateOccurrenceIfNowBefore() $this->assertEquals($startDate, $occurrences[0]->start); } - /** @test */ + #[Test] public function canGenerateOccurrenceIfDuring() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); @@ -104,7 +105,7 @@ public function canGenerateOccurrenceIfDuring() $this->assertEquals($startDate, $occurrences[0]->start); } - /** @test */ + #[Test] public function canGenerateOccurrenceIfNowAfterFirstDate() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); @@ -133,7 +134,7 @@ public function canGenerateOccurrenceIfNowAfterFirstDate() // $this->assertEquals($startDate, $nextDate->start()); } - /** @test */ + #[Test] public function canGenerateNextOccurrenceInWeeksIfNowAfterStart() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); @@ -158,7 +159,7 @@ public function canGenerateNextOccurrenceInWeeksIfNowAfterStart() $this->assertEquals($startDate->addWeeks(2), $occurrences[0]->start); } - /** @test */ + #[Test] public function canGenerateNextOccurrenceIfNow_after_weeks() { $recurringEntry = Entry::make() @@ -183,7 +184,7 @@ public function canGenerateNextOccurrenceIfNow_after_weeks() $this->assertEquals(Carbon::parse('2021-03-15')->setTimeFromTimeString('11:00:00'), $occurrences[0]->start); } - /** @test */ + #[Test] public function canGenerateNextOccurrenceIfNowDuringMonths() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); @@ -208,19 +209,19 @@ public function canGenerateNextOccurrenceIfNowDuringMonths() $this->assertEquals($startDate->setTimeFromTimeString('11:00:00'), $occurrences[0]->start); } - /** @test */ + #[Test] public function canGenerateNextXOccurrencesFromTodayBeforeEventTime() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); $recurringEntry = Entry::make() ->collection('events') ->data([ - 'start_date' => $startDate->toDateString(), - 'start_time' => '11:00', - 'end_time' => '12:00', - 'recurrence' => 'every', - 'interval' => 2, - 'period' => 'days', + 'start_date' => $startDate->toDateString(), + 'start_time' => '11:00', + 'end_time' => '12:00', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', ]); $event = EventFactory::createFromEntry($recurringEntry); @@ -238,7 +239,7 @@ public function canGenerateNextXOccurrencesFromTodayBeforeEventTime() $this->assertEquals($events[1], $occurrences[1]->start); } - /** @test */ + #[Test] public function canGenerateAllOccurrencesWhenAfterStartDateDaily() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); @@ -253,7 +254,7 @@ public function canGenerateAllOccurrencesWhenAfterStartDateDaily() 'recurrence' => 'every', 'interval' => 2, 'period' => 'days', - ]); + ]); for ($x = 1; $x <= 2; $x++) { $events[] = $startDate->addDays($x * 2 + 1); diff --git a/tests/Unit/SingleDayEventsTest.php b/tests/Unit/SingleDayEventsTest.php index ebe2242..7e1227c 100755 --- a/tests/Unit/SingleDayEventsTest.php +++ b/tests/Unit/SingleDayEventsTest.php @@ -5,6 +5,7 @@ use Carbon\Carbon; use Carbon\CarbonImmutable; use Carbon\CarbonTimeZone; +use PHPUnit\Framework\Attributes\Test; use Statamic\Facades\Entry; use TransformStudios\Events\EventFactory; use TransformStudios\Events\Tests\TestCase; @@ -12,7 +13,7 @@ class SingleDayEventsTest extends TestCase { - /** @test */ + #[Test] public function canCreateSingleEvent() { $entry = Entry::make() @@ -34,7 +35,7 @@ public function canCreateSingleEvent() $this->assertEquals(new CarbonTimeZone('America/Vancouver'), $event->end()->timezone); } - /** @test */ + #[Test] public function canCreateSingleAllDayEvent() { $entry = Entry::make() @@ -50,7 +51,7 @@ public function canCreateSingleAllDayEvent() $this->assertTrue($event->isAllDay()); } - /** @test */ + #[Test] public function endIsEndOfDayWhenNoEndTime() { Carbon::setTestNow(now()); @@ -71,7 +72,7 @@ public function endIsEndOfDayWhenNoEndTime() $this->assertEquals(now()->endOfDay()->setMicrosecond(0), $nextOccurrences[0]->end); } - /** @test */ + #[Test] public function emptyOccurrencesIfNowAfterEndDate() { $recurringEntry = Entry::make() @@ -90,7 +91,7 @@ public function emptyOccurrencesIfNowAfterEndDate() $this->assertEmpty($nextOccurrences); } - /** @test */ + #[Test] public function canGenerateNextDayIfNowIsBefore() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); @@ -114,7 +115,7 @@ public function canGenerateNextDayIfNowIsBefore() $this->assertEquals($startDate, $nextOccurrences->first()->start); } - /** @test */ + #[Test] public function canGenerateNextOccurrenceIfNowIsDuring() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); @@ -143,7 +144,7 @@ public function canGenerateNextOccurrenceIfNowIsDuring() $this->assertEquals($startDate, $noEndTimeEvent->nextOccurrences()[0]->start); } - /** @test */ + #[Test] public function canSupplementNoEndTime() { $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00'); From fed758a766274e822b7f1099711ce886bf213feb Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 17:17:46 -0800 Subject: [PATCH 08/13] remove unused test --- tests/Unit/MultiDayEventsTest.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/Unit/MultiDayEventsTest.php b/tests/Unit/MultiDayEventsTest.php index f0de6b4..48a0b78 100755 --- a/tests/Unit/MultiDayEventsTest.php +++ b/tests/Unit/MultiDayEventsTest.php @@ -150,15 +150,6 @@ public function canGenerateNextOccurrenceIfDuring() ); } - #[Test] - public function canGenerateICalendar() - { - $this->markTestSkipped('revisit'); - $events = $this->event->toICalendarEvents(); - - dd($events); - } - #[Test] public function dayIsAllDayWhenNoStartAndEndTime() { From ca6e4a83611fdb0528bd716c75e679419a37be24 Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 17:17:54 -0800 Subject: [PATCH 09/13] use count instead for some reason --- src/Types/Event.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Types/Event.php b/src/Types/Event.php index 36ef5c7..bb22e17 100644 --- a/src/Types/Event.php +++ b/src/Types/Event.php @@ -15,9 +15,7 @@ abstract class Event { abstract protected function rule(): RRuleInterface; - public function __construct(protected Entry $event) - { - } + public function __construct(protected Entry $event) {} public function __get(string $key): mixed { @@ -41,7 +39,7 @@ public function isAllDay(): bool public function isMultiDay(): bool { - return boolval(($this->multi_day || $this->recurrence?->value() === 'multi_day') && ! empty($this->days)); + return boolval(($this->multi_day || $this->recurrence?->value() === 'multi_day') && count($this->days) > 0); } public function isRecurring(): bool From dfd7b5ffa2c2a7605f615fa01e8bbad74f7a1cc6 Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 17:34:22 -0800 Subject: [PATCH 10/13] only one version cuz the tests require statamic 5 --- .github/workflows/test.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 76570b9..fea9fd1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,16 +10,9 @@ jobs: strategy: matrix: os: [ubuntu-latest] - php: [8.2] - laravel: [9.*, 10.*] - dependency-version: [prefer-lowest, prefer-stable] - include: - - laravel: 9.* - framework: ^9.0 - testbench: 7.* - - laravel: 10.* - framework: ^10.0 - testbench: 8.* + php: [8.2, 8.3] + laravel: [11.*] + dependency-version: [prefer-stable] name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.dependency-version }} - ubuntu-latest steps: - name: Checkout code From 8e11772ed771a67d7d3aa192dd3e24bdf01e4bc8 Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 17:36:11 -0800 Subject: [PATCH 11/13] this? --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fea9fd1..e9c255b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,6 @@ jobs: - name: Install dependencies run: | - composer require "laravel/framework:${{ matrix.framework }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction - name: Execute tests From 5e91294f58c46dc7bf30fcf46cbfec0202020ae6 Mon Sep 17 00:00:00 2001 From: edalzell Date: Tue, 28 Jan 2025 18:34:54 -0800 Subject: [PATCH 12/13] better way --- src/Types/Event.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Types/Event.php b/src/Types/Event.php index bb22e17..a9b6963 100644 --- a/src/Types/Event.php +++ b/src/Types/Event.php @@ -22,6 +22,11 @@ public function __get(string $key): mixed return $this->event->$key; } + public function __isset(string $key): bool + { + return isset($this->event->$key); + } + public function endTime(): string { return $this->end_time ?? now()->endOfDay()->toTimeString(); @@ -39,7 +44,7 @@ public function isAllDay(): bool public function isMultiDay(): bool { - return boolval(($this->multi_day || $this->recurrence?->value() === 'multi_day') && count($this->days) > 0); + return boolval(($this->multi_day || $this->recurrence?->value() === 'multi_day') && ! empty($this->days)); } public function isRecurring(): bool From 894fd64f1c625480b293aae3878a4c60f8ee8d5f Mon Sep 17 00:00:00 2001 From: edalzell Date: Wed, 29 Jan 2025 14:47:53 -0800 Subject: [PATCH 13/13] explain --- src/Types/Event.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Types/Event.php b/src/Types/Event.php index a9b6963..6697fcc 100644 --- a/src/Types/Event.php +++ b/src/Types/Event.php @@ -22,6 +22,9 @@ public function __get(string $key): mixed return $this->event->$key; } + /* + Can remove this once https://github.com/statamic/cms/pull/11402 is released + */ public function __isset(string $key): bool { return isset($this->event->$key);