Commit f37c1062

mo khan <mo@mokhan.ca>
2014-09-29 02:06:17
associate user sessions to locations.
1 parent 517a55e
Changed files (3)
app/models/user_session.rb
@@ -1,5 +1,6 @@
 class UserSession < ActiveRecord::Base
   belongs_to :user
+  has_one :location, as: :locatable
   before_create :set_unique_key
   attr_readonly :key
   scope :active, -> { where("accessed_at >= ?", 2.weeks.ago).where(revoked_at: nil).includes(:user) }
@@ -14,6 +15,7 @@ class UserSession < ActiveRecord::Base
     self.ip = request.ip
     self.user_agent = request.user_agent
     apply_geo_location_information_for(request)
+    self.location = Location.build_from_ip(request.ip)
     if save
       {
         value: key,
@@ -39,11 +41,6 @@ class UserSession < ActiveRecord::Base
   end
 
   def apply_geo_location_information_for(request)
-    location = Location.build_from_ip(request.ip)
-    return if location.nil?
-    self.latitude = location.latitude
-    self.longitude = location.longitude
-    self.city = location.city
-    self.country = location.country
+    self.location = Location.build_from_ip(request.ip)
   end
 end
spec/models/user_session_spec.rb
@@ -12,8 +12,13 @@ describe UserSession do
 
   describe "#access" do
     let(:request) { double(ip: '192.168.1.1', user_agent: 'blah') }
+    let(:location) { build(:location) }
     let!(:because) { subject.access(request) }
 
+    before :each do
+      Location.stub(:build_from_ip).with('192.168.1.1').and_return(location)
+    end
+
     it "records the time the session was accessed" do
       expect(subject.accessed_at).to_not be_nil
     end
@@ -26,6 +31,10 @@ describe UserSession do
       expect(subject.user_agent).to eql(request.user_agent)
     end
 
+    it 'records a location for the session' do
+      expect(subject.location).to_not be_nil
+    end
+
     it "returns a hash to store in the cookie" do
       expect(because[:value]).to eql(subject.key)
       expect(because[:httponly]).to be_truthy
spec/factories.rb
@@ -58,4 +58,10 @@ FactoryGirl.define do
       admin true
     end
   end
+  factory :location do
+    latitude "107"
+    longitude "99"
+    city "Calgary"
+    country "Canada"
+  end
 end