From b60257ef594d262757b234cf15aab2f1416e56b4 Mon Sep 17 00:00:00 2001 From: Andrew Kvalheim Date: Wed, 28 Sep 2022 09:29:12 -0700 Subject: [PATCH 1/3] Add test of EventScheduleSerializer --- .../event_schedule_serializer_spec.rb | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 spec/serializers/event_schedule_serializer_spec.rb diff --git a/spec/serializers/event_schedule_serializer_spec.rb b/spec/serializers/event_schedule_serializer_spec.rb new file mode 100644 index 00000000..9d8c62c0 --- /dev/null +++ b/spec/serializers/event_schedule_serializer_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe EventScheduleSerializer, type: :serializer do + let(:start) { DateTime.new(2000, 1, 2, 3, 4, 5) } + let(:conference) { create(:conference, start_date: start.to_date, start_hour: start.hour) } + let(:program) { create(:program, conference: conference) } + let(:event) { create(:event, program: program) } + let(:event_schedule) { create(:event_schedule, event: event, start_time: start) } + let(:serializer) { described_class.new(event_schedule) } + + it 'sets date and room' do + expected_json = { + date: ' 2000-01-02T03:04:05+0000 ', + room: event_schedule.room.guid + }.to_json + + expect(serializer.to_json).to eq expected_json + end +end From 397341a324cbe110f8afb2e8a67e6bd40c3d18cd Mon Sep 17 00:00:00 2001 From: Andrew Kvalheim Date: Wed, 28 Sep 2022 09:34:01 -0700 Subject: [PATCH 2/3] Use JSON date serializer Effective API changes: - nil serializes to null, not empty string - dates serialize to IETF RFC 3339 with millisecond precision, not second precision surrounded by spaces --- app/serializers/event_schedule_serializer.rb | 8 ++------ app/serializers/event_serializer.rb | 9 +++------ spec/serializers/event_schedule_serializer_spec.rb | 2 +- spec/serializers/event_serializer_spec.rb | 4 ++-- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/app/serializers/event_schedule_serializer.rb b/app/serializers/event_schedule_serializer.rb index 71a2ea59..1123907b 100644 --- a/app/serializers/event_schedule_serializer.rb +++ b/app/serializers/event_schedule_serializer.rb @@ -3,12 +3,8 @@ class EventScheduleSerializer < ActiveModel::Serializer include ActionView::Helpers::TextHelper - attributes :date, :room - - def date - t = object.start_time - t.blank? ? '' : %( #{I18n.l t, format: :short}#{t.formatted_offset(false)} ) - end + attribute :start_time, key: :date + attributes :room def room object.room.guid diff --git a/app/serializers/event_serializer.rb b/app/serializers/event_serializer.rb index 26d53801..99ba6ecf 100644 --- a/app/serializers/event_serializer.rb +++ b/app/serializers/event_serializer.rb @@ -3,12 +3,9 @@ class EventSerializer < ActiveModel::Serializer include ActionView::Helpers::TextHelper - attributes :guid, :title, :length, :scheduled_date, :language, :abstract, :speaker_ids, :type, :room, :track - - def scheduled_date - t = object.time - t.blank? ? '' : %( #{I18n.l t, format: :short}#{t.formatted_offset(false)} ) - end + attributes :guid, :title, :length + attribute :time, key: :scheduled_date + attributes :language, :abstract, :speaker_ids, :type, :room, :track def speaker_ids speakers = object.event_users.select { |i| i.event_role == 'speaker' } diff --git a/spec/serializers/event_schedule_serializer_spec.rb b/spec/serializers/event_schedule_serializer_spec.rb index 9d8c62c0..f07919ab 100644 --- a/spec/serializers/event_schedule_serializer_spec.rb +++ b/spec/serializers/event_schedule_serializer_spec.rb @@ -12,7 +12,7 @@ describe EventScheduleSerializer, type: :serializer do it 'sets date and room' do expected_json = { - date: ' 2000-01-02T03:04:05+0000 ', + date: '2000-01-02T03:04:05.000Z', room: event_schedule.room.guid }.to_json diff --git a/spec/serializers/event_serializer_spec.rb b/spec/serializers/event_serializer_spec.rb index 2b678319..02e840ae 100644 --- a/spec/serializers/event_serializer_spec.rb +++ b/spec/serializers/event_serializer_spec.rb @@ -11,7 +11,7 @@ describe EventSerializer, type: :serializer do guid: event.guid, title: 'Some Talk', length: 30, - scheduled_date: '', + scheduled_date: nil, language: nil, abstract: 'Lorem ipsum dolor sit amet', speaker_ids: event.speaker_ids, @@ -41,7 +41,7 @@ describe EventSerializer, type: :serializer do guid: event.guid, title: 'Some Talk', length: 30, - scheduled_date: ' 2014-03-04T09:00:00+0000 ', + scheduled_date: '2014-03-04T09:00:00.000Z', language: 'English', abstract: 'Lorem ipsum dolor sit amet', speaker_ids: [speaker.id], From 6ce2e66f141b7674ff7eb1f61a0120bd62606cdf Mon Sep 17 00:00:00 2001 From: Andrew Kvalheim Date: Wed, 28 Sep 2022 13:22:15 -0700 Subject: [PATCH 3/3] Correct time zone of API dates Prior to this change, the API returned incorrect dates in UTC instead of the conference time zone. --- app/serializers/event_schedule_serializer.rb | 7 +++++-- app/serializers/event_serializer.rb | 8 +++++--- spec/serializers/event_schedule_serializer_spec.rb | 9 +++++++-- spec/serializers/event_serializer_spec.rb | 8 +++++++- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/app/serializers/event_schedule_serializer.rb b/app/serializers/event_schedule_serializer.rb index 1123907b..44ecdbb9 100644 --- a/app/serializers/event_schedule_serializer.rb +++ b/app/serializers/event_schedule_serializer.rb @@ -3,8 +3,11 @@ class EventScheduleSerializer < ActiveModel::Serializer include ActionView::Helpers::TextHelper - attribute :start_time, key: :date - attributes :room + attributes :date, :room + + def date + object.start_time&.change(zone: object.event.program.conference.timezone) + end def room object.room.guid diff --git a/app/serializers/event_serializer.rb b/app/serializers/event_serializer.rb index 99ba6ecf..5bba12be 100644 --- a/app/serializers/event_serializer.rb +++ b/app/serializers/event_serializer.rb @@ -3,9 +3,11 @@ class EventSerializer < ActiveModel::Serializer include ActionView::Helpers::TextHelper - attributes :guid, :title, :length - attribute :time, key: :scheduled_date - attributes :language, :abstract, :speaker_ids, :type, :room, :track + attributes :guid, :title, :length, :scheduled_date, :language, :abstract, :speaker_ids, :type, :room, :track + + def scheduled_date + object.time&.change(zone: object.program.conference.timezone) + end def speaker_ids speakers = object.event_users.select { |i| i.event_role == 'speaker' } diff --git a/spec/serializers/event_schedule_serializer_spec.rb b/spec/serializers/event_schedule_serializer_spec.rb index f07919ab..9d4cc64e 100644 --- a/spec/serializers/event_schedule_serializer_spec.rb +++ b/spec/serializers/event_schedule_serializer_spec.rb @@ -4,7 +4,12 @@ require 'spec_helper' describe EventScheduleSerializer, type: :serializer do let(:start) { DateTime.new(2000, 1, 2, 3, 4, 5) } - let(:conference) { create(:conference, start_date: start.to_date, start_hour: start.hour) } + let(:timezone) { 'Etc/GMT+11' } + let(:conference) do + create(:conference, start_date: start.to_date, + start_hour: start.hour, + timezone: timezone) + end let(:program) { create(:program, conference: conference) } let(:event) { create(:event, program: program) } let(:event_schedule) { create(:event_schedule, event: event, start_time: start) } @@ -12,7 +17,7 @@ describe EventScheduleSerializer, type: :serializer do it 'sets date and room' do expected_json = { - date: '2000-01-02T03:04:05.000Z', + date: '2000-01-02T03:04:05.000-11:00', room: event_schedule.room.guid }.to_json diff --git a/spec/serializers/event_serializer_spec.rb b/spec/serializers/event_serializer_spec.rb index 02e840ae..e62b8644 100644 --- a/spec/serializers/event_serializer_spec.rb +++ b/spec/serializers/event_serializer_spec.rb @@ -2,7 +2,13 @@ require 'spec_helper' describe EventSerializer, type: :serializer do - let(:event) { create(:event, title: 'Some Talk', abstract: 'Lorem ipsum dolor sit amet') } + let(:conference) { create(:conference, timezone: 'UTC') } + let(:program) { create(:program, conference: conference) } + let(:event) do + create(:event, program: program, + title: 'Some Talk', + abstract: 'Lorem ipsum dolor sit amet') + end let(:serializer) { EventSerializer.new(event) } context 'event does not have date, room and tracks assigned' do