diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1f699c6..b7c9652 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,17 +9,11 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest] - php: [8.2, 8.3, 8.4] + php: [8.3, 8.4] laravel: [11.*, 12.*] + stability: [prefer-lowest, prefer-stable] + os: [ubuntu-latest] dependency-version: [prefer-stable] - exclude: - - php: 8.1 - laravel: 11.* - - php: 8.1 - laravel: 12.* - - php: 8.4 - laravel: 10.* name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.dependency-version }} - ubuntu-latest steps: - name: Checkout code @@ -39,8 +33,7 @@ jobs: coverage: none - name: Install dependencies - run: | - composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction + run: composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction --no-suggest - name: Execute tests - run: vendor/bin/phpunit -c phpunit.xml + run: vendor/bin/pest diff --git a/composer.json b/composer.json index 7f68b88..ae20d1c 100644 --- a/composer.json +++ b/composer.json @@ -11,22 +11,22 @@ } ], "require": { + "php": "^8.3", "rlanvin/php-rrule": "^2.3.1", "spatie/calendar-links": "^1.0", "spatie/icalendar-generator": "^2.3.3", "statamic/cms": "6.0.0-alpha.4" }, "require-dev": { - "mockery/mockery": "^1.3.1", - "nunomaduro/collision": "^8.0", - "orchestra/testbench": "^9.0", - "phpunit/phpunit": "^11.0", + "orchestra/testbench": "^9.2 || ^10.0", + "pestphp/pest": "^4.0", "spatie/laravel-ray": "^1.35", "spatie/test-time": "^1.2" }, "autoload": { "psr-4": { - "TransformStudios\\Events\\": "src" + "TransformStudios\\Events\\": "src", + "TransformStudios\\Events\\Tests\\": "tests" }, "files": [ "src/helpers.php" @@ -39,6 +39,7 @@ }, "config": { "allow-plugins": { + "pestphp/pest-plugin": true, "pixelfear/composer-dist-plugin": true }, "optimize-autoloader": true, diff --git a/tests/Feature/EventsOffsetTest.php b/tests/Feature/EventsOffsetTest.php index 96d0a35..31dbe89 100644 --- a/tests/Feature/EventsOffsetTest.php +++ b/tests/Feature/EventsOffsetTest.php @@ -1,117 +1,97 @@ 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()); - } -} + +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 + ->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'limit' => 5, + 'offset' => 2, + ]); + + $occurrences = $this->tag->upcoming(); + + expect($occurrences)->toHaveCount(3); +}); + +test('can offset between occurrences', function () { + 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(); + + expect($occurrences)->toHaveCount(2); +}); + +test('can offset 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', + 'offset' => 1, + ]); + + expect($this->tag->today())->toHaveCount(1); + + $this->tag->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'ignore_finished' => true, + 'offset' => 1, + ]); + + expect($this->tag->today())->toHaveCount(0); +}); + +test('can offset single day occurrences', function () { + Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); + + $this->tag->setContext([]) + ->setParameters([ + 'collection' => 'events', + 'offset' => 1, + ]); + + expect($this->tag->today())->toHaveCount(0); +}); diff --git a/tests/Feature/IcsControllerTest.php b/tests/Feature/IcsControllerTest.php index 2e43ae3..7f3b8fd 100755 --- a/tests/Feature/IcsControllerTest.php +++ b/tests/Feature/IcsControllerTest.php @@ -1,214 +1,189 @@ 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', - 'address' => '123 Main St', - 'location' => 'The Location', - 'coordinates' => [ - 'latitude' => 40, - 'longitude' => 50, + +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', + 'address' => '123 Main St', + 'location' => 'The Location', + 'coordinates' => [ + 'latitude' => 40, + 'longitude' => 50, + ], + 'description' => 'The description', + ])->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'); + + $content = $response->streamedContent(); + + $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis'), $response->streamedContent()); + $this->assertStringContainsString('LOCATION:123 Main St', $content); + $this->assertStringContainsString('DESCRIPTION:The description', $content); + $this->assertStringContainsString('GEO:40;50', $content); +}); + +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', + 'location' => 'The Location', + 'description' => 'The description', + ])->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'), $response->streamedContent()); + $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); + $this->assertStringContainsString('DESCRIPTION:The description', $response->streamedContent()); + + $this->get(route('statamic.events.ics.show', [ + 'date' => now()->addDay()->toDateString(), + 'event' => 'the-recurring-id', + ]))->assertStatus(404); +}); + +test('can create ics with single date recurrence', 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', + 'location' => 'The Location', + 'description' => 'The description', + ])->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'), $response->streamedContent()); + $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); + $this->assertStringContainsString('DESCRIPTION:The description', $response->streamedContent()); +}); + +test('can create ics with recurrence', 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', + 'location' => 'The Location', + 'description' => 'The description', + ])->save(); + + $response = $this->get(route('statamic.events.ics.show', [ + 'event' => 'the-recurring-id', + ]))->assertDownload('recurring-event.ics'); + + $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis'), $response->streamedContent()); + $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); + $this->assertStringContainsString('DESCRIPTION:The description', $response->streamedContent()); +}); + +test('can create single day multiday event ics file', function () { + Carbon::setTestNow(now()); + + Entry::make() + ->slug('multi-day-event') + ->collection('events') + ->id('the-multi-day-event') + ->data([ + 'title' => 'Multi-day Event', + 'multi_day' => true, + 'location' => 'The Location', + 'description' => 'The description', + 'days' => [ + [ + 'date' => now()->toDateString(), + 'start_time' => '19:00', + 'end_time' => '21:00', + ], + [ + 'date' => now()->addDay()->toDateString(), + 'start_time' => '11:00', + 'end_time' => '15:00', ], - 'description' => 'The description', - ])->save(); - } - - #[Test] - public function can_create_single_day_event_ics_file() - { - Carbon::setTestNow(now()->setTimeFromTimeString('10:00')); - - $response = $this->get(route('statamic.events.ics.show', [ - 'date' => now()->toDateString(), - 'event' => 'the-id', - ]))->assertDownload('single-event.ics'); - - $content = $response->streamedContent(); - - $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis'), $response->streamedContent()); - $this->assertStringContainsString('LOCATION:123 Main St', $content); - $this->assertStringContainsString('DESCRIPTION:The description', $content); - $this->assertStringContainsString('GEO:40;50', $content); - } - - #[Test] - public function can_create_single_day_recurring_event_ics_file() - { - 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', - 'location' => 'The Location', - 'description' => 'The description', - ])->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'), $response->streamedContent()); - $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); - $this->assertStringContainsString('DESCRIPTION:The description', $response->streamedContent()); - - $this->get(route('statamic.events.ics.show', [ - 'date' => now()->addDay()->toDateString(), - 'event' => 'the-recurring-id', - ]))->assertStatus(404); - } - - #[Test] - public function can_create_ics_with_single_date_recurrence() - { - 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', - 'location' => 'The Location', - 'description' => 'The description', - ])->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'), $response->streamedContent()); - $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); - $this->assertStringContainsString('DESCRIPTION:The description', $response->streamedContent()); - - } - - #[Test] - public function can_create_ics_with_recurrence() - { - 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', - 'location' => 'The Location', - 'description' => 'The description', - ])->save(); - - $response = $this->get(route('statamic.events.ics.show', [ - 'event' => 'the-recurring-id', - ]))->assertDownload('recurring-event.ics'); - - $this->assertStringContainsString('DTSTART:'.now()->setTimeFromTimeString('11:00')->format('Ymd\THis'), $response->streamedContent()); - $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); - $this->assertStringContainsString('DESCRIPTION:The description', $response->streamedContent()); - } - - #[Test] - public function can_create_single_day_multiday_event_ics_file() - { - Carbon::setTestNow(now()); - - Entry::make() - ->slug('multi-day-event') - ->collection('events') - ->id('the-multi-day-event') - ->data([ - 'title' => 'Multi-day Event', - 'multi_day' => true, - 'location' => 'The Location', - 'description' => 'The description', - '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', ], - ])->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'), $response->streamedContent()); - $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); - $this->assertStringContainsString('DESCRIPTION:The description', $response->streamedContent()); - } - - #[Test] - public function throws404_error_when_event_does_not_occur_on_date() - { - 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 throws404_error_when_event_does_not_exist() - { - 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'), $response->streamedContent()); + $this->assertStringContainsString('LOCATION:The Location', $response->streamedContent()); + $this->assertStringContainsString('DESCRIPTION:The description', $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); +}); diff --git a/tests/Feature/TagTest.php b/tests/Feature/TagTest.php index ada7d2c..fb124c9 100755 --- a/tests/Feature/TagTest.php +++ b/tests/Feature/TagTest.php @@ -1,352 +1,313 @@ 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_generate_between_occurrences() - { - 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 can_generate_between_occurrences_with_default_from() - { - 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 can_generate_calendar_occurrences() - { - 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, '5.dates')); - $this->assertTrue(Arr::get($occurrences, '6.no_results')); - } - - #[Test] - public function can_generate_in_occurrences() - { - 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 can_generate_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', - ]); - - $this->assertCount(2, $this->tag->today()); - - $this->tag - ->setContext([]) - ->setParameters([ - 'collection' => 'events', - 'ignore_finished' => true, - ]); - - $this->assertCount(1, $this->tag->today()); - } - - #[Test] - public function can_generate_upcoming_occurrences() - { - 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 can_generate_upcoming_limited_occurrences() - { - 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 can_paginate_upcoming_occurrences() - { - 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 can_generate_upcoming_occurrences_with_taxonomy_terms() - { - 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 can_generate_upcoming_occurrences_with_filter() - { - 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 can_generate_date_event_download_link() - { - 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 can_generate_event_download_link() - { - 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 can_sort_occurrences_desc() - { - - $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)); - } -} + +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, '5.dates'))->toHaveCount(2); + expect(Arr::get($occurrences, '6.no_results'))->toBeTrue(); +}); + +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(); +}); diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000..de7b364 --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,47 @@ +extend(TestCase::class); + +/* +|-------------------------------------------------------------------------- +| 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/TestCase.php b/tests/TestCase.php index 203cae0..cf978cc 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -20,10 +20,23 @@ abstract class TestCase extends AddonTestCase protected string $addonServiceProvider = ServiceProvider::class; + protected $fakeStacheDirectory = __DIR__.'/__fixtures__/dev-null'; + + protected $shouldFakeVersion = true; + protected Collection $collection; protected Blueprint $blueprint; + protected function setUp(): void + { + parent::setUp(); + + if (! file_exists($this->fakeStacheDirectory)) { + mkdir($this->fakeStacheDirectory, 0777, true); + } + } + protected function getEnvironmentSetUp($app) { parent::getEnvironmentSetUp($app); diff --git a/tests/Unit/DayTest.php b/tests/Unit/DayTest.php index 84c3ff5..7aa4843 100755 --- a/tests/Unit/DayTest.php +++ b/tests/Unit/DayTest.php @@ -1,40 +1,26 @@ '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 has_no_end_time_when_no_end_time() - { - $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 ad523d7..1a0dbdc 100755 --- a/tests/Unit/EventFactoryTest.php +++ b/tests/Unit/EventFactoryTest.php @@ -1,93 +1,78 @@ collection('events') - ->data($data); +test('can get event type class', function (string $class, array $data) { + $entry = Entry::make() + ->collection('events') + ->data($data); - $this->assertEquals($class, EventFactory::getTypeClass($entry)); - } + expect(EventFactory::getTypeClass($entry))->toEqual($class); +})->with('provideEventData'); - #[Test] - #[DataProvider('provideEventData')] - public function can_create_correct_event_type(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 54aefb4..edfcea5 100755 --- a/tests/Unit/EventsTest.php +++ b/tests/Unit/EventsTest.php @@ -1,417 +1,386 @@ 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 can_paginate_upcoming_occurrences() - { - 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 can_paginate_occurrences_between() - { - 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 can_filter_events() - { - 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 can_filter_multiple_events() - { - 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 can_filter_by_term_events() - { - 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 can_filter_by_filter_events() - { - 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 can_determine_occurs_at_for_single_event() - { - 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 can_determine_occurs_at_for_multiday_event() - { - 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 can_exclude_dates() - { - 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 can_handle_empty_exclude_dates() - { - 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 can_filter_our_events_with_no_start_date() - { - 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 eca8184..b1b80e6 100755 --- a/tests/Unit/MultiDayEventsTest.php +++ b/tests/Unit/MultiDayEventsTest.php @@ -1,177 +1,117 @@ slug('multi-day-event') - ->collection('events') - ->data([ - 'recurrence' => 'multi_day', - 'days' => [ - [ - 'date' => '2019-11-24', - 'start_time' => '11:00', - 'end_time' => '15:00', - ], - [ - 'date' => '2019-11-25', - 'start_time' => '11:00', - 'end_time' => '15:00', - ], - [ - 'date' => '2019-11-23', - 'start_time' => '19:00', - 'end_time' => '21: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-24', + 'start_time' => '11:00', + 'end_time' => '15:00', + ], + [ + 'date' => '2019-11-25', + 'start_time' => '11:00', + 'end_time' => '15:00', + ], + [ + 'date' => '2019-11-23', + 'start_time' => '19:00', + 'end_time' => '21: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 canGetEnd() - { - $this->assertEquals( - Carbon::parse('2019-11-25 15:00')->shiftTimezone('America/Vancouver'), - $this->event->end() - ); - $this->assertEquals( - Carbon::parse('2019-11-21 23:59:59.999999')->shiftTimezone('America/Vancouver'), - $this->allDayEvent->end() - ); - $this->assertEquals( - Carbon::parse('2019-11-21 23:59:00')->shiftTimezone('America/Vancouver')->timezone, - $this->event->end()->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 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('can get end', function () { + expect($this->event->end())->toEqual(Carbon::parse('2019-11-25 15:00')->shiftTimezone('America/Vancouver')); + expect($this->allDayEvent->end())->toEqual(Carbon::parse('2019-11-21 23:59:59.999999')->shiftTimezone('America/Vancouver')); + expect($this->event->end()->timezone)->toEqual(Carbon::parse('2019-11-21 23:59: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('day is all day when no start and end time', function () { + $days = $this->allDayEvent->days(); + + expect($days[0]->isAllDay())->toBeTrue(); +}); diff --git a/tests/Unit/RecurringDailyEventsTest.php b/tests/Unit/RecurringDailyEventsTest.php index d2ffb50..5feb2b9 100755 --- a/tests/Unit/RecurringDailyEventsTest.php +++ b/tests/Unit/RecurringDailyEventsTest.php @@ -1,275 +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']); +// } diff --git a/tests/Unit/RecurringEventsTest.php b/tests/Unit/RecurringEventsTest.php index 74b1887..f3dcf8d 100755 --- a/tests/Unit/RecurringEventsTest.php +++ b/tests/Unit/RecurringEventsTest.php @@ -1,94 +1,79 @@ 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 wont_create_recurring_event_when_multi_day() - { - $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 can_show_last_occurrence_when_no_end_time() - { - 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] - public function can_generate_monthly_by_day_occurrences() - { - Carbon::setTestNow(Carbon::parse('Jan 29 2025 10:00am')); - - $recurringEntry = tap(Entry::make() - ->collection('events') - ->data([ - 'start_date' => ray()->pass(Carbon::now()->addDays(1)->toDateString()), - 'start_time' => '22:00', - 'recurrence' => 'monthly', - 'end_date' => ray()->pass(Carbon::now()->addMonths(3)->toDateString()), - 'timezone' => 'America/Chicago', - 'specific_days' => ['first_sunday', 'last_wednesday'], - ]))->save(); - - $occurrences = Events::fromCollection(handle: 'events') - ->between(Carbon::now(), Carbon::now()->addMonths(4)); - - $this->assertCount(5, $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); +}); + +test('can generate monthly by day occurrences', function () { + Carbon::setTestNow(Carbon::parse('Jan 29 2025 10:00am')); + + $recurringEntry = tap(Entry::make() + ->collection('events') + ->data([ + 'start_date' => Carbon::now()->addDays(1)->toDateString(), + 'start_time' => '22:00', + 'recurrence' => 'monthly', + 'end_date' => Carbon::now()->addMonths(3)->toDateString(), + 'timezone' => 'America/Chicago', + 'specific_days' => ['first_sunday', 'last_wednesday'], + ]))->save(); + + $occurrences = Events::fromCollection(handle: 'events') + ->between(Carbon::now(), Carbon::now()->addMonths(4)); + + expect($occurrences)->toHaveCount(5); +}); diff --git a/tests/Unit/RecurringEveryXEventsTest.php b/tests/Unit/RecurringEveryXEventsTest.php index e05d604..64e2ba8 100755 --- a/tests/Unit/RecurringEveryXEventsTest.php +++ b/tests/Unit/RecurringEveryXEventsTest.php @@ -1,276 +1,251 @@ 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); + $event = EventFactory::createFromEntry($recurringEntry); - $this->assertInstanceOf(RecurringEvent::class, $event); - } + expect($event)->toBeInstanceOf(RecurringEvent::class); +}); - #[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', - ]); +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); + $event = EventFactory::createFromEntry($recurringEntry); - Carbon::setTestNow(now()->addDays(3)); - $nextOccurrences = $event->nextOccurrences(); + Carbon::setTestNow(now()->addDays(3)); + $nextOccurrences = $event->nextOccurrences(); - $this->assertEmpty($nextOccurrences); - } + expect($nextOccurrences)->toBeEmpty(); +}); - #[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', - ]); +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', + ]); - $occurrences = EventFactory::createFromEntry($recurringEntry) - ->nextOccurrences(1); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); - $this->assertCount(1, $occurrences); + expect($occurrences)->toHaveCount(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); + Carbon::setTestNow(now()->setTimeFromTimeString('10:59:59')); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); - $this->assertEquals($startDate, $occurrences[0]->start); - } + expect($occurrences[0]->start)->toEqual($startDate); +}); - #[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', - ]); +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', + ]); - Carbon::setTestNow($startDate->addMinutes(10)); - $occurrences = EventFactory::createFromEntry($recurringEntry) - ->nextOccurrences(1); + Carbon::setTestNow($startDate->addMinutes(10)); + $occurrences = EventFactory::createFromEntry($recurringEntry) + ->nextOccurrences(1); - $this->assertEquals($startDate, $occurrences[0]->start); - } + expect($occurrences[0]->start)->toEqual($startDate); +}); - #[Test] - public function canGenerateOccurrenceIfNowAfterFirstDate() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); +test('can generate occurrence if now after first date', 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' => 'days', - ]); + $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(1)->addHour()); - $event = EventFactory::createFromEntry($recurringEntry); + $event = EventFactory::createFromEntry($recurringEntry); - $occurrences = $event->nextOccurrences(1); + $occurrences = $event->nextOccurrences(1); - $this->assertEquals($startDate->addDays(2), $occurrences[0]->start); + expect($occurrences[0]->start)->toEqual($startDate->addDays(2)); - // $nextDate = $event->upcomingDate(Carbon::now()->addDays(2)); + // $nextDate = $event->upcomingDate(Carbon::now()->addDays(2)); + // $this->assertEquals($startDate, $nextDate->start()); +}); - // $this->assertEquals($startDate, $nextDate->start()); - } +test('can generate next occurrence in weeks if now after start', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - #[Test] - public function canGenerateNextOccurrenceInWeeksIfNowAfterStart() - { - $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); + expect($occurrences[0]->start)->toEqual($startDate->addWeeks(2)); +}); - $this->assertEquals($startDate->addWeeks(2), $occurrences[0]->start); - } +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', + ]); - #[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', - ]); + $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); + expect($occurrences)->not->toBeEmpty(); - $this->assertNotEmpty($occurrences); + expect($occurrences[0]->start)->toEqual(Carbon::parse('2021-03-15')->setTimeFromTimeString('11:00:00')); +}); - $this->assertEquals(Carbon::parse('2021-03-15')->setTimeFromTimeString('11:00:00'), $occurrences[0]->start); - } +test('can generate next occurrence if now during months', function () { + $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); - #[Test] - public function canGenerateNextOccurrenceIfNowDuringMonths() - { - $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', + ]); - $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)); - Carbon::setTestNow($startDate->addMinutes(1)); + $event = EventFactory::createFromEntry($recurringEntry); - $event = EventFactory::createFromEntry($recurringEntry); + $occurrences = $event->nextOccurrences(1); - $occurrences = $event->nextOccurrences(1); + expect($occurrences[0]->start)->toEqual($startDate->setTimeFromTimeString('11:00:00')); +}); - $this->assertEquals($startDate->setTimeFromTimeString('11:00:00'), $occurrences[0]->start); +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', + 'recurrence' => 'every', + 'interval' => 2, + 'period' => 'days', + ]); + $event = EventFactory::createFromEntry($recurringEntry); + + for ($x = 0; $x < 2; $x++) { + $events[] = $startDate->addDays($x * 2); } - #[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); + Carbon::setTestNow($startDate->subMinutes(1)); - for ($x = 0; $x < 2; $x++) { - $events[] = $startDate->addDays($x * 2); - } + $occurrences = $event->nextOccurrences(2); - Carbon::setTestNow($startDate->subMinutes(1)); + expect($occurrences)->toHaveCount(2); - $occurrences = $event->nextOccurrences(2); + 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); - } - - #[Test] - public function canGenerateAllOccurrencesWhenAfterStartDateDaily() - { - $startDate = CarbonImmutable::now()->setTimeFromTimeString('11:00:00'); + $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', + ]); - $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); + } - for ($x = 1; $x <= 2; $x++) { - $events[] = $startDate->addDays($x * 2 + 1); - } + $event = EventFactory::createFromEntry($recurringEntry); - $event = EventFactory::createFromEntry($recurringEntry); + Carbon::setTestNow($startDate->addDays(1)->addHour(2)); + $occurrences = $event->nextOccurrences(5); - Carbon::setTestNow($startDate->addDays(1)->addHour(2)); - $occurrences = $event->nextOccurrences(5); + expect($occurrences)->toHaveCount(2); - $this->assertCount(2, $occurrences); + expect($occurrences[0]->start)->toEqual($events[0]); + expect($occurrences[1]->start)->toEqual($events[1]); +}); - $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')); @@ -386,4 +361,3 @@ public function test_returns_null_when_dates_between_dont_have_event() $this->assertEmpty($dates); } */ -} diff --git a/tests/Unit/SingleDayEventsTest.php b/tests/Unit/SingleDayEventsTest.php index 7e1227c..a9895b3 100755 --- a/tests/Unit/SingleDayEventsTest.php +++ b/tests/Unit/SingleDayEventsTest.php @@ -1,165 +1,144 @@ 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(); +});