From d4bd3c7c8b821deb9846dd0d8a519df4bd92945a Mon Sep 17 00:00:00 2001 From: Akinori MUSHA Date: Fri, 19 Sep 2014 10:36:27 +0900 Subject: [PATCH] Add Event#location. --- app/models/event.rb | 32 +++++++++++++++++++++++++ spec/models/event_spec.rb | 50 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/app/models/event.rb b/app/models/event.rb index df1bdcfa..257ec207 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -32,6 +32,38 @@ class Event < ActiveRecord::Base where.not(lat: nil).where.not(lng: nil) } + def location + @location ||= { + # lat and lng are BigDecimal, so convert them to Float + lat: (lat.to_f if lat), + lng: (lng.to_f if lng), + radius: + begin + h = payload[:horizontal_accuracy].presence + v = payload[:vertical_accuracy].presence + if h && v + (h.to_f + v.to_f) / 2 + else + (h || v || payload[:accuracy]).to_f + end + end, + course: + begin + if (v = payload[:course].presence) && + (v = v.to_f) >= 0 + v + end + end, + speed: + begin + if (v = payload[:speed].presence) && + (v = v.to_f) >= 0 + v + end + end, + } + end + # Emit this event again, as a new Event. def reemit! agent.create_event :payload => payload, :lat => lat, :lng => lng diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index a5f3ddfb..3a13b623 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -15,6 +15,56 @@ describe Event do end end + describe "#location" do + it "returns a default hash when an event does not have a location" do + event = events(:bob_website_agent_event) + event.location.should == { + lat: nil, + lng: nil, + radius: 0.0, + speed: nil, + course: nil, + } + end + + it "returns a hash containing location information" do + event = events(:bob_website_agent_event) + event.lat = 2 + event.lng = 3 + event.payload = { + radius: 300, + speed: 0.5, + course: 90.0, + } + event.save! + event.location.should == { + lat: 2.0, + lng: 3.0, + radius: 0.0, + speed: 0.5, + course: 90.0, + } + end + + it "ignores invalid speed and course" do + event = events(:bob_website_agent_event) + event.lat = 2 + event.lng = 3 + event.payload = { + speed: -1, + course: -1, + } + event.save! + event.location.should == { + lat: 2.0, + lng: 3.0, + radius: 0.0, + speed: nil, + course: nil, + } + end + end + describe "#reemit" do it "creates a new event identical to itself" do events(:bob_website_agent_event).lat = 2