From 42721e95726559b4a601240bb5b0fe4e5d755b2a Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Wed, 27 Nov 2019 23:43:21 +0100 Subject: Added Schedule parsing and replaced old Fahrplan importer Resolves #553 (Change Frab Import from xCal to XML) Resolves #538 (Feature Request: Multi Frab Import) --- tests/Feature/Model/RoomModelTest.php | 2 +- tests/Unit/HasDatabase.php | 19 +-- tests/Unit/Helpers/Schedule/Assets/schedule.xml | 46 +++++++ tests/Unit/Helpers/Schedule/CalculatesTimeTest.php | 33 +++++ tests/Unit/Helpers/Schedule/ConferenceTest.php | 49 +++++++ tests/Unit/Helpers/Schedule/DayTest.php | 47 +++++++ tests/Unit/Helpers/Schedule/EventTest.php | 145 +++++++++++++++++++++ tests/Unit/Helpers/Schedule/RoomTest.php | 31 +++++ tests/Unit/Helpers/Schedule/ScheduleTest.php | 112 ++++++++++++++++ tests/Unit/Helpers/Schedule/XmlParserTest.php | 54 ++++++++ tests/Unit/Http/GuzzleServiceProviderTest.php | 29 +++++ tests/Unit/Models/Shifts/ScheduleShiftTest.php | 41 ++++++ tests/Unit/Models/Shifts/ScheduleTest.php | 37 ++++++ 13 files changed, 636 insertions(+), 9 deletions(-) create mode 100644 tests/Unit/Helpers/Schedule/Assets/schedule.xml create mode 100644 tests/Unit/Helpers/Schedule/CalculatesTimeTest.php create mode 100644 tests/Unit/Helpers/Schedule/ConferenceTest.php create mode 100644 tests/Unit/Helpers/Schedule/DayTest.php create mode 100644 tests/Unit/Helpers/Schedule/EventTest.php create mode 100644 tests/Unit/Helpers/Schedule/RoomTest.php create mode 100644 tests/Unit/Helpers/Schedule/ScheduleTest.php create mode 100644 tests/Unit/Helpers/Schedule/XmlParserTest.php create mode 100644 tests/Unit/Http/GuzzleServiceProviderTest.php create mode 100644 tests/Unit/Models/Shifts/ScheduleShiftTest.php create mode 100644 tests/Unit/Models/Shifts/ScheduleTest.php (limited to 'tests') diff --git a/tests/Feature/Model/RoomModelTest.php b/tests/Feature/Model/RoomModelTest.php index 9908082a..3ed4bcd2 100644 --- a/tests/Feature/Model/RoomModelTest.php +++ b/tests/Feature/Model/RoomModelTest.php @@ -13,7 +13,7 @@ class RoomModelTest extends TestCase */ public function createRoom() { - $this->room_id = Room_create('test', false, null, null); + $this->room_id = Room_create('test', null, null); } /** diff --git a/tests/Unit/HasDatabase.php b/tests/Unit/HasDatabase.php index dbaa253e..3fe29e4a 100644 --- a/tests/Unit/HasDatabase.php +++ b/tests/Unit/HasDatabase.php @@ -36,14 +36,17 @@ trait HasDatabase $this->database ->getConnection() ->table('migrations') - ->insert([ - ['migration' => '2018_01_01_000001_import_install_sql'], - ['migration' => '2018_01_01_000002_import_update_sql'], - ['migration' => '2018_01_01_000003_fix_old_tables'], - ['migration' => '2018_01_01_000004_cleanup_group_privileges'], - ['migration' => '2018_01_01_000005_add_angel_supporter_permissions'], - ['migration' => '2018_12_27_000000_fix_missing_arrival_dates'], - ]); + ->insert( + [ + ['migration' => '2018_01_01_000001_import_install_sql'], + ['migration' => '2018_01_01_000002_import_update_sql'], + ['migration' => '2018_01_01_000003_fix_old_tables'], + ['migration' => '2018_01_01_000004_cleanup_group_privileges'], + ['migration' => '2018_01_01_000005_add_angel_supporter_permissions'], + ['migration' => '2018_12_27_000000_fix_missing_arrival_dates'], + ['migration' => '2019_09_07_000000_migrate_admin_schedule_permissions'], + ] + ); $migration->run(__DIR__ . '/../../db/migrations'); } diff --git a/tests/Unit/Helpers/Schedule/Assets/schedule.xml b/tests/Unit/Helpers/Schedule/Assets/schedule.xml new file mode 100644 index 00000000..45aaaf35 --- /dev/null +++ b/tests/Unit/Helpers/Schedule/Assets/schedule.xml @@ -0,0 +1,46 @@ + + + Some version string + + Test Event + Test1 + 2042-01-01 + 2042-01-01 + 1 + 00:15 + https://foo.bar/baz/schedule/ + + + + + 2042-01-01T12:30:00+02:00 + Foo Bar Test + Some sub + 12:30 + 00:30 + Rooming + foo-bar-test + + WTFPL + false + + Testing + Talk + de + Foo bar is da best + Any describing stuff? + https://foo.bar/baz/schedule/ipsum + https://lorem.ipsum/foo/bar.png + + Some Person + + + Some Foo Bar + + + A PDF File + + + + + diff --git a/tests/Unit/Helpers/Schedule/CalculatesTimeTest.php b/tests/Unit/Helpers/Schedule/CalculatesTimeTest.php new file mode 100644 index 00000000..8f0123e9 --- /dev/null +++ b/tests/Unit/Helpers/Schedule/CalculatesTimeTest.php @@ -0,0 +1,33 @@ +secondsFromTime($time); + } + }; + + $this->assertEquals(0, $calc->calc('0:00')); + $this->assertEquals(60, $calc->calc('0:01')); + $this->assertEquals(60 * 60, $calc->calc('01:00')); + $this->assertEquals(60 * 60 * 10 + 60 * 11, $calc->calc('10:11')); + } +} diff --git a/tests/Unit/Helpers/Schedule/ConferenceTest.php b/tests/Unit/Helpers/Schedule/ConferenceTest.php new file mode 100644 index 00000000..959e272b --- /dev/null +++ b/tests/Unit/Helpers/Schedule/ConferenceTest.php @@ -0,0 +1,49 @@ +assertEquals('Doing stuff', $conference->getTitle()); + $this->assertEquals('DS', $conference->getAcronym()); + $this->assertNull($conference->getStart()); + $this->assertNull($conference->getEnd()); + $this->assertNull($conference->getDays()); + $this->assertNull($conference->getTimeslotDuration()); + $this->assertNull($conference->getTimeslotDurationSeconds()); + $this->assertNull($conference->getBaseUrl()); + + $conference = new Conference( + 'Doing stuff', + 'DS', + '2042-01-01', + '2042-01-10', + 10, + '00:10', + 'https://foo.bar/schedule' + ); + $this->assertEquals('2042-01-01', $conference->getStart()); + $this->assertEquals('2042-01-10', $conference->getEnd()); + $this->assertEquals(10, $conference->getDays()); + $this->assertEquals('00:10', $conference->getTimeslotDuration()); + $this->assertEquals(60 * 10, $conference->getTimeslotDurationSeconds()); + $this->assertEquals('https://foo.bar/schedule', $conference->getBaseUrl()); + } +} diff --git a/tests/Unit/Helpers/Schedule/DayTest.php b/tests/Unit/Helpers/Schedule/DayTest.php new file mode 100644 index 00000000..65704181 --- /dev/null +++ b/tests/Unit/Helpers/Schedule/DayTest.php @@ -0,0 +1,47 @@ +assertEquals('2000-01-01', $day->getDate()); + $this->assertEquals('2000-01-01T03:00:00+01:00', $day->getStart()->format(Carbon::RFC3339)); + $this->assertEquals('2000-01-02T05:59:00+00:00', $day->getEnd()->format(Carbon::RFC3339)); + $this->assertEquals(1, $day->getIndex()); + $this->assertEquals([], $day->getRoom()); + + $rooms = [ + new Room('Foo'), + new Room('Bar'), + ]; + $day = new Day( + '2001-01-01', + new Carbon('2001-01-01T03:00:00+01:00'), + new Carbon('2001-01-02T05:59:00+00:00'), + 1, + $rooms + ); + $this->assertEquals($rooms, $day->getRoom()); + } +} diff --git a/tests/Unit/Helpers/Schedule/EventTest.php b/tests/Unit/Helpers/Schedule/EventTest.php new file mode 100644 index 00000000..262aeea7 --- /dev/null +++ b/tests/Unit/Helpers/Schedule/EventTest.php @@ -0,0 +1,145 @@ +assertEquals('0-1-2-3', $event->getGuid()); + $this->assertEquals(1, $event->getId()); + $this->assertEquals($room, $event->getRoom()); + $this->assertEquals('Some stuff', $event->getTitle()); + $this->assertEquals('sub stuff', $event->getSubtitle()); + $this->assertEquals('Talk', $event->getType()); + $this->assertEquals($date, $event->getDate()); + $this->assertEquals('19:30:00', $event->getStart()); + $this->assertEquals('00:50', $event->getDuration()); + $this->assertEquals('Doing stuff is hard, plz try again', $event->getAbstract()); + $this->assertEquals('1-some-stuff', $event->getSlug()); + $this->assertEquals('Security', $event->getTrack()); + $this->assertNull($event->getLogo()); + $this->assertEquals([], $event->getPersons()); + $this->assertNull($event->getLanguage()); + $this->assertNull($event->getDescription()); + $this->assertEquals('', $event->getRecording()); + $this->assertEquals([], $event->getLinks()); + $this->assertEquals([], $event->getAttachments()); + $this->assertNull($event->getUrl()); + $this->assertNull($event->getVideoDownloadUrl()); + $this->assertEquals('2020-12-28T20:20:00+00:00', $event->getEndDate()->format(Carbon::RFC3339)); + } + + /** + * @covers \Engelsystem\Helpers\Schedule\Event::__construct + * @covers \Engelsystem\Helpers\Schedule\Event::getGuid + * @covers \Engelsystem\Helpers\Schedule\Event::getId + * @covers \Engelsystem\Helpers\Schedule\Event::getRoom + * @covers \Engelsystem\Helpers\Schedule\Event::getTitle + * @covers \Engelsystem\Helpers\Schedule\Event::getSubtitle + * @covers \Engelsystem\Helpers\Schedule\Event::getType + * @covers \Engelsystem\Helpers\Schedule\Event::getDate + * @covers \Engelsystem\Helpers\Schedule\Event::getStart + * @covers \Engelsystem\Helpers\Schedule\Event::getDuration + * @covers \Engelsystem\Helpers\Schedule\Event::getDurationSeconds + * @covers \Engelsystem\Helpers\Schedule\Event::getAbstract + * @covers \Engelsystem\Helpers\Schedule\Event::getSlug + * @covers \Engelsystem\Helpers\Schedule\Event::getTrack + * @covers \Engelsystem\Helpers\Schedule\Event::getLogo + * @covers \Engelsystem\Helpers\Schedule\Event::getPersons + * @covers \Engelsystem\Helpers\Schedule\Event::getLanguage + * @covers \Engelsystem\Helpers\Schedule\Event::getDescription + * @covers \Engelsystem\Helpers\Schedule\Event::getRecording + * @covers \Engelsystem\Helpers\Schedule\Event::getLinks + * @covers \Engelsystem\Helpers\Schedule\Event::getAttachments + * @covers \Engelsystem\Helpers\Schedule\Event::getUrl + * @covers \Engelsystem\Helpers\Schedule\Event::getVideoDownloadUrl + */ + public function testCreateNotDefault() + { + $persons = [1337 => 'Some Person']; + $links = ['https://foo.bar' => 'Foo Bar']; + $attachments = ['/files/foo.pdf' => 'Suspicious PDF']; + $event = new Event( + '3-2-1-0', + 2, + new Room('Bar'), + 'Lorem', + 'Ipsum', + 'Workshop', + new Carbon('2021-01-01T00:00:00+00:00'), + '00:00:00', + '00:30', + 'Lorem ipsum dolor sit amet', + '2-lorem', + 'DevOps', + '/foo/bar.png', + $persons, + 'de', + 'Foo bar is awesome! & That\'s why...', + 'CC BY SA', + $links, + $attachments, + 'https://foo.bar/2-lorem', + 'https://videos.orem.ipsum/2-lorem.mp4' + ); + + $this->assertEquals('/foo/bar.png', $event->getLogo()); + $this->assertEquals($persons, $event->getPersons()); + $this->assertEquals('de', $event->getLanguage()); + $this->assertEquals('Foo bar is awesome! & That\'s why...', $event->getDescription()); + $this->assertEquals('CC BY SA', $event->getRecording()); + $this->assertEquals($links, $event->getLinks()); + $this->assertEquals($attachments, $event->getAttachments()); + $this->assertEquals('https://foo.bar/2-lorem', $event->getUrl()); + $this->assertEquals('https://videos.orem.ipsum/2-lorem.mp4', $event->getVideoDownloadUrl()); + } +} diff --git a/tests/Unit/Helpers/Schedule/RoomTest.php b/tests/Unit/Helpers/Schedule/RoomTest.php new file mode 100644 index 00000000..8b9b600a --- /dev/null +++ b/tests/Unit/Helpers/Schedule/RoomTest.php @@ -0,0 +1,31 @@ +assertEquals('Test', $room->getName()); + $this->assertEquals([], $room->getEvent()); + + $events = [$this->createMock(Event::class), $this->createMock(Event::class)]; + $events2 = [$this->createMock(Event::class)]; + $room = new Room('Test2', $events); + $this->assertEquals($events, $room->getEvent()); + + $room->setEvent($events2); + $this->assertEquals($events2, $room->getEvent()); + } +} diff --git a/tests/Unit/Helpers/Schedule/ScheduleTest.php b/tests/Unit/Helpers/Schedule/ScheduleTest.php new file mode 100644 index 00000000..6a3634cf --- /dev/null +++ b/tests/Unit/Helpers/Schedule/ScheduleTest.php @@ -0,0 +1,112 @@ +createMock(Day::class)]; + $schedule = new Schedule('Foo\'ing stuff 1.0', $conference, $days); + + $this->assertEquals('Foo\'ing stuff 1.0', $schedule->getVersion()); + $this->assertEquals($conference, $schedule->getConference()); + $this->assertEquals($days, $schedule->getDay()); + } + + /** + * @covers \Engelsystem\Helpers\Schedule\Schedule::getRooms + */ + public function testGetRooms() + { + $conference = new Conference('Test', 'T'); + $room1 = new Room('Test 1'); + $room2 = new Room('Test 2'); + $room3 = new Room('Test 3'); + $days = [ + new Day( + '2042-01-01', + new Carbon('2042-01-01T00:00:00+00:00'), + new Carbon('2042-01-01T23:59:00+00:00'), + 1, + [$room1, $room2] + ), + new Day( + '2042-01-02', + new Carbon('2042-02-01T00:00:00+00:00'), + new Carbon('2042-02-01T23:59:00+00:00'), + 2, + [new Room('Test 2'), $room3] + ), + ]; + $schedule = new Schedule('Lorem 1.3.3.7', $conference, $days); + + $this->assertEquals(['Test 1' => $room1, 'Test 2' => $room2, 'Test 3' => $room3], $schedule->getRooms()); + + $schedule = new Schedule('Lorem 1.3.3.0', $conference, []); + $this->assertEquals([], $schedule->getRooms()); + } + + /** + * @covers \Engelsystem\Helpers\Schedule\Schedule::getStartDateTime + * @covers \Engelsystem\Helpers\Schedule\Schedule::getEndDateTime + */ + public function testGetDateTimes() + { + $conference = new Conference('Some Conference', 'SC'); + $days = [ + new Day( + '2042-01-02', + new Carbon('2042-01-02T00:00:00+00:00'), + new Carbon('2042-01-02T23:59:00+00:00'), + 2 + ), + new Day( + '2042-01-01', + new Carbon('2042-01-01T00:00:00+00:00'), + new Carbon('2042-01-01T23:59:00+00:00'), + 1 + ), + new Day( + '2042-01-04', + new Carbon('2042-01-04T00:00:00+00:00'), + new Carbon('2042-01-04T23:59:00+00:00'), + 3 + ), + ]; + $schedule = new Schedule('Ipsum tester', $conference, $days); + + $this->assertEquals('2042-01-01T00:00:00+00:00', $schedule->getStartDateTime()->format(Carbon::RFC3339)); + $this->assertEquals('2042-01-04T23:59:00+00:00', $schedule->getEndDateTime()->format(Carbon::RFC3339)); + + $schedule = new Schedule('Ipsum old', $conference, []); + $this->assertNull($schedule->getStartDateTime()); + $this->assertNull($schedule->getEndDateTime()); + } + + /** + * Prepare test + */ + protected function setUp(): void + { + parent::setUp(); + $this->initDatabase(); + } +} diff --git a/tests/Unit/Helpers/Schedule/XmlParserTest.php b/tests/Unit/Helpers/Schedule/XmlParserTest.php new file mode 100644 index 00000000..023e9c7d --- /dev/null +++ b/tests/Unit/Helpers/Schedule/XmlParserTest.php @@ -0,0 +1,54 @@ +assertFalse($parser->load('foo')); + $this->assertTrue($parser->load(file_get_contents(__DIR__ . '/Assets/schedule.xml'))); + + $schedule = $parser->getSchedule(); + $this->assertEquals('Some version string', $schedule->getVersion()); + $this->assertEquals('Test Event', $schedule->getConference()->getTitle()); + + /** @var Room $room */ + $room = Arr::first($schedule->getRooms()); + $this->assertEquals('Rooming', $room->getName()); + + /** @var Day $day */ + $day = Arr::first($schedule->getDay()); + $this->assertEquals('2042-01-01', $day->getDate()); + $this->assertEquals(1, $day->getIndex()); + + /** @var Room $room */ + $room = Arr::first($day->getRoom()); + /** @var Event $event */ + $event = Arr::first($room->getEvent()); + + $this->assertEquals('Foo Bar Test', $event->getTitle()); + $this->assertEquals('WTFPL', $event->getRecording()); + $this->assertEquals('de', $event->getLanguage()); + $this->assertEquals('12:30', $event->getStart()); + $this->assertEquals([1234 => 'Some Person'], $event->getPersons()); + } +} diff --git a/tests/Unit/Http/GuzzleServiceProviderTest.php b/tests/Unit/Http/GuzzleServiceProviderTest.php new file mode 100644 index 00000000..4d3c938b --- /dev/null +++ b/tests/Unit/Http/GuzzleServiceProviderTest.php @@ -0,0 +1,29 @@ +register(); + + /** @var GuzzleClient $guzzle */ + $guzzle = $app->make(GuzzleClient::class); + $config = $guzzle->getConfig(); + + $this->assertFalse($config['http_errors']); + $this->assertArrayHasKey('timeout', $config); + } +} diff --git a/tests/Unit/Models/Shifts/ScheduleShiftTest.php b/tests/Unit/Models/Shifts/ScheduleShiftTest.php new file mode 100644 index 00000000..b615f90d --- /dev/null +++ b/tests/Unit/Models/Shifts/ScheduleShiftTest.php @@ -0,0 +1,41 @@ + 'https://lorem.ipsum/schedule.xml']); + $schedule->save(); + + $scheduleShift = new ScheduleShift(['shift_id' => 1, 'guid' => 'a']); + $scheduleShift->schedule()->associate($schedule); + $scheduleShift->save(); + + /** @var ScheduleShift $scheduleShift */ + $scheduleShift = (new ScheduleShift())->find(1); + $this->assertInstanceOf(BelongsTo::class, $scheduleShift->schedule()); + $this->assertEquals($schedule->id, $scheduleShift->schedule->id); + } + + /** + * Prepare test + */ + protected function setUp(): void + { + parent::setUp(); + $this->initDatabase(); + } +} diff --git a/tests/Unit/Models/Shifts/ScheduleTest.php b/tests/Unit/Models/Shifts/ScheduleTest.php new file mode 100644 index 00000000..34988afd --- /dev/null +++ b/tests/Unit/Models/Shifts/ScheduleTest.php @@ -0,0 +1,37 @@ + 'https://foo.bar/schedule.xml']); + $schedule->save(); + + (new ScheduleShift(['shift_id' => 1, 'schedule_id' => $schedule->id, 'guid' => 'a']))->save(); + (new ScheduleShift(['shift_id' => 2, 'schedule_id' => $schedule->id, 'guid' => 'b']))->save(); + (new ScheduleShift(['shift_id' => 3, 'schedule_id' => $schedule->id, 'guid' => 'c']))->save(); + + $this->assertCount(3, $schedule->scheduleShifts); + } + + /** + * Prepare test + */ + protected function setUp(): void + { + parent::setUp(); + $this->initDatabase(); + } +} -- cgit v1.2.3-54-g00ecf