diff --git a/app/graphql/types/address_type.rb b/app/graphql/types/address_type.rb new file mode 100644 index 000000000..6c26a8641 --- /dev/null +++ b/app/graphql/types/address_type.rb @@ -0,0 +1,17 @@ +module Types + class AddressType < Types::BaseObject + + description 'An address representing a physical location' + + # field :id, ID, null: false + field :street_address, String + field :street_address2, String + field :street_address3, String + field :city, String + field :postcode, String + field :country_code, String + field :full_street_address, String + field :all_address_lines, [String] + end +end + diff --git a/app/graphql/types/event_type.rb b/app/graphql/types/event_type.rb new file mode 100644 index 000000000..55f16c74c --- /dev/null +++ b/app/graphql/types/event_type.rb @@ -0,0 +1,14 @@ +module Types + class EventType < Types::BaseObject + + description 'An Event that is run by a Parter' + + field :id, ID, null: false + field :description, String + field :summary, String + + field :address, AddressType + + end +end + diff --git a/app/graphql/types/partner_type.rb b/app/graphql/types/partner_type.rb index 1ce3e8779..d1c384b69 100644 --- a/app/graphql/types/partner_type.rb +++ b/app/graphql/types/partner_type.rb @@ -1,7 +1,7 @@ module Types class PartnerType < Types::BaseObject - description 'A partner' + description 'A Partner who runs Events' field :id, ID, null: false field :name, String, null: false diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb index 149dff033..81993d564 100644 --- a/app/graphql/types/query_type.rb +++ b/app/graphql/types/query_type.rb @@ -23,6 +23,24 @@ def all_partners Partner.all end + #### + + field :event, EventType, "Find Event by ID" do + argument :id, ID + end + + field :all_events, [EventType] + + def event(id:) + Event.find(id) + end + + def all_events + Event.all + end + + #### + field :ping, String, null: false, description: "Ping server" def ping diff --git a/test/integration/graphql/event_integration_test.rb b/test/integration/graphql/event_integration_test.rb new file mode 100644 index 000000000..899aaca16 --- /dev/null +++ b/test/integration/graphql/event_integration_test.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require 'test_helper' + +class GraphQLEventTest < ActionDispatch::IntegrationTest + + setup do + @partner = FactoryBot.create(:partner) + + @address = @partner.address + assert @address, 'Failed to create Address from partner' + + @calendar = FactoryBot.create( + :calendar, + partner: @partner, + name: 'Partner Calendar', + source: 'http://example.com' + ) + assert @calendar, 'Failed to create calendar from partner' + end + + test 'can show partners' do + + (0...5).collect do |n| + @partner.events.create!( + dtstart: Time.now, + summary: "An event summary #{n}", + description: 'Longer text covering the event in more detail', + address: @address + ) + end + + query_string = <<-GRAPHQL + query { + allEvents { + id + summary + description + } + } + GRAPHQL + + result = PlaceCalSchema.execute(query_string) + data = result['data'] + assert data.has_key?('allEvents'), 'result is missing key `allEvents`' + + events = data['allEvents'] + assert events.length == 5 + end + + test 'can show specific event' do + event = @partner.events.create!( + dtstart: Time.now, + summary: "An event summary", + description: 'Longer text covering the event in more detail', + address: @address + ) + + query_string = <<-GRAPHQL + query { + event(id: #{event.id}) { + id + summary + description + address { + streetAddress + city + postcode + } + } + } + GRAPHQL + + result = PlaceCalSchema.execute(query_string) + + data = result['data'] + assert data.has_key?('event'), 'Data structure does not contain event key' + + data_event = data['event'] + assert data_event['summary'] == event.summary + end +end