geo_location_spec.rb 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe Service::GeoLocation, integration: true do
  4. describe '#geocode' do
  5. subject(:lookup_result) { described_class.geocode(address) }
  6. context 'when checking simple results' do
  7. let(:expected_result) { [ latitude, longitude ] }
  8. let(:request_url) { "http://maps.googleapis.com/maps/api/geocode/json?address=#{CGI.escape(address)}&sensor=true" }
  9. let(:response_payload) do
  10. {
  11. 'results' => [
  12. {
  13. 'geometry' => {
  14. 'location' => {
  15. 'lat' => latitude,
  16. 'lng' => longitude,
  17. },
  18. },
  19. },
  20. ],
  21. }
  22. end
  23. before do
  24. stub_request(:get, request_url).to_return(status: 200, body: response_payload.to_json, headers: {})
  25. end
  26. context 'with German addresses' do
  27. let(:address) { 'Marienstrasse 13, 10117 Berlin' }
  28. let(:latitude) { 52.5219143 }
  29. let(:longitude) { 13.3832647 }
  30. it { is_expected.to eq(expected_result) }
  31. context 'without separator between street and zipcode + city' do
  32. let(:address) { 'Marienstrasse 13 10117 Berlin' }
  33. it { is_expected.to eq(expected_result) }
  34. end
  35. context 'when address field in user preferences is filled' do
  36. let(:user) { create(:user, address: address) }
  37. it 'stores correct values for latitude + longitude' do
  38. expect(user.preferences).to include({ 'lat' => latitude, 'lng' => longitude })
  39. end
  40. end
  41. context 'when street, city and zip fields in user preferences are filled' do
  42. let(:address) { 'Marienstrasse 13, 10117, Berlin' }
  43. let(:address_parts) { address.split(%r{\.?\s+}, 4) }
  44. let(:street) { "#{address_parts.first} #{address_parts[1].chop}" }
  45. let(:zip) { address_parts[2].chop }
  46. let(:city) { address_parts.last }
  47. let(:user) { create(:user, street: street, zip: zip, city: city) }
  48. it 'stores correct values for latitude + longitude' do
  49. expect(user.preferences).to include({ 'lat' => latitude, 'lng' => longitude })
  50. end
  51. end
  52. end
  53. context 'with Swiss addresses' do
  54. let(:address) { 'Martinsbruggstrasse 35, 9016 St. Gallen' }
  55. let(:latitude) { 47.4366557 }
  56. let(:longitude) { 9.4098904 }
  57. it { is_expected.to eq(expected_result) }
  58. context 'without separator between street and zipcode + city' do
  59. let(:address) { 'Martinsbruggstrasse 35 9016 St. Gallen' }
  60. it { is_expected.to eq(expected_result) }
  61. end
  62. end
  63. end
  64. end
  65. describe '#reverse_geocode' do
  66. subject(:lookup_result) { described_class.reverse_geocode(latitude, longitude) }
  67. context 'when checking simple results' do
  68. let(:expected_result) { address }
  69. let(:request_url) { "http://maps.googleapis.com/maps/api/geocode/json?latlng=#{latitude},#{longitude}&sensor=true" }
  70. let(:response_payload) do
  71. {
  72. 'results' => [
  73. {
  74. 'address_components' => [
  75. 'long_name' => address,
  76. ],
  77. },
  78. ],
  79. }
  80. end
  81. before do
  82. stub_request(:get, request_url).to_return(status: 200, body: response_payload.to_json, headers: {})
  83. end
  84. context 'with German addresses' do
  85. let(:address) { 'Marienstrasse 13, 10117 Berlin' }
  86. let(:latitude) { 52.5219143 }
  87. let(:longitude) { 13.3832647 }
  88. it { is_expected.to eq(expected_result) }
  89. end
  90. context 'with Swiss addresses' do
  91. let(:address) { 'Martinsbruggstrasse 35, 9016 St. Gallen' }
  92. let(:latitude) { 47.4366557 }
  93. let(:longitude) { 9.4098904 }
  94. it { is_expected.to eq(expected_result) }
  95. end
  96. end
  97. end
  98. end