From ebd0f8d6bcd5384f7297cf7c4b830acec5717c5c Mon Sep 17 00:00:00 2001 From: Eugene Burmakin Date: Wed, 19 Nov 2025 20:56:46 +0100 Subject: [PATCH] Fix some tests --- app/models/place.rb | 1 - app/serializers/api/place_serializer.rb | 27 ++++++++ app/services/visits/place_finder.rb | 1 - spec/requests/api/v1/maps/hexagons_spec.rb | 5 +- spec/requests/authentication_spec.rb | 7 -- spec/requests/exports_spec.rb | 5 -- spec/requests/family/invitations_spec.rb | 5 +- spec/requests/family_workflows_spec.rb | 5 +- spec/requests/imports_spec.rb | 9 +-- spec/requests/map_spec.rb | 5 +- spec/requests/notifications_spec.rb | 5 +- spec/requests/places_spec.rb | 2 +- .../requests/settings/background_jobs_spec.rb | 5 +- spec/requests/settings/maps_spec.rb | 5 +- spec/requests/shared/stats_spec.rb | 5 +- spec/requests/stats_spec.rb | 5 +- spec/requests/users/registrations_spec.rb | 5 +- spec/requests/users_spec.rb | 5 +- spec/serializers/api/place_serializer_spec.rb | 67 +++++++++++++++++++ spec/services/visits/place_finder_spec.rb | 11 +-- spec/support/geocoder_stubs.rb | 4 +- spec/support/github_api_stubs.rb | 6 +- 22 files changed, 120 insertions(+), 75 deletions(-) create mode 100644 app/serializers/api/place_serializer.rb create mode 100644 spec/serializers/api/place_serializer_spec.rb diff --git a/app/models/place.rb b/app/models/place.rb index 4ee6a0e1..b95d2883 100644 --- a/app/models/place.rb +++ b/app/models/place.rb @@ -15,7 +15,6 @@ class Place < ApplicationRecord before_validation :build_lonlat, if: -> { latitude.present? && longitude.present? } validates :name, presence: true - validates :latitude, :longitude, presence: true validates :lonlat, presence: true enum :source, { manual: 0, photon: 1 } diff --git a/app/serializers/api/place_serializer.rb b/app/serializers/api/place_serializer.rb new file mode 100644 index 00000000..ae91bbdb --- /dev/null +++ b/app/serializers/api/place_serializer.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class Api::PlaceSerializer + def initialize(place) + @place = place + end + + def call + { + id: place.id, + name: place.name, + longitude: place.lon, + latitude: place.lat, + city: place.city, + country: place.country, + source: place.source, + geodata: place.geodata, + created_at: place.created_at, + updated_at: place.updated_at, + reverse_geocoded_at: place.reverse_geocoded_at + } + end + + private + + attr_reader :place +end diff --git a/app/services/visits/place_finder.rb b/app/services/visits/place_finder.rb index ed495fca..65a8ce24 100644 --- a/app/services/visits/place_finder.rb +++ b/app/services/visits/place_finder.rb @@ -174,7 +174,6 @@ module Visits # Create new place place = user.places.build( name: name, - lonlat: "POINT(#{result.longitude} #{result.latitude})", latitude: result.latitude, longitude: result.longitude, city: properties['city'], diff --git a/spec/requests/api/v1/maps/hexagons_spec.rb b/spec/requests/api/v1/maps/hexagons_spec.rb index c0bb87a4..f301fd5b 100644 --- a/spec/requests/api/v1/maps/hexagons_spec.rb +++ b/spec/requests/api/v1/maps/hexagons_spec.rb @@ -5,10 +5,7 @@ require 'rails_helper' RSpec.describe 'Api::V1::Maps::Hexagons', type: :request do let(:user) { create(:user) } - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + describe 'GET /api/v1/maps/hexagons' do let(:valid_params) do diff --git a/spec/requests/authentication_spec.rb b/spec/requests/authentication_spec.rb index 75620f5c..4486e86c 100644 --- a/spec/requests/authentication_spec.rb +++ b/spec/requests/authentication_spec.rb @@ -5,13 +5,6 @@ require 'rails_helper' RSpec.describe 'Authentication', type: :request do let(:user) { create(:user, password: 'password123') } - before do - stub_request(:get, 'https://api.github.com/repos/Freika/dawarich/tags') - .with(headers: { 'Accept' => '*/*', 'Accept-Encoding' => /.*/, - 'Host' => 'api.github.com', 'User-Agent' => /.*/ }) - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end - describe 'Route Protection' do it 'redirects to sign in page when accessing protected routes while signed out' do get map_path diff --git a/spec/requests/exports_spec.rb b/spec/requests/exports_spec.rb index 8fd9f43c..e70fdbc6 100644 --- a/spec/requests/exports_spec.rb +++ b/spec/requests/exports_spec.rb @@ -6,11 +6,6 @@ RSpec.describe '/exports', type: :request do let(:user) { create(:user) } let(:params) { { start_at: 1.day.ago, end_at: Time.zone.now } } - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end - describe 'GET /index' do context 'when user is not logged in' do it 'redirects to the login page' do diff --git a/spec/requests/family/invitations_spec.rb b/spec/requests/family/invitations_spec.rb index b75d501e..2c0840c2 100644 --- a/spec/requests/family/invitations_spec.rb +++ b/spec/requests/family/invitations_spec.rb @@ -8,10 +8,7 @@ RSpec.describe 'Family::Invitations', type: :request do let!(:membership) { create(:family_membership, user: user, family: family, role: :owner) } let(:invitation) { create(:family_invitation, family: family, invited_by: user) } - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + describe 'GET /family/invitations' do before { sign_in user } diff --git a/spec/requests/family_workflows_spec.rb b/spec/requests/family_workflows_spec.rb index 38f64ed9..7b2bccf4 100644 --- a/spec/requests/family_workflows_spec.rb +++ b/spec/requests/family_workflows_spec.rb @@ -7,10 +7,7 @@ RSpec.describe 'Family Workflows', type: :request do let(:user2) { create(:user, email: 'bob@example.com') } let(:user3) { create(:user, email: 'charlie@example.com') } - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + describe 'Complete family creation and management workflow' do it 'allows creating a family, inviting members, and managing the family' do diff --git a/spec/requests/imports_spec.rb b/spec/requests/imports_spec.rb index 09481269..8c1b8c90 100644 --- a/spec/requests/imports_spec.rb +++ b/spec/requests/imports_spec.rb @@ -3,10 +3,7 @@ require 'rails_helper' RSpec.describe 'Imports', type: :request do - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + describe 'GET /imports' do context 'when user is logged in' do @@ -63,7 +60,7 @@ RSpec.describe 'Imports', type: :request do it 'prevents viewing other users import' do get import_path(other_import) - + expect(response).to redirect_to(root_path) expect(flash[:alert]).to eq('You are not authorized to perform this action.') end @@ -100,7 +97,7 @@ RSpec.describe 'Imports', type: :request do it 'prevents access to new import form' do get new_import_path - + expect(response).to redirect_to(root_path) expect(flash[:alert]).to eq('You are not authorized to perform this action.') end diff --git a/spec/requests/map_spec.rb b/spec/requests/map_spec.rb index 700a214a..249a465f 100644 --- a/spec/requests/map_spec.rb +++ b/spec/requests/map_spec.rb @@ -3,10 +3,7 @@ require 'rails_helper' RSpec.describe 'Map', type: :request do - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + describe 'GET /index' do context 'when user signed in' do diff --git a/spec/requests/notifications_spec.rb b/spec/requests/notifications_spec.rb index b5e4d33f..57a293b0 100644 --- a/spec/requests/notifications_spec.rb +++ b/spec/requests/notifications_spec.rb @@ -3,10 +3,7 @@ require 'rails_helper' RSpec.describe '/notifications', type: :request do - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + context 'when user is not logged in' do it 'redirects to the login page' do diff --git a/spec/requests/places_spec.rb b/spec/requests/places_spec.rb index 33b9c333..9cb34c7e 100644 --- a/spec/requests/places_spec.rb +++ b/spec/requests/places_spec.rb @@ -21,7 +21,7 @@ RSpec.describe '/places', type: :request do end describe 'DELETE /destroy' do - let!(:place) { create(:place) } + let!(:place) { create(:place, user:) } let!(:visit) { create(:visit, place:, user:) } it 'destroys the requested place' do diff --git a/spec/requests/settings/background_jobs_spec.rb b/spec/requests/settings/background_jobs_spec.rb index f2bea2cd..0ba45f9c 100644 --- a/spec/requests/settings/background_jobs_spec.rb +++ b/spec/requests/settings/background_jobs_spec.rb @@ -3,10 +3,7 @@ require 'rails_helper' RSpec.describe '/settings/background_jobs', type: :request do - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + context 'when Dawarich is in self-hosted mode' do before do diff --git a/spec/requests/settings/maps_spec.rb b/spec/requests/settings/maps_spec.rb index 4e641945..698e79a9 100644 --- a/spec/requests/settings/maps_spec.rb +++ b/spec/requests/settings/maps_spec.rb @@ -3,10 +3,7 @@ require 'rails_helper' RSpec.describe 'settings/maps', type: :request do - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + context 'when user is authenticated' do let!(:user) { create(:user) } diff --git a/spec/requests/shared/stats_spec.rb b/spec/requests/shared/stats_spec.rb index 49bf7ebb..aa8e704a 100644 --- a/spec/requests/shared/stats_spec.rb +++ b/spec/requests/shared/stats_spec.rb @@ -3,10 +3,7 @@ require 'rails_helper' RSpec.describe 'Shared::Stats', type: :request do - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + context 'public sharing' do let(:user) { create(:user) } diff --git a/spec/requests/stats_spec.rb b/spec/requests/stats_spec.rb index b6755cb9..fbf3e313 100644 --- a/spec/requests/stats_spec.rb +++ b/spec/requests/stats_spec.rb @@ -3,10 +3,7 @@ require 'rails_helper' RSpec.describe '/stats', type: :request do - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + context 'when user is not signed in' do describe 'GET /index' do diff --git a/spec/requests/users/registrations_spec.rb b/spec/requests/users/registrations_spec.rb index 726c2ac3..d19ccc5f 100644 --- a/spec/requests/users/registrations_spec.rb +++ b/spec/requests/users/registrations_spec.rb @@ -10,10 +10,7 @@ RSpec.describe 'Users::Registrations', type: :request do create(:family_invitation, family: family, invited_by: family_owner, email: 'invited@example.com') end - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + describe 'Family Invitation Registration Flow' do context 'when accessing registration with a valid invitation token' do diff --git a/spec/requests/users_spec.rb b/spec/requests/users_spec.rb index 219c4d4d..6e61fbe6 100644 --- a/spec/requests/users_spec.rb +++ b/spec/requests/users_spec.rb @@ -3,10 +3,7 @@ require 'rails_helper' RSpec.describe 'Users', type: :request do - before do - stub_request(:any, 'https://api.github.com/repos/Freika/dawarich/tags') - .to_return(status: 200, body: '[{"name": "1.0.0"}]', headers: {}) - end + describe 'GET /users/sign_up' do context 'when self-hosted' do diff --git a/spec/serializers/api/place_serializer_spec.rb b/spec/serializers/api/place_serializer_spec.rb new file mode 100644 index 00000000..5aeb232f --- /dev/null +++ b/spec/serializers/api/place_serializer_spec.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Api::PlaceSerializer do + describe '#call' do + let(:place) do + create( + :place, + :with_geodata, + name: 'Central Park', + longitude: -73.9665, + latitude: 40.7812, + city: 'New York', + country: 'United States', + source: 'photon', + geodata: { 'amenity' => 'park', 'leisure' => 'park' }, + reverse_geocoded_at: Time.zone.parse('2023-01-15T12:00:00Z') + ) + end + + subject(:serializer) { described_class.new(place) } + + it 'serializes a place into a hash with all attributes' do + result = serializer.call + + expect(result).to be_a(Hash) + expect(result[:id]).to eq(place.id) + expect(result[:name]).to eq('Central Park') + expect(result[:longitude]).to eq(-73.9665) + expect(result[:latitude]).to eq(40.7812) + expect(result[:city]).to eq('New York') + expect(result[:country]).to eq('United States') + expect(result[:source]).to eq('photon') + expect(result[:geodata]).to eq({ 'amenity' => 'park', 'leisure' => 'park' }) + expect(result[:reverse_geocoded_at]).to eq(Time.zone.parse('2023-01-15T12:00:00Z')) + end + + context 'with nil values' do + let(:place_with_nils) do + create( + :place, + name: 'Unknown Place', + city: nil, + country: nil, + source: nil, + geodata: {}, + reverse_geocoded_at: nil + ) + end + + subject(:serializer_with_nils) { described_class.new(place_with_nils) } + + it 'handles nil values correctly' do + result = serializer_with_nils.call + + expect(result[:id]).to eq(place_with_nils.id) + expect(result[:name]).to eq('Unknown Place') + expect(result[:city]).to be_nil + expect(result[:country]).to be_nil + expect(result[:source]).to be_nil + expect(result[:geodata]).to eq({}) + expect(result[:reverse_geocoded_at]).to be_nil + end + end + end +end diff --git a/spec/services/visits/place_finder_spec.rb b/spec/services/visits/place_finder_spec.rb index 3da17828..817b4f8f 100644 --- a/spec/services/visits/place_finder_spec.rb +++ b/spec/services/visits/place_finder_spec.rb @@ -20,7 +20,7 @@ RSpec.describe Visits::PlaceFinder do end context 'when an existing place is found' do - let!(:existing_place) { create(:place, latitude: latitude, longitude: longitude) } + let!(:existing_place) { create(:place, user: user, latitude: latitude, longitude: longitude) } it 'returns the existing place as main_place' do result = subject.find_or_create_place(visit_data) @@ -38,6 +38,7 @@ RSpec.describe Visits::PlaceFinder do it 'finds an existing place by name within search radius' do similar_named_place = create(:place, + user: user, name: 'Test Place', latitude: latitude + 0.0001, longitude: longitude + 0.0001) @@ -183,9 +184,9 @@ RSpec.describe Visits::PlaceFinder do end context 'with multiple potential places' do - let!(:place1) { create(:place, name: 'Place 1', latitude: latitude, longitude: longitude) } - let!(:place2) { create(:place, name: 'Place 2', latitude: latitude + 0.0005, longitude: longitude + 0.0005) } - let!(:place3) { create(:place, name: 'Place 3', latitude: latitude + 0.001, longitude: longitude + 0.001) } + let!(:place1) { create(:place, user: user, name: 'Place 1', latitude: latitude, longitude: longitude) } + let!(:place2) { create(:place, user: user, name: 'Place 2', latitude: latitude + 0.0005, longitude: longitude + 0.0005) } + let!(:place3) { create(:place, user: user, name: 'Place 3', latitude: latitude + 0.001, longitude: longitude + 0.001) } it 'selects the closest place as main_place' do result = subject.find_or_create_place(visit_data) @@ -201,7 +202,7 @@ RSpec.describe Visits::PlaceFinder do end it 'may include places with the same name' do - dup_place = create(:place, name: 'Place 1', latitude: latitude + 0.0002, longitude: longitude + 0.0002) + dup_place = create(:place, user: user, name: 'Place 1', latitude: latitude + 0.0002, longitude: longitude + 0.0002) allow(subject).to receive(:place_name_exists?).and_return(false) diff --git a/spec/support/geocoder_stubs.rb b/spec/support/geocoder_stubs.rb index 617b263d..8f956de0 100644 --- a/spec/support/geocoder_stubs.rb +++ b/spec/support/geocoder_stubs.rb @@ -14,7 +14,9 @@ RSpec.configure do |config| 'state' => 'New York', 'name' => 'Test Location' } - } + }, + latitude: 40.7128, + longitude: -74.0060 ) ] ) diff --git a/spec/support/github_api_stubs.rb b/spec/support/github_api_stubs.rb index 017cd9f3..a89de0e1 100644 --- a/spec/support/github_api_stubs.rb +++ b/spec/support/github_api_stubs.rb @@ -1,14 +1,12 @@ # frozen_string_literal: true -# Stub GitHub API requests in tests RSpec.configure do |config| config.before(:each) do - # Stub GitHub API version checking stub_request(:get, "https://api.github.com/repos/Freika/dawarich/tags") .to_return( status: 200, - body: [{ name: "v0.1.0" }].to_json, - headers: { 'Content-Type' => 'application/json' } + body: '[{"name": "1.0.0"}]', + headers: {} ) end end