gmaps4rails 1.4.8 → 1.5.0.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +11 -0
- data/.travis.yml +10 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +175 -0
- data/Guardfile +38 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +26 -37
- data/Rakefile +4 -0
- data/app/assets/javascripts/gmaps4rails/gmaps4rails.base.js.coffee +40 -34
- data/app/assets/javascripts/gmaps4rails/gmaps4rails.googlemaps.js.coffee +4 -2
- data/app/views/gmaps4rails/_gmaps4rails.html.erb +13 -12
- data/gmaps4rails.gemspec +38 -0
- data/lib/gmaps4rails.rb +0 -8
- data/lib/gmaps4rails/acts_as_gmappable.rb +55 -33
- data/lib/gmaps4rails/base.rb +7 -12
- data/lib/gmaps4rails/helper/gmaps4rails_helper.rb +16 -42
- data/lib/gmaps4rails/js_builder.rb +121 -0
- data/lib/gmaps4rails/json_builder.rb +127 -0
- data/lib/gmaps4rails/version.rb +3 -0
- data/lib/gmaps4rails/view_helper.rb +171 -0
- data/lib/tasks/gmaps4rails_tasks.rake +4 -0
- data/lib/tasks/jasmine.rake +8 -0
- data/public/javascripts/gmaps4rails/gmaps4rails.base.js +81 -30
- data/public/javascripts/gmaps4rails/gmaps4rails.bing.js +34 -11
- data/public/javascripts/gmaps4rails/gmaps4rails.googlemaps.js +45 -21
- data/public/javascripts/gmaps4rails/gmaps4rails.mapquest.js +33 -14
- data/public/javascripts/gmaps4rails/gmaps4rails.openlayers.js +33 -20
- data/spec/base/base_spec.rb +185 -0
- data/spec/base/geocoding_spec.rb +17 -0
- data/spec/dummy/.gitignore +2 -0
- data/spec/dummy/.rspec +1 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/assets/stylesheets/gmaps4rails.css +24 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/users_controller.rb +96 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/models/user.rb +9 -0
- data/spec/dummy/app/views/layouts/application.html.erb +16 -0
- data/spec/dummy/app/views/users/_form.html.erb +37 -0
- data/spec/dummy/app/views/users/_my_template.html.erb +2 -0
- data/spec/dummy/app/views/users/_my_template2.html.erb +1 -0
- data/spec/dummy/app/views/users/ajax_data.js.erb +2 -0
- data/spec/dummy/app/views/users/ajax_test.html.erb +22 -0
- data/spec/dummy/app/views/users/edit.html.erb +6 -0
- data/spec/dummy/app/views/users/index.html.erb +238 -0
- data/spec/dummy/app/views/users/new.html.erb +5 -0
- data/spec/dummy/app/views/users/show.html.erb +30 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +62 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +60 -0
- data/spec/dummy/db/migrate/20120408170155_create_users.rb +16 -0
- data/spec/dummy/db/schema.rb +29 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/javascripts/Player.js +22 -0
- data/spec/dummy/public/javascripts/Song.js +7 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/factories/user_factory.rb +23 -0
- data/spec/javascripts/basic_methods_spec.js +103 -0
- data/spec/javascripts/helpers/.gitkeep +0 -0
- data/spec/javascripts/helpers/SpecHelper.js +87 -0
- data/spec/javascripts/map_spec.js +49 -0
- data/spec/javascripts/markers_methods_spec.js +368 -0
- data/spec/javascripts/mocks_spec.js +27 -0
- data/spec/javascripts/support/jasmine.yml +76 -0
- data/spec/javascripts/support/jasmine_config.rb +23 -0
- data/spec/javascripts/support/jasmine_runner.rb +20 -0
- data/spec/launchers/all_but_requests.rb +0 -0
- data/spec/launchers/all_specs.rb +0 -0
- data/spec/launchers/requests.rb +0 -0
- data/spec/models/user_spec.rb +447 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/support/geocoding.rb +14 -0
- data/spec/support/matchers.rb +43 -0
- metadata +364 -31
- data/LICENSE.txt +0 -21
- data/app/assets/javascripts/gmaps4rails/all_apis.js +0 -5
- data/app/assets/javascripts/gmaps4rails/bing.js +0 -2
- data/app/assets/javascripts/gmaps4rails/googlemaps.js +0 -2
- data/app/assets/javascripts/gmaps4rails/mapquest.js +0 -2
- data/app/assets/javascripts/gmaps4rails/openlayers.js +0 -2
- data/app/views/gmaps4rails/_html.html.erb +0 -12
- data/app/views/gmaps4rails/_scripts.html.erb +0 -37
- data/lib/gmaps4rails/js_handler.rb +0 -112
- data/lib/gmaps4rails/json_handler.rb +0 -116
- data/public/images/marker.png +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
beforeEach(function() {
|
|
2
|
+
var gmap = new Gmaps4RailsGoogle();
|
|
3
|
+
});
|
|
4
|
+
|
|
5
|
+
describe("Mocks Fake", function() {
|
|
6
|
+
it("should create fake Point", function() {
|
|
7
|
+
expect(gmap.createPoint(1,2)).toEqual([1,2]);
|
|
8
|
+
});
|
|
9
|
+
it("should create fake LatLng", function() {
|
|
10
|
+
expect(gmap.createLatLng(1,2)).toEqual([1,2]);
|
|
11
|
+
});
|
|
12
|
+
it("should create fake LatLngBounds", function() {
|
|
13
|
+
expect(gmap.createLatLngBounds()).toEqual([]);
|
|
14
|
+
});
|
|
15
|
+
it("should create fake Map", function() {
|
|
16
|
+
expect(gmap.createMap()).toEqual({ "who": "I'm map"});
|
|
17
|
+
});
|
|
18
|
+
it("should create fake MarkerImage", function() {
|
|
19
|
+
expect(gmap.createMarkerImage("pic", "size", "url", "anchor", "scale")).toEqual({"who": "Point", "picture": "pic", "size": "size", "url": "url", "anchor": "anchor", "scale": "scale"});
|
|
20
|
+
});
|
|
21
|
+
it("should create fake Size", function() {
|
|
22
|
+
expect(gmap.createSize(1, 3)).toEqual([1,3]);
|
|
23
|
+
});
|
|
24
|
+
it("should create fake Clusterer", function() {
|
|
25
|
+
expect(gmap.createClusterer()).toEqual({ "who": "I'm Clusterer" });
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# src_files
|
|
2
|
+
#
|
|
3
|
+
# Return an array of filepaths relative to src_dir to include before jasmine specs.
|
|
4
|
+
# Default: []
|
|
5
|
+
#
|
|
6
|
+
# EXAMPLE:
|
|
7
|
+
#
|
|
8
|
+
# src_files:
|
|
9
|
+
# - lib/source1.js
|
|
10
|
+
# - lib/source2.js
|
|
11
|
+
# - dist/**/*.js
|
|
12
|
+
#
|
|
13
|
+
src_files:
|
|
14
|
+
- public/javascripts/**/*.js
|
|
15
|
+
|
|
16
|
+
# stylesheets
|
|
17
|
+
#
|
|
18
|
+
# Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
|
|
19
|
+
# Default: []
|
|
20
|
+
#
|
|
21
|
+
# EXAMPLE:
|
|
22
|
+
#
|
|
23
|
+
# stylesheets:
|
|
24
|
+
# - css/style.css
|
|
25
|
+
# - stylesheets/*.css
|
|
26
|
+
#
|
|
27
|
+
stylesheets:
|
|
28
|
+
- stylesheets/**/*.css
|
|
29
|
+
|
|
30
|
+
# helpers
|
|
31
|
+
#
|
|
32
|
+
# Return an array of filepaths relative to spec_dir to include before jasmine specs.
|
|
33
|
+
# Default: ["helpers/**/*.js"]
|
|
34
|
+
#
|
|
35
|
+
# EXAMPLE:
|
|
36
|
+
#
|
|
37
|
+
# helpers:
|
|
38
|
+
# - helpers/**/*.js
|
|
39
|
+
#
|
|
40
|
+
helpers:
|
|
41
|
+
- helpers/**/*.js
|
|
42
|
+
|
|
43
|
+
# spec_files
|
|
44
|
+
#
|
|
45
|
+
# Return an array of filepaths relative to spec_dir to include.
|
|
46
|
+
# Default: ["**/*[sS]pec.js"]
|
|
47
|
+
#
|
|
48
|
+
# EXAMPLE:
|
|
49
|
+
#
|
|
50
|
+
# spec_files:
|
|
51
|
+
# - **/*[sS]pec.js
|
|
52
|
+
#
|
|
53
|
+
spec_files:
|
|
54
|
+
- '**/*[sS]pec.js'
|
|
55
|
+
|
|
56
|
+
# src_dir
|
|
57
|
+
#
|
|
58
|
+
# Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
|
|
59
|
+
# Default: project root
|
|
60
|
+
#
|
|
61
|
+
# EXAMPLE:
|
|
62
|
+
#
|
|
63
|
+
# src_dir: public
|
|
64
|
+
#
|
|
65
|
+
src_dir:
|
|
66
|
+
|
|
67
|
+
# spec_dir
|
|
68
|
+
#
|
|
69
|
+
# Spec directory path. Your spec_files must be returned relative to this path.
|
|
70
|
+
# Default: spec/javascripts
|
|
71
|
+
#
|
|
72
|
+
# EXAMPLE:
|
|
73
|
+
#
|
|
74
|
+
# spec_dir: spec/javascripts
|
|
75
|
+
#
|
|
76
|
+
spec_dir: spec/javascripts
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Jasmine
|
|
2
|
+
class Config
|
|
3
|
+
|
|
4
|
+
# Add your overrides or custom config code here
|
|
5
|
+
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Note - this is necessary for rspec2, which has removed the backtrace
|
|
11
|
+
module Jasmine
|
|
12
|
+
class SpecBuilder
|
|
13
|
+
def declare_spec(parent, spec)
|
|
14
|
+
me = self
|
|
15
|
+
example_name = spec["name"]
|
|
16
|
+
@spec_ids << spec["id"]
|
|
17
|
+
backtrace = @example_locations[parent.description + " " + example_name]
|
|
18
|
+
parent.it example_name, {} do
|
|
19
|
+
me.report_spec(spec["id"])
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
$:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'jasmine'
|
|
5
|
+
require 'rspec'
|
|
6
|
+
jasmine_config_overrides = File.expand_path(File.join(File.dirname(__FILE__), 'jasmine_config.rb'))
|
|
7
|
+
require jasmine_config_overrides if File.exists?(jasmine_config_overrides)
|
|
8
|
+
|
|
9
|
+
jasmine_config = Jasmine::Config.new
|
|
10
|
+
spec_builder = Jasmine::SpecBuilder.new(jasmine_config)
|
|
11
|
+
|
|
12
|
+
should_stop = false
|
|
13
|
+
|
|
14
|
+
RSpec.configuration.after(:suite) do
|
|
15
|
+
spec_builder.stop if should_stop
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
spec_builder.start
|
|
19
|
+
should_stop = true
|
|
20
|
+
spec_builder.declare_suites
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
include Geocoding
|
|
4
|
+
|
|
5
|
+
DEFAULT_CONFIG_HASH = {
|
|
6
|
+
:lat_column => "latitude",
|
|
7
|
+
:lng_column => "longitude",
|
|
8
|
+
:check_process => true,
|
|
9
|
+
:checker => "gmaps",
|
|
10
|
+
:msg => "Address invalid",
|
|
11
|
+
:validation => true,
|
|
12
|
+
:address => "gmaps4rails_address",
|
|
13
|
+
:language => "en",
|
|
14
|
+
:protocol => "http",
|
|
15
|
+
:process_geocoding => true
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
PARIS = { :latitude => 48.856614, :longitude => 2.3522219 }
|
|
19
|
+
TOULON = { :latitude => 43.124228, :longitude => 5.928 }
|
|
20
|
+
|
|
21
|
+
#set model configuration
|
|
22
|
+
def set_gmaps4rails_options!(change_conf = {})
|
|
23
|
+
User.class_eval do
|
|
24
|
+
define_method "gmaps4rails_options" do
|
|
25
|
+
DEFAULT_CONFIG_HASH.merge(change_conf)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
set_gmaps4rails_options!
|
|
31
|
+
|
|
32
|
+
describe Gmaps4rails::ActsAsGmappable do
|
|
33
|
+
|
|
34
|
+
let(:user) { Factory(:user) }
|
|
35
|
+
let(:invalid_user) { Factory.build(:invalid_user) }
|
|
36
|
+
|
|
37
|
+
before(:each) do
|
|
38
|
+
Geocoding.stub_gecoding
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "standard configuration, valid user" do
|
|
42
|
+
|
|
43
|
+
it "should call google api with http by default" do
|
|
44
|
+
address = "toulon, france"
|
|
45
|
+
Gmaps4rails.should_receive(:geocode).with(address, "en", false, "http").and_return [TOULON]
|
|
46
|
+
User.create(:address => address)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should call google api with https if passed in settings" do
|
|
50
|
+
set_gmaps4rails_options!({ :protocol => "https" })
|
|
51
|
+
address = "toulon, france"
|
|
52
|
+
Gmaps4rails.should_receive(:geocode).with(address, "en", false, "https").and_return [TOULON]
|
|
53
|
+
User.create(:address => address)
|
|
54
|
+
set_gmaps4rails_options!({ :protocol => "http" })
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should have a geocoded position" do
|
|
58
|
+
user.should have_same_position_as TOULON
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should set boolean to true once user is created" do
|
|
62
|
+
user.gmaps.should be_true
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should render a valid json from an array of objects" do
|
|
66
|
+
user #needed trigger the object from the let statement
|
|
67
|
+
Factory(:user_paris)
|
|
68
|
+
JSON.parse(User.all.to_gmaps4rails).should == [{ "lng" => TOULON[:longitude], "lat" => TOULON[:latitude] },{"lng" => PARIS[:longitude], "lat" => PARIS[:latitude] } ]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context "to_gmaps4rails block" do
|
|
72
|
+
it "should extend json string for Arrays" do
|
|
73
|
+
user #needed trigger the object from the let statement
|
|
74
|
+
Factory(:user_paris)
|
|
75
|
+
JSON.parse(User.all.to_gmaps4rails do |u, marker|
|
|
76
|
+
'"model":"' + u.class.to_s + '"'
|
|
77
|
+
end).should == [{"model" => "User", "lng" => TOULON[:longitude], "lat" => TOULON[:latitude]},{"model" => "User", "lng" => PARIS[:longitude], "lat" => PARIS[:latitude] }]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should extend json string for Arrays and custom hash" do
|
|
81
|
+
user #needed trigger the object from the let statement
|
|
82
|
+
Factory(:user_paris)
|
|
83
|
+
JSON.parse(User.all.to_gmaps4rails do |u, marker|
|
|
84
|
+
marker.json({ :model => u.class.to_s })
|
|
85
|
+
end).should == [{"model" => "User", "lng" => TOULON[:longitude], "lat" => TOULON[:latitude]},{"model" => "User", "lng" => PARIS[:longitude], "lat" => PARIS[:latitude] }]
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "should extend json string for a single object" do
|
|
89
|
+
JSON.parse(user.to_gmaps4rails do |u, marker|
|
|
90
|
+
"\"model\":\"" + u.class.to_s + "\""
|
|
91
|
+
end).should == [{ "model" => "User", "lng" =>TOULON[:longitude], "lat" => TOULON[:latitude] }]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "json method should produce same result as raw string" do
|
|
95
|
+
from_method = JSON.parse(user.to_gmaps4rails do |u, marker|
|
|
96
|
+
marker.json({ :model => u.class.to_s })
|
|
97
|
+
end)
|
|
98
|
+
|
|
99
|
+
from_string = JSON.parse(user.to_gmaps4rails do |u, marker|
|
|
100
|
+
"\"model\":\"" + u.class.to_s + "\""
|
|
101
|
+
end)
|
|
102
|
+
|
|
103
|
+
from_string.should eq from_method
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "infowindow content should be included in json" do
|
|
107
|
+
user.to_gmaps4rails do |u, marker|
|
|
108
|
+
marker.infowindow "in infowindow"
|
|
109
|
+
end.should include "\"description\":\"in infowindow\""
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "marker_picture should be included in json" do
|
|
113
|
+
user.to_gmaps4rails do |u, marker|
|
|
114
|
+
marker.picture({
|
|
115
|
+
:picture => "http://www.blankdots.com/img/github-32x32.png",
|
|
116
|
+
:width => "32",
|
|
117
|
+
:height => "32"
|
|
118
|
+
})
|
|
119
|
+
end.should include "\"picture\":\"http://www.blankdots.com/img/github-32x32.png\""
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "title content should be included in json" do
|
|
123
|
+
user.to_gmaps4rails do |u, marker|
|
|
124
|
+
marker.title "i'm the title"
|
|
125
|
+
end.should include "\"title\":\"i'm the title\""
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "sidebar content should be included in json" do
|
|
129
|
+
user.to_gmaps4rails do |u, marker|
|
|
130
|
+
marker.sidebar "i'm the sidebar"
|
|
131
|
+
end.should include "\"sidebar\":\"i'm the sidebar\""
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
context "process_geocoding" do
|
|
136
|
+
context "Proc" do
|
|
137
|
+
it "should prevent geocoding when returns false" do
|
|
138
|
+
user.instance_eval do
|
|
139
|
+
def gmaps4rails_options
|
|
140
|
+
DEFAULT_CONFIG_HASH.merge({ :process_geocoding => lambda {|user| false } })
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
Gmaps4rails.should_not_receive(:geocode)
|
|
144
|
+
user.update_attributes(:address => "Strasbourg, france")
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
context "geocoding required" do
|
|
148
|
+
it "should trigger the geocoding" do
|
|
149
|
+
user.instance_eval do
|
|
150
|
+
def gmaps4rails_options
|
|
151
|
+
DEFAULT_CONFIG_HASH.merge({ :process_geocoding => lambda {|user| true } })
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
user.should_receive :gmaps4rails_save_data
|
|
155
|
+
user.update_attributes(:address => "Strasbourg, france")
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it "should update coordinates but not update checker" do
|
|
159
|
+
#first default behavior
|
|
160
|
+
user.update_attributes(:gmaps => false, :address => "Strasbourg, france")
|
|
161
|
+
user.gmaps.should eq true
|
|
162
|
+
#then tested behavior
|
|
163
|
+
user.instance_eval do
|
|
164
|
+
def gmaps4rails_options
|
|
165
|
+
DEFAULT_CONFIG_HASH.merge({ :process_geocoding => lambda {|user| true } })
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
user.update_attributes(:gmaps => false, :address => "Strasbourg, france")
|
|
169
|
+
user.gmaps.should eq false
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
it "should render a valid json from a single object" do
|
|
175
|
+
JSON.parse(user.to_gmaps4rails).should == [{"lng" => TOULON[:longitude], "lat" => TOULON[:latitude] }]
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "should not geocode again after address changes if checker is true" do
|
|
179
|
+
user.update_attributes({ :address => "Paris, France" })
|
|
180
|
+
user.should have_same_position_as TOULON
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "should geocode after address changes if checker is false" do
|
|
184
|
+
user.update_attributes({ :address => "Paris, France",
|
|
185
|
+
:gmaps => false})
|
|
186
|
+
user.should have_same_position_as PARIS
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
context "standard configuration, invalid address" do
|
|
191
|
+
|
|
192
|
+
it "should raise an error if validation option is turned on and address incorrect" do
|
|
193
|
+
invalid_user.should_not be_valid, "Address invalid"
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it "should not set boolean to true when address update fails" do
|
|
197
|
+
invalid_user.gmaps.should_not be_true
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context "model customization" do
|
|
202
|
+
|
|
203
|
+
it "should render a valid json even if there is no instance in the db" do
|
|
204
|
+
User.all.to_gmaps4rails.should == "[]"
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
context "acts_as_gmappable options" do
|
|
208
|
+
|
|
209
|
+
after(:all) do
|
|
210
|
+
#reset all configuration to default
|
|
211
|
+
set_gmaps4rails_options!
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
it "should use indifferently a db column for address if passed in config" do
|
|
215
|
+
set_gmaps4rails_options!({:address => "sec_address"})
|
|
216
|
+
user = Factory(:user, :sec_address => "Toulon, France")
|
|
217
|
+
user.should have_same_position_as TOULON
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it "should save the normalized address if requested" do
|
|
221
|
+
set_gmaps4rails_options!({ :normalized_address => "norm_address" })
|
|
222
|
+
user.norm_address.should == "Toulon, France"
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
it "should override user's address with normalized address if requested" do
|
|
226
|
+
set_gmaps4rails_options!({ :normalized_address => "sec_address" })
|
|
227
|
+
user = Factory(:user, :sec_address => "ToUlOn, FrAnCe")
|
|
228
|
+
user.sec_address.should == "Toulon, France"
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
it "should display the proper error message when address is invalid" do
|
|
232
|
+
set_gmaps4rails_options!({ :msg => "Custom Address invalid"})
|
|
233
|
+
invalid_user.should_not be_valid
|
|
234
|
+
invalid_user.errors[:gmaps4rails_address].should include("Custom Address invalid")
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it "should not raise an error if validation option is turned off" do
|
|
238
|
+
set_gmaps4rails_options!({ :validation => false })
|
|
239
|
+
invalid_user.should be_valid
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
it "should save longitude and latitude to the customized columns" do
|
|
243
|
+
set_gmaps4rails_options!({
|
|
244
|
+
:lat_column => "lat_test",
|
|
245
|
+
:lng_column => "long_test"
|
|
246
|
+
})
|
|
247
|
+
user.latitude.should be_nil
|
|
248
|
+
user.should have_same_position_as TOULON
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
it "should not save the boolean if check_process is false" do
|
|
252
|
+
set_gmaps4rails_options!({ :check_process => false })
|
|
253
|
+
user.gmaps.should be_nil
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
it "should geocode after each save if 'check_process' is false" do
|
|
257
|
+
set_gmaps4rails_options!({ :check_process => false })
|
|
258
|
+
user = Factory(:user, :address => "Paris, France")
|
|
259
|
+
user.should have_same_position_as PARIS
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "should save to the proper boolean checker set in checker" do
|
|
263
|
+
set_gmaps4rails_options!({ :checker => "bool_test" })
|
|
264
|
+
user.gmaps.should be_nil
|
|
265
|
+
user.bool_test.should be_true
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
it "should call a callback in the model if asked to" do
|
|
269
|
+
User.class_eval do
|
|
270
|
+
def gmaps4rails_options
|
|
271
|
+
DEFAULT_CONFIG_HASH.merge({ :callback => "save_callback" })
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def save_callback(data)
|
|
275
|
+
self.called_back = true
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
attr_accessor :called_back
|
|
279
|
+
end
|
|
280
|
+
user.called_back.should be_true
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
context "instance methods" do
|
|
286
|
+
let(:user_with_pic) { Factory(:user_with_pic) }
|
|
287
|
+
|
|
288
|
+
it "should take into account the description provided in the model" do
|
|
289
|
+
user_with_pic.instance_eval do
|
|
290
|
+
def gmaps4rails_infowindow
|
|
291
|
+
"My Beautiful Picture: #{picture}"
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
user_with_pic.to_gmaps4rails.should include "\"description\":\"My Beautiful Picture: http://www.blankdots.com/img/github-32x32.png\""
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
it "should take into account the picture provided in the model" do
|
|
298
|
+
user.instance_eval do
|
|
299
|
+
def gmaps4rails_marker_picture
|
|
300
|
+
{
|
|
301
|
+
"picture" => "http://www.blankdots.com/img/github-32x32.png",
|
|
302
|
+
"width" => "32",
|
|
303
|
+
"height" => "32"
|
|
304
|
+
}
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
result = user.to_gmaps4rails
|
|
308
|
+
result.should include "\"picture\":\"http://www.blankdots.com/img/github-32x32.png\""
|
|
309
|
+
result.should include "\"width\":\"32\""
|
|
310
|
+
result.should include "\"height\":\"32\""
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
it "should take into account the picture and shadow provided in the model" do
|
|
314
|
+
user.instance_eval do
|
|
315
|
+
def gmaps4rails_marker_picture
|
|
316
|
+
{
|
|
317
|
+
"picture" => "http://www.blankdots.com/img/github-32x32.png",
|
|
318
|
+
"width" => "32",
|
|
319
|
+
"height" => "32",
|
|
320
|
+
"marker_anchor" => [10, 20],
|
|
321
|
+
"shadow_picture" => "http://code.google.com/apis/maps/documentation/javascript/examples/images/beachflag_shadow.png" ,
|
|
322
|
+
"shadow_width" => "40",
|
|
323
|
+
"shadow_height" => "40",
|
|
324
|
+
"shadow_anchor" => [5, 10]
|
|
325
|
+
}
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
result = user.to_gmaps4rails
|
|
329
|
+
result.should include "\"shadow_width\":\"40\""
|
|
330
|
+
result.should include "\"shadow_height\":\"40\""
|
|
331
|
+
result.should include "\"shadow_picture\":\"http://code.google.com/apis/maps/documentation/javascript/examples/images/beachflag_shadow.png\""
|
|
332
|
+
result.should include "\"shadow_anchor\":[5,10]"
|
|
333
|
+
result.should include "\"marker_anchor\":[10,20]"
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
it "should take into account the title provided in the model" do
|
|
337
|
+
user.instance_eval do
|
|
338
|
+
def gmaps4rails_title
|
|
339
|
+
"Sweet Title"
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
JSON.parse(user.to_gmaps4rails).should == [{"title" => "Sweet Title", "lng" => TOULON[:longitude], "lat" => TOULON[:latitude]}]
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
it "should take into account the sidebar content provided in the model" do
|
|
346
|
+
user.instance_eval do
|
|
347
|
+
def gmaps4rails_sidebar
|
|
348
|
+
"sidebar content"
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
user.to_gmaps4rails.should include "\"sidebar\":\"sidebar content\""
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
it "should take into account all additional data provided in the model" do
|
|
355
|
+
user.instance_eval do
|
|
356
|
+
def gmaps4rails_infowindow
|
|
357
|
+
"My Beautiful Picture: #{picture}"
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
def gmaps4rails_marker_picture
|
|
361
|
+
{
|
|
362
|
+
"picture" => "http://www.blankdots.com/img/github-32x32.png",
|
|
363
|
+
"width" => "32",
|
|
364
|
+
"height" => "32"
|
|
365
|
+
}
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def gmaps4rails_title
|
|
369
|
+
"Sweet Title"
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
def gmaps4rails_sidebar
|
|
373
|
+
"sidebar content"
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
result = user.to_gmaps4rails
|
|
377
|
+
result.should include "\"description\":\"My Beautiful Picture: \""
|
|
378
|
+
result.should include "\"title\":\"Sweet Title\""
|
|
379
|
+
result.should include "\"sidebar\":\"sidebar content\""
|
|
380
|
+
result.should include "\"picture\":\"http://www.blankdots.com/img/github-32x32.png\""
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
it "block info should take precedence over model methods" do
|
|
386
|
+
user.instance_eval do
|
|
387
|
+
def gmaps4rails_infowindow
|
|
388
|
+
"defined in model"
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
user.to_gmaps4rails.should include "defined in model"
|
|
392
|
+
result = user.to_gmaps4rails do |u, marker|
|
|
393
|
+
marker.infowindow "defined in block"
|
|
394
|
+
end
|
|
395
|
+
result.should include "defined in block"
|
|
396
|
+
result.should_not include "defined in model"
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
describe "eval conditions" do
|
|
402
|
+
it "should trigger method if symbol passed" do
|
|
403
|
+
User.class_eval do
|
|
404
|
+
def gmaps4rails_options
|
|
405
|
+
DEFAULT_CONFIG_HASH.merge({ :validation => :published? })
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
def published?; true; end
|
|
409
|
+
end
|
|
410
|
+
user.should_receive :published?
|
|
411
|
+
Gmaps4rails.condition_eval(user, user.gmaps4rails_options[:validation])
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
it "should evaluate lambda if provided" do
|
|
415
|
+
user.instance_eval do
|
|
416
|
+
def gmaps4rails_options
|
|
417
|
+
DEFAULT_CONFIG_HASH.merge({ :validation => lambda { |object| object.test_me(:foo, :bar) } })
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
def test_me(a,b)
|
|
421
|
+
"#{a}, #{b}"
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
user.should_receive(:test_me).with(:foo, :bar)
|
|
425
|
+
Gmaps4rails.condition_eval(user, user.gmaps4rails_options[:validation])
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
it "should simply accept a true value" do
|
|
429
|
+
user.instance_eval do
|
|
430
|
+
def gmaps4rails_options
|
|
431
|
+
DEFAULT_CONFIG_HASH.merge({ :validation => true })
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
Gmaps4rails.condition_eval(user, user.gmaps4rails_options[:validation]).should be_true
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
it "should simply accept a false value" do
|
|
438
|
+
user.instance_eval do
|
|
439
|
+
def gmaps4rails_options
|
|
440
|
+
DEFAULT_CONFIG_HASH.merge({ :validation => false })
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
Gmaps4rails.condition_eval(user, user.gmaps4rails_options[:validation]).should be_false
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
end
|