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/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 ++++++++ 8 files changed, 517 insertions(+) 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 (limited to 'tests/Unit/Helpers/Schedule') 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()); + } +} -- cgit v1.2.3-70-g09d2 From 47e209e12594b935ba1670096ae4c55538ebde94 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Sat, 30 Nov 2019 01:15:39 +0100 Subject: ImportSchedule: Append talk language to shift title Resolves #587 (Include talk language into Frab-imported shift titles) --- includes/pages/schedule/ImportSchedule.php | 1 + src/Helpers/Schedule/Event.php | 8 ++++++++ tests/Unit/Helpers/Schedule/EventTest.php | 4 ++++ 3 files changed, 13 insertions(+) (limited to 'tests/Unit/Helpers/Schedule') diff --git a/includes/pages/schedule/ImportSchedule.php b/includes/pages/schedule/ImportSchedule.php index 1b03b57b..8bc769d4 100644 --- a/includes/pages/schedule/ImportSchedule.php +++ b/includes/pages/schedule/ImportSchedule.php @@ -440,6 +440,7 @@ class ImportSchedule extends BaseController $event->getDate()->subMinutes($minutesBefore); $event->getEndDate()->addMinutes($minutesAfter); + $event->setTitle(sprintf('%s [%s]', $event->getTitle(), $event->getLanguage())); } } } diff --git a/src/Helpers/Schedule/Event.php b/src/Helpers/Schedule/Event.php index 46970e7b..ab3b39a5 100644 --- a/src/Helpers/Schedule/Event.php +++ b/src/Helpers/Schedule/Event.php @@ -183,6 +183,14 @@ class Event return $this->title; } + /** + * @param string $title + */ + public function setTitle(string $title): void + { + $this->title = $title; + } + /** * @return string */ diff --git a/tests/Unit/Helpers/Schedule/EventTest.php b/tests/Unit/Helpers/Schedule/EventTest.php index 262aeea7..d9706b13 100644 --- a/tests/Unit/Helpers/Schedule/EventTest.php +++ b/tests/Unit/Helpers/Schedule/EventTest.php @@ -84,6 +84,7 @@ class EventTest extends TestCase * @covers \Engelsystem\Helpers\Schedule\Event::getId * @covers \Engelsystem\Helpers\Schedule\Event::getRoom * @covers \Engelsystem\Helpers\Schedule\Event::getTitle + * @covers \Engelsystem\Helpers\Schedule\Event::setTitle * @covers \Engelsystem\Helpers\Schedule\Event::getSubtitle * @covers \Engelsystem\Helpers\Schedule\Event::getType * @covers \Engelsystem\Helpers\Schedule\Event::getDate @@ -141,5 +142,8 @@ class EventTest extends TestCase $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()); + + $event->setTitle('Event title'); + $this->assertEquals('Event title', $event->getTitle()); } } -- cgit v1.2.3-70-g09d2