diff --git a/app/models/point.rb b/app/models/point.rb index e7c84ea5..a3956dee 100644 --- a/app/models/point.rb +++ b/app/models/point.rb @@ -50,11 +50,11 @@ class Point < ApplicationRecord end def lon - lonlat.x + lonlat.x.to_s end def lat - lonlat.y + lonlat.y.to_s end private diff --git a/app/serializers/api/slim_point_serializer.rb b/app/serializers/api/slim_point_serializer.rb index fed1af0f..dfe224e0 100644 --- a/app/serializers/api/slim_point_serializer.rb +++ b/app/serializers/api/slim_point_serializer.rb @@ -8,8 +8,8 @@ class Api::SlimPointSerializer def call { id: point.id, - latitude: point.lat, - longitude: point.lon, + latitude: point.lat.to_s, + longitude: point.lon.to_s, timestamp: point.timestamp } end diff --git a/app/serializers/point_serializer.rb b/app/serializers/point_serializer.rb index fff0973c..6dfe5502 100644 --- a/app/serializers/point_serializer.rb +++ b/app/serializers/point_serializer.rb @@ -1,7 +1,10 @@ # frozen_string_literal: true class PointSerializer - EXCLUDED_ATTRIBUTES = %w[created_at updated_at visit_id id import_id user_id raw_data lonlat].freeze + EXCLUDED_ATTRIBUTES = %w[ + created_at updated_at visit_id id import_id user_id raw_data lonlat + reverse_geocoded_at + ].freeze def initialize(point) @point = point diff --git a/app/serializers/points/gpx_serializer.rb b/app/serializers/points/gpx_serializer.rb index d4fd2929..6b5d35e0 100644 --- a/app/serializers/points/gpx_serializer.rb +++ b/app/serializers/points/gpx_serializer.rb @@ -17,8 +17,8 @@ class Points::GpxSerializer points.each do |point| track_segment.points << GPX::TrackPoint.new( - lat: point.latitude.to_f, - lon: point.longitude.to_f, + lat: point.lat.to_f, + lon: point.lon.to_f, elevation: point.altitude.to_f, time: point.recorded_at ) diff --git a/spec/fixtures/files/geojson/export_same_points.json b/spec/fixtures/files/geojson/export_same_points.json index f3961b32..f51960a5 100644 --- a/spec/fixtures/files/geojson/export_same_points.json +++ b/spec/fixtures/files/geojson/export_same_points.json @@ -1 +1 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459200,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459201,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459202,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459203,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459204,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459205,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459206,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459207,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459208,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459209,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"reverse_geocoded_at":"2021-01-01T00:00:00.000+01:00","course":null,"course_accuracy":null,"external_track_id":null}}]} +{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459200,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459201,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459202,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459203,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459204,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459205,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459206,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459207,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459208,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}},{"type":"Feature","geometry":{"type":"Point","coordinates":["37.6173","55.755826"]},"properties":{"battery_status":"unplugged","ping":"MyString","battery":1,"tracker_id":"MyString","topic":"MyString","altitude":1,"longitude":"37.6173","velocity":"0","trigger":"background_event","bssid":"MyString","ssid":"MyString","connection":"wifi","vertical_accuracy":1,"accuracy":1,"timestamp":1609459209,"latitude":"55.755826","mode":1,"inrids":[],"in_regions":[],"city":null,"country":null,"geodata":{},"course":null,"course_accuracy":null,"external_track_id":null}}]} diff --git a/spec/models/point_spec.rb b/spec/models/point_spec.rb index 3400ca77..2203ccde 100644 --- a/spec/models/point_spec.rb +++ b/spec/models/point_spec.rb @@ -9,8 +9,6 @@ RSpec.describe Point, type: :model do end describe 'validations' do - it { is_expected.to validate_presence_of(:latitude) } - it { is_expected.to validate_presence_of(:longitude) } it { is_expected.to validate_presence_of(:timestamp) } it { is_expected.to validate_presence_of(:lonlat) } end diff --git a/spec/models/stat_spec.rb b/spec/models/stat_spec.rb index 05d1f091..90337f2f 100644 --- a/spec/models/stat_spec.rb +++ b/spec/models/stat_spec.rb @@ -29,7 +29,7 @@ RSpec.describe Stat, type: :model do create(:point, user:, lonlat: 'POINT(2 2)', timestamp: DateTime.new(year, 1, 1, 2)) end - before { expected_distance[0][1] = 157.23 } + before { expected_distance[0][1] = 156.88 } it 'returns distance by day' do expect(subject).to eq(expected_distance) diff --git a/spec/serializers/api/slim_point_serializer_spec.rb b/spec/serializers/api/slim_point_serializer_spec.rb index 759713b3..17818d71 100644 --- a/spec/serializers/api/slim_point_serializer_spec.rb +++ b/spec/serializers/api/slim_point_serializer_spec.rb @@ -6,8 +6,15 @@ RSpec.describe Api::SlimPointSerializer do describe '#call' do subject(:serializer) { described_class.new(point).call } - let(:point) { create(:point) } - let(:expected_json) { point.attributes.slice('id', 'latitude', 'longitude', 'timestamp') } + let!(:point) { create(:point, :with_known_location) } + let(:expected_json) do + { + id: point.id, + latitude: point.lat, + longitude: point.lon, + timestamp: point.timestamp + } + end it 'returns JSON with correct attributes' do expect(serializer.to_json).to eq(expected_json.to_json) diff --git a/spec/serializers/point_serializer_spec.rb b/spec/serializers/point_serializer_spec.rb index fb35eeef..3d8f73de 100644 --- a/spec/serializers/point_serializer_spec.rb +++ b/spec/serializers/point_serializer_spec.rb @@ -8,15 +8,37 @@ RSpec.describe PointSerializer do let(:point) { create(:point) } let(:expected_json) do - point.attributes.except(*PointSerializer::EXCLUDED_ATTRIBUTES) + { + 'battery_status' => point.battery_status, + 'ping' => point.ping, + 'battery' => point.battery, + 'tracker_id' => point.tracker_id, + 'topic' => point.topic, + 'altitude' => point.altitude, + 'longitude' => point.lon, + 'velocity' => point.velocity, + 'trigger' => point.trigger, + 'bssid' => point.bssid, + 'ssid' => point.ssid, + 'connection' => point.connection, + 'vertical_accuracy' => point.vertical_accuracy, + 'accuracy' => point.accuracy, + 'timestamp' => point.timestamp, + 'latitude' => point.lat, + 'mode' => point.mode, + 'inrids' => point.inrids, + 'in_regions' => point.in_regions, + 'city' => point.city, + 'country' => point.country, + 'geodata' => point.geodata, + 'course' => point.course, + 'course_accuracy' => point.course_accuracy, + 'external_track_id' => point.external_track_id + } end - it 'returns JSON' do + it 'returns JSON with correct attributes' do expect(serializer.to_json).to eq(expected_json.to_json) end - - it 'does not include excluded attributes' do - expect(serializer).not_to include(*PointSerializer::EXCLUDED_ATTRIBUTES) - end end end diff --git a/spec/serializers/points/gpx_serializer_spec.rb b/spec/serializers/points/gpx_serializer_spec.rb index 86d2917d..1207b0b4 100644 --- a/spec/serializers/points/gpx_serializer_spec.rb +++ b/spec/serializers/points/gpx_serializer_spec.rb @@ -24,8 +24,8 @@ RSpec.describe Points::GpxSerializer do serializer.tracks[0].points.each_with_index do |track_point, index| point = points[index] - expect(track_point.lat).to eq(point.lat) - expect(track_point.lon).to eq(point.lon) + expect(track_point.lat.to_s).to eq(point.lat) + expect(track_point.lon.to_s).to eq(point.lon) expect(track_point.time).to eq(point.recorded_at) end end diff --git a/spec/services/google_maps/phone_takeout_parser_spec.rb b/spec/services/google_maps/phone_takeout_parser_spec.rb index 3050abb7..f209418f 100644 --- a/spec/services/google_maps/phone_takeout_parser_spec.rb +++ b/spec/services/google_maps/phone_takeout_parser_spec.rb @@ -35,12 +35,12 @@ RSpec.describe GoogleMaps::PhoneTakeoutParser do it 'creates points with correct data' do parser - expect(Point.all[6].lat).to eq(27.696576) - expect(Point.all[6].lon).to eq(-97.376949) + expect(Point.all[6].lat).to eq('27.696576') + expect(Point.all[6].lon).to eq('-97.376949') expect(Point.all[6].timestamp).to eq(1_693_180_140) - expect(Point.last.lat).to eq(27.709617) - expect(Point.last.lon).to eq(-97.375988) + expect(Point.last.lat).to eq('27.709617') + expect(Point.last.lon).to eq('-97.375988') expect(Point.last.timestamp).to eq(1_693_180_320) end end diff --git a/spec/services/gpx/track_parser_spec.rb b/spec/services/gpx/track_parser_spec.rb index 168b8901..2805f400 100644 --- a/spec/services/gpx/track_parser_spec.rb +++ b/spec/services/gpx/track_parser_spec.rb @@ -53,8 +53,8 @@ RSpec.describe Gpx::TrackParser do it 'creates points with correct data' do parser - expect(Point.first.lat).to eq(37.1722103) - expect(Point.first.lon).to eq(-3.55468) + expect(Point.first.lat).to eq('37.1722103') + expect(Point.first.lon).to eq('-3.55468') expect(Point.first.altitude).to eq(1066) expect(Point.first.timestamp).to eq(Time.zone.parse('2024-04-21T10:19:55Z').to_i) expect(Point.first.velocity).to eq('2.9') @@ -67,8 +67,8 @@ RSpec.describe Gpx::TrackParser do it 'creates points with correct data' do parser - expect(Point.first.lat).to eq(10.758321212464024) - expect(Point.first.lon).to eq(106.64234449272531) + expect(Point.first.lat).to eq('10.758321212464024') + expect(Point.first.lon).to eq('106.64234449272531') expect(Point.first.altitude).to eq(17) expect(Point.first.timestamp).to eq(1_730_626_211) expect(Point.first.velocity).to eq('2.8') diff --git a/spec/services/visits/prepare_spec.rb b/spec/services/visits/prepare_spec.rb index 39935bd1..eac8ed75 100644 --- a/spec/services/visits/prepare_spec.rb +++ b/spec/services/visits/prepare_spec.rb @@ -33,8 +33,8 @@ RSpec.describe Visits::Prepare do date: static_time.to_date.to_s, visits: [ { - latitude: 0.0, - longitude: 0.0, + latitude: '0.0', + longitude: '0.0', radius: 10, points:, duration: 105,