js-routes 1.3.3 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +9 -0
- data/Appraisals +3 -3
- data/CHANGELOG.md +36 -0
- data/Readme.md +13 -1
- data/gemfiles/rails32.gemfile +1 -1
- data/gemfiles/rails40.gemfile +1 -1
- data/gemfiles/rails40_sprockets3.gemfile +1 -1
- data/gemfiles/rails41.gemfile +1 -1
- data/gemfiles/rails41_sprockets3.gemfile +1 -1
- data/gemfiles/rails42.gemfile +1 -2
- data/gemfiles/rails42_sprockets3.gemfile +1 -2
- data/gemfiles/rails50.gemfile +1 -1
- data/gemfiles/rails50_sprockets3.gemfile +1 -1
- data/js-routes.gemspec +1 -2
- data/lib/js_routes.rb +48 -43
- data/lib/js_routes/engine.rb +3 -5
- data/lib/js_routes/version.rb +1 -1
- data/lib/routes.js +59 -37
- data/lib/routes.js.coffee +45 -29
- data/spec/js_routes/amd_compatibility_spec.rb +2 -2
- data/spec/js_routes/default_serializer_spec.rb +3 -1
- data/spec/js_routes/generated_javascript_spec.rb +0 -4
- data/spec/js_routes/options_spec.rb +110 -137
- data/spec/js_routes/rails_routes_compatibility_spec.rb +84 -84
- data/spec/js_routes/zzz_last_post_rails_init_spec.rb +2 -2
- data/spec/spec_helper.rb +3 -3
- metadata +5 -5
data/lib/routes.js
CHANGED
@@ -4,7 +4,7 @@ Based on Rails routes of APP_CLASS
|
|
4
4
|
*/
|
5
5
|
|
6
6
|
(function() {
|
7
|
-
var DeprecatedBehavior, NodeTypes, ParameterMissing, ReservedOptions, SpecialOptionsKey, Utils,
|
7
|
+
var DeprecatedBehavior, NodeTypes, ParameterMissing, ReservedOptions, SpecialOptionsKey, Utils, root,
|
8
8
|
hasProp = {}.hasOwnProperty,
|
9
9
|
slice = [].slice;
|
10
10
|
|
@@ -16,20 +16,21 @@ Based on Rails routes of APP_CLASS
|
|
16
16
|
|
17
17
|
ParameterMissing.prototype = new Error();
|
18
18
|
|
19
|
-
defaults = {
|
20
|
-
prefix: "PREFIX",
|
21
|
-
default_url_options: DEFAULT_URL_OPTIONS
|
22
|
-
};
|
23
|
-
|
24
19
|
NodeTypes = NODE_TYPES;
|
25
20
|
|
26
|
-
SpecialOptionsKey =
|
21
|
+
SpecialOptionsKey = SPECIAL_OPTIONS_KEY;
|
27
22
|
|
28
23
|
DeprecatedBehavior = DEPRECATED_BEHAVIOR;
|
29
24
|
|
30
25
|
ReservedOptions = ['anchor', 'trailing_slash', 'host', 'port', 'protocol'];
|
31
26
|
|
32
27
|
Utils = {
|
28
|
+
configuration: {
|
29
|
+
prefix: PREFIX,
|
30
|
+
default_url_options: DEFAULT_URL_OPTIONS,
|
31
|
+
special_options_key: SPECIAL_OPTIONS_KEY,
|
32
|
+
serializer: SERIALIZER
|
33
|
+
},
|
33
34
|
default_serializer: function(object, prefix) {
|
34
35
|
var element, i, j, key, len, prop, s;
|
35
36
|
if (prefix == null) {
|
@@ -74,10 +75,11 @@ Based on Rails routes of APP_CLASS
|
|
74
75
|
}
|
75
76
|
return s.join("&");
|
76
77
|
},
|
77
|
-
custom_serializer: SERIALIZER,
|
78
78
|
serialize: function(object) {
|
79
|
-
|
80
|
-
|
79
|
+
var custom_serializer;
|
80
|
+
custom_serializer = this.configuration.serializer;
|
81
|
+
if ((custom_serializer != null) && this.get_object_type(custom_serializer) === "function") {
|
82
|
+
return custom_serializer(object);
|
81
83
|
} else {
|
82
84
|
return this.default_serializer(object);
|
83
85
|
}
|
@@ -94,14 +96,14 @@ Based on Rails routes of APP_CLASS
|
|
94
96
|
last_el = args[args.length - 1];
|
95
97
|
if ((args.length > number_of_params && last_el === void 0) || ((last_el != null) && "object" === this.get_object_type(last_el) && !this.looks_like_serialized_model(last_el))) {
|
96
98
|
options = args.pop() || {};
|
97
|
-
delete options[
|
99
|
+
delete options[this.configuration.special_options_key];
|
98
100
|
return options;
|
99
101
|
} else {
|
100
102
|
return {};
|
101
103
|
}
|
102
104
|
},
|
103
105
|
looks_like_serialized_model: function(object) {
|
104
|
-
return !object[
|
106
|
+
return !object[this.configuration.special_options_key] && ("id" in object || "to_param" in object);
|
105
107
|
},
|
106
108
|
path_identifier: function(object) {
|
107
109
|
var property;
|
@@ -187,7 +189,7 @@ Based on Rails routes of APP_CLASS
|
|
187
189
|
parts_options[key] = value;
|
188
190
|
}
|
189
191
|
}
|
190
|
-
options = this.merge(
|
192
|
+
options = this.merge(this.configuration.default_url_options, default_options, options);
|
191
193
|
result = {};
|
192
194
|
url_parameters = {};
|
193
195
|
result['url_parameters'] = url_parameters;
|
@@ -323,7 +325,7 @@ Based on Rails routes of APP_CLASS
|
|
323
325
|
},
|
324
326
|
get_prefix: function() {
|
325
327
|
var prefix;
|
326
|
-
prefix =
|
328
|
+
prefix = this.configuration.prefix;
|
327
329
|
if (prefix !== "") {
|
328
330
|
prefix = (prefix.match("/$") ? prefix : prefix + "/");
|
329
331
|
}
|
@@ -428,36 +430,56 @@ Based on Rails routes of APP_CLASS
|
|
428
430
|
}
|
429
431
|
}
|
430
432
|
return result;
|
433
|
+
},
|
434
|
+
namespace: function(root, namespace, routes) {
|
435
|
+
var index, j, len, part, parts;
|
436
|
+
parts = namespace.split(".");
|
437
|
+
if (parts.length === 0) {
|
438
|
+
return routes;
|
439
|
+
}
|
440
|
+
for (index = j = 0, len = parts.length; j < len; index = ++j) {
|
441
|
+
part = parts[index];
|
442
|
+
if (index < parts.length - 1) {
|
443
|
+
root = (root[part] || (root[part] = {}));
|
444
|
+
} else {
|
445
|
+
return root[part] = routes;
|
446
|
+
}
|
447
|
+
}
|
448
|
+
},
|
449
|
+
configure: function(new_config) {
|
450
|
+
return this.configuration = this.merge(this.configuration, new_config);
|
451
|
+
},
|
452
|
+
config: function() {
|
453
|
+
return this.clone(this.configuration);
|
454
|
+
},
|
455
|
+
make: function() {
|
456
|
+
var routes;
|
457
|
+
routes = ROUTES;
|
458
|
+
routes.configure = function(config) {
|
459
|
+
return Utils.configure(config);
|
460
|
+
};
|
461
|
+
routes.config = function() {
|
462
|
+
return Utils.config();
|
463
|
+
};
|
464
|
+
Object.defineProperty(routes, 'defaults', {
|
465
|
+
get: function() {
|
466
|
+
throw new Error(NAMESPACE + ".defaults is removed. Use " + NAMESPACE + ".configure() instead.");
|
467
|
+
},
|
468
|
+
set: function(value) {}
|
469
|
+
});
|
470
|
+
routes.default_serializer = function(object, prefix) {
|
471
|
+
return Utils.default_serializer(object, prefix);
|
472
|
+
};
|
473
|
+
return Utils.namespace(root, NAMESPACE, routes);
|
431
474
|
}
|
432
475
|
};
|
433
476
|
|
434
|
-
createGlobalJsRoutesObject = function() {
|
435
|
-
var namespace;
|
436
|
-
namespace = function(mainRoot, namespaceString) {
|
437
|
-
var current, parts;
|
438
|
-
parts = (namespaceString ? namespaceString.split(".") : []);
|
439
|
-
if (!parts.length) {
|
440
|
-
return;
|
441
|
-
}
|
442
|
-
current = parts.shift();
|
443
|
-
mainRoot[current] = mainRoot[current] || {};
|
444
|
-
return namespace(mainRoot[current], parts.join("."));
|
445
|
-
};
|
446
|
-
namespace(root, "NAMESPACE");
|
447
|
-
root.NAMESPACE = ROUTES;
|
448
|
-
root.NAMESPACE.options = defaults;
|
449
|
-
root.NAMESPACE.default_serializer = function(object, prefix) {
|
450
|
-
return Utils.default_serializer(object, prefix);
|
451
|
-
};
|
452
|
-
return root.NAMESPACE;
|
453
|
-
};
|
454
|
-
|
455
477
|
if (typeof define === "function" && define.amd) {
|
456
478
|
define([], function() {
|
457
|
-
return
|
479
|
+
return Utils.make();
|
458
480
|
});
|
459
481
|
} else {
|
460
|
-
|
482
|
+
Utils.make();
|
461
483
|
}
|
462
484
|
|
463
485
|
}).call(this);
|
data/lib/routes.js.coffee
CHANGED
@@ -7,12 +7,9 @@ root = (exports ? this)
|
|
7
7
|
|
8
8
|
ParameterMissing = (@message) -> #
|
9
9
|
ParameterMissing:: = new Error()
|
10
|
-
defaults =
|
11
|
-
prefix: "PREFIX"
|
12
|
-
default_url_options: DEFAULT_URL_OPTIONS
|
13
10
|
|
14
11
|
NodeTypes = NODE_TYPES
|
15
|
-
SpecialOptionsKey =
|
12
|
+
SpecialOptionsKey = SPECIAL_OPTIONS_KEY
|
16
13
|
DeprecatedBehavior = DEPRECATED_BEHAVIOR
|
17
14
|
|
18
15
|
ReservedOptions = [
|
@@ -25,6 +22,13 @@ ReservedOptions = [
|
|
25
22
|
|
26
23
|
Utils =
|
27
24
|
|
25
|
+
configuration:
|
26
|
+
prefix: PREFIX
|
27
|
+
default_url_options: DEFAULT_URL_OPTIONS
|
28
|
+
special_options_key: SPECIAL_OPTIONS_KEY
|
29
|
+
serializer: SERIALIZER
|
30
|
+
|
31
|
+
|
28
32
|
default_serializer: (object, prefix = null) ->
|
29
33
|
return "" unless object?
|
30
34
|
if !prefix and !(@get_object_type(object) is "object")
|
@@ -50,10 +54,10 @@ Utils =
|
|
50
54
|
return "" unless s.length
|
51
55
|
s.join("&")
|
52
56
|
|
53
|
-
custom_serializer: SERIALIZER
|
54
57
|
serialize: (object) ->
|
55
|
-
|
56
|
-
|
58
|
+
custom_serializer = @configuration.serializer
|
59
|
+
if custom_serializer? and @get_object_type(custom_serializer) is "function"
|
60
|
+
custom_serializer(object)
|
57
61
|
else
|
58
62
|
@default_serializer(object)
|
59
63
|
|
@@ -67,13 +71,13 @@ Utils =
|
|
67
71
|
last_el = args[args.length - 1]
|
68
72
|
if (args.length > number_of_params and last_el == undefined) or (last_el? and "object" is @get_object_type(last_el) and !@looks_like_serialized_model(last_el))
|
69
73
|
options = args.pop() || {}
|
70
|
-
delete options[
|
74
|
+
delete options[@configuration.special_options_key]
|
71
75
|
options
|
72
76
|
else
|
73
77
|
{}
|
74
78
|
|
75
79
|
looks_like_serialized_model: (object) ->
|
76
|
-
!object[
|
80
|
+
!object[@configuration.special_options_key] and ("id" of object or "to_param" of object)
|
77
81
|
|
78
82
|
|
79
83
|
path_identifier: (object) ->
|
@@ -119,7 +123,7 @@ Utils =
|
|
119
123
|
if @indexOf(parts, key) >= 0
|
120
124
|
parts_options[key] = value
|
121
125
|
|
122
|
-
options = @merge(
|
126
|
+
options = @merge(@configuration.default_url_options, default_options, options)
|
123
127
|
result = {}
|
124
128
|
url_parameters = {}
|
125
129
|
result['url_parameters'] = url_parameters
|
@@ -248,7 +252,7 @@ Utils =
|
|
248
252
|
# This method check and return prefix from options
|
249
253
|
#
|
250
254
|
get_prefix: ->
|
251
|
-
prefix =
|
255
|
+
prefix = @configuration.prefix
|
252
256
|
prefix = (if prefix.match("/$") then prefix else "#{prefix}/") if prefix isnt ""
|
253
257
|
prefix
|
254
258
|
|
@@ -343,26 +347,38 @@ Utils =
|
|
343
347
|
(result = i for el, i in array when el is element)
|
344
348
|
result
|
345
349
|
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
350
|
+
namespace: (root, namespace, routes) ->
|
351
|
+
parts = namespace.split(".")
|
352
|
+
return routes if parts.length == 0
|
353
|
+
for part, index in parts
|
354
|
+
if index < parts.length - 1
|
355
|
+
root = (root[part] or= {})
|
356
|
+
else
|
357
|
+
return root[part] = routes
|
358
|
+
|
359
|
+
configure: (new_config) ->
|
360
|
+
@configuration = @merge(@configuration, new_config)
|
361
|
+
|
362
|
+
config: ->
|
363
|
+
@clone(@configuration)
|
364
|
+
|
365
|
+
make: ->
|
366
|
+
routes = ROUTES
|
367
|
+
routes.configure = (config) -> Utils.configure(config)
|
368
|
+
routes.config = -> Utils.config()
|
369
|
+
Object.defineProperty routes, 'defaults',
|
370
|
+
get: ->
|
371
|
+
throw new Error("#{NAMESPACE}.defaults is removed. Use #{NAMESPACE}.configure() instead.")
|
372
|
+
set: (value) ->
|
373
|
+
|
374
|
+
routes.default_serializer = (object, prefix) ->
|
375
|
+
Utils.default_serializer(object, prefix)
|
376
|
+
Utils.namespace(root, NAMESPACE, routes)
|
377
|
+
|
362
378
|
# Set up Routes appropriately for the environment.
|
363
379
|
if typeof define is "function" and define.amd
|
364
380
|
# AMD
|
365
|
-
define [], ->
|
381
|
+
define [], -> Utils.make()
|
366
382
|
else
|
367
383
|
# Browser globals
|
368
|
-
|
384
|
+
Utils.make()
|
@@ -28,7 +28,7 @@ EOF
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should working from global scope" do
|
31
|
-
expect(evaljs("Routes.inboxes_path()")).to eq(
|
31
|
+
expect(evaljs("Routes.inboxes_path()")).to eq(test_routes.inboxes_path())
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should working from define function" do
|
@@ -36,7 +36,7 @@ EOF
|
|
36
36
|
end
|
37
37
|
|
38
38
|
it "should working from require" do
|
39
|
-
expect(evaljs("require(['js-routes'], function(r){ return r.inboxes_path(); })")).to eq(
|
39
|
+
expect(evaljs("require(['js-routes'], function(r){ return r.inboxes_path(); })")).to eq(test_routes.inboxes_path())
|
40
40
|
end
|
41
41
|
|
42
42
|
end
|
@@ -10,10 +10,6 @@ describe JsRoutes do
|
|
10
10
|
describe "generated js" do
|
11
11
|
subject { JsRoutes.generate }
|
12
12
|
|
13
|
-
it "should set the default serializer when none is configured" do
|
14
|
-
is_expected.to match(%r(custom_serializer: null,\s+serialize: function\(object\) {\s+if \(\(this\.custom_serializer != null\) && this.get_object_type\(this\.custom_serializer\) === \"function\"\) {\s+return this\.custom_serializer\(object\);\s+} else {\s+return this\.default_serializer\(object\);\s+}\s+},))
|
15
|
-
end
|
16
|
-
|
17
13
|
it "should include a comment in the header" do
|
18
14
|
app_class = "App"
|
19
15
|
|
@@ -3,37 +3,48 @@ require 'spec_helper'
|
|
3
3
|
describe JsRoutes, "options" do
|
4
4
|
|
5
5
|
before(:each) do
|
6
|
-
evaljs(_presetup)
|
6
|
+
evaljs(_presetup) if _presetup
|
7
7
|
with_warnings(_warnings) do
|
8
8
|
evaljs(JsRoutes.generate(_options))
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
let(:_presetup) {
|
12
|
+
let(:_presetup) { nil }
|
13
13
|
let(:_options) { {} }
|
14
14
|
let(:_warnings) { true }
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
describe "serializer" do
|
17
|
+
context "when specified" do
|
18
|
+
# define custom serializer
|
19
|
+
# this is a nonsense serializer, which always returns foo=bar
|
20
|
+
# for all inputs
|
21
|
+
let(:_presetup){ %q(function myCustomSerializer(object, prefix) { return "foo=bar"; }) }
|
22
|
+
let(:_options) { {:serializer => "myCustomSerializer"} }
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
it "should set configurable serializer" do
|
25
|
+
# expect the nonsense serializer above to have appened foo=bar
|
26
|
+
# to the end of the path
|
27
|
+
expect(evaljs(%q(Routes.inboxes_path()))).to eql("/inboxes?foo=bar")
|
28
|
+
end
|
27
29
|
end
|
28
|
-
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
context "when specified, but not function" do
|
32
|
+
let(:_presetup){ %q(var myCustomSerializer = 1) }
|
33
|
+
let(:_options) { {:serializer => "myCustomSerializer"} }
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
it "should set configurable serializer" do
|
36
|
+
# expect to use default
|
37
|
+
expect(evaljs(%q(Routes.inboxes_path({a: 1})))).to eql("/inboxes?a=1")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when configured in js" do
|
42
|
+
let(:_options) { {:serializer =>%q(function (object, prefix) { return "foo=bar"; })} }
|
43
|
+
|
44
|
+
it "uses JS serializer" do
|
45
|
+
evaljs("Routes.configure({serializer: function (object, prefix) { return 'bar=baz'; }})")
|
46
|
+
expect(evaljs(%q(Routes.inboxes_path({a: 1})))).to eql("/inboxes?bar=baz")
|
47
|
+
end
|
37
48
|
end
|
38
49
|
end
|
39
50
|
|
@@ -84,12 +95,13 @@ describe JsRoutes, "options" do
|
|
84
95
|
let(:_options) { {:prefix => "/myprefix/" } }
|
85
96
|
|
86
97
|
it "should render routing with prefix" do
|
87
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq("/myprefix#{
|
98
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq("/myprefix#{test_routes.inbox_path(1)}")
|
88
99
|
end
|
89
100
|
|
90
101
|
it "should render routing with prefix set in JavaScript" do
|
91
|
-
evaljs("Routes.
|
92
|
-
expect(evaljs("Routes.
|
102
|
+
evaljs("Routes.configure({prefix: '/newprefix/'})")
|
103
|
+
expect(evaljs("Routes.config().prefix")).to eq("/newprefix/")
|
104
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq("/newprefix#{test_routes.inbox_path(1)}")
|
93
105
|
end
|
94
106
|
|
95
107
|
end
|
@@ -99,7 +111,7 @@ describe JsRoutes, "options" do
|
|
99
111
|
let(:_options) { {:prefix => "http://localhost:3000" } }
|
100
112
|
|
101
113
|
it "should render routing with prefix" do
|
102
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq(_options[:prefix] +
|
114
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq(_options[:prefix] + test_routes.inbox_path(1))
|
103
115
|
end
|
104
116
|
end
|
105
117
|
|
@@ -108,46 +120,46 @@ describe JsRoutes, "options" do
|
|
108
120
|
let(:_options) { {:prefix => "/myprefix" } }
|
109
121
|
|
110
122
|
it "should render routing with prefix" do
|
111
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq("/myprefix#{
|
123
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq("/myprefix#{test_routes.inbox_path(1)}")
|
112
124
|
end
|
113
125
|
|
114
126
|
it "should render routing with prefix set in JavaScript" do
|
115
|
-
evaljs("Routes.
|
116
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq("/newprefix#{
|
127
|
+
evaljs("Routes.configure({prefix: '/newprefix/'})")
|
128
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq("/newprefix#{test_routes.inbox_path(1)}")
|
117
129
|
end
|
118
130
|
|
119
131
|
end
|
120
132
|
|
121
|
-
context "when
|
122
|
-
let(:_options) { {:
|
133
|
+
context "when default format is specified" do
|
134
|
+
let(:_options) { {:default_url_options => {format: "json"}} }
|
123
135
|
let(:_warnings) { nil }
|
124
136
|
|
125
137
|
it "should render routing with default_format" do
|
126
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq(
|
138
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq(test_routes.inbox_path(1, :format => "json"))
|
127
139
|
end
|
128
140
|
|
129
141
|
it "should render routing with default_format and zero object" do
|
130
|
-
expect(evaljs("Routes.inbox_path(0)")).to eq(
|
142
|
+
expect(evaljs("Routes.inbox_path(0)")).to eq(test_routes.inbox_path(0, :format => "json"))
|
131
143
|
end
|
132
144
|
|
133
145
|
it "should override default_format when spefified implicitly" do
|
134
|
-
expect(evaljs("Routes.inbox_path(1, {format: 'xml'})")).to eq(
|
146
|
+
expect(evaljs("Routes.inbox_path(1, {format: 'xml'})")).to eq(test_routes.inbox_path(1, :format => "xml"))
|
135
147
|
end
|
136
148
|
|
137
149
|
it "should override nullify implicitly when specified implicitly" do
|
138
|
-
expect(evaljs("Routes.inbox_path(1, {format: null})")).to eq(
|
150
|
+
expect(evaljs("Routes.inbox_path(1, {format: null})")).to eq(test_routes.inbox_path(1))
|
139
151
|
end
|
140
152
|
|
141
153
|
|
142
154
|
it "shouldn't require the format" do
|
143
155
|
pending if Rails.version < "4.0"
|
144
|
-
expect(evaljs("Routes.json_only_path()")).to eq(
|
156
|
+
expect(evaljs("Routes.json_only_path()")).to eq(test_routes.json_only_path(:format => 'json'))
|
145
157
|
end
|
146
158
|
end
|
147
159
|
|
148
160
|
it "shouldn't include the format when {:format => false} is specified" do
|
149
|
-
expect(evaljs("Routes.no_format_path()")).to eq(
|
150
|
-
expect(evaljs("Routes.no_format_path({format: 'json'})")).to eq(
|
161
|
+
expect(evaljs("Routes.no_format_path()")).to eq(test_routes.no_format_path())
|
162
|
+
expect(evaljs("Routes.no_format_path({format: 'json'})")).to eq(test_routes.no_format_path(format: 'json'))
|
151
163
|
end
|
152
164
|
|
153
165
|
describe "when namespace option is specified" do
|
@@ -189,14 +201,14 @@ describe JsRoutes, "options" do
|
|
189
201
|
context "provided" do
|
190
202
|
let(:_options) { { :default_url_options => { :optional_id => "12", :format => "json" } } }
|
191
203
|
it "should use this opions to fill optional parameters" do
|
192
|
-
expect(evaljs("Routes.things_path()")).to eq(
|
204
|
+
expect(evaljs("Routes.things_path()")).to eq(test_routes.things_path(:optional_id => 12, :format => "json"))
|
193
205
|
end
|
194
206
|
end
|
195
207
|
|
196
208
|
context "not provided" do
|
197
209
|
let(:_options) { { :default_url_options => { :format => "json" } } }
|
198
210
|
it "breaks" do
|
199
|
-
expect(evaljs("Routes.foo_all_path()")).to eq(
|
211
|
+
expect(evaljs("Routes.foo_all_path()")).to eq(test_routes.foo_all_path(:format => "json"))
|
200
212
|
end
|
201
213
|
end
|
202
214
|
end
|
@@ -204,7 +216,15 @@ describe JsRoutes, "options" do
|
|
204
216
|
context "with required route parts" do
|
205
217
|
let(:_options) { {:default_url_options => {:inbox_id => "12"}} }
|
206
218
|
it "should use this opions to fill optional parameters" do
|
207
|
-
expect(evaljs("Routes.inbox_messages_path()")).to eq(
|
219
|
+
expect(evaljs("Routes.inbox_messages_path()")).to eq(test_routes.inbox_messages_path(:inbox_id => 12))
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
context "when overwritten on JS level" do
|
224
|
+
let(:_options) { { :default_url_options => { :format => "json" } } }
|
225
|
+
it "uses JS defined value" do
|
226
|
+
evaljs("Routes.configure({default_url_options: {format: 'xml'}})")
|
227
|
+
expect(evaljs("Routes.inboxes_path()")).to eq(test_routes.inboxes_path(format: 'xml'))
|
208
228
|
end
|
209
229
|
end
|
210
230
|
end
|
@@ -213,33 +233,33 @@ describe JsRoutes, "options" do
|
|
213
233
|
context "with default option" do
|
214
234
|
let(:_options) { Hash.new }
|
215
235
|
it "should working in params" do
|
216
|
-
expect(evaljs("Routes.inbox_path(1, {trailing_slash: true})")).to eq(
|
236
|
+
expect(evaljs("Routes.inbox_path(1, {trailing_slash: true})")).to eq(test_routes.inbox_path(1, :trailing_slash => true))
|
217
237
|
end
|
218
238
|
|
219
239
|
it "should working with additional params" do
|
220
|
-
expect(evaljs("Routes.inbox_path(1, {trailing_slash: true, test: 'params'})")).to eq(
|
240
|
+
expect(evaljs("Routes.inbox_path(1, {trailing_slash: true, test: 'params'})")).to eq(test_routes.inbox_path(1, :trailing_slash => true, :test => 'params'))
|
221
241
|
end
|
222
242
|
end
|
223
243
|
|
224
244
|
context "with default_url_options option" do
|
225
245
|
let(:_options) { {:default_url_options => {:trailing_slash => true}} }
|
226
246
|
it "should working" do
|
227
|
-
expect(evaljs("Routes.inbox_path(1, {test: 'params'})")).to eq(
|
247
|
+
expect(evaljs("Routes.inbox_path(1, {test: 'params'})")).to eq(test_routes.inbox_path(1, :trailing_slash => true, :test => 'params'))
|
228
248
|
end
|
229
249
|
|
230
250
|
it "should remove it by params" do
|
231
|
-
expect(evaljs("Routes.inbox_path(1, {trailing_slash: false})")).to eq(
|
251
|
+
expect(evaljs("Routes.inbox_path(1, {trailing_slash: false})")).to eq(test_routes.inbox_path(1))
|
232
252
|
end
|
233
253
|
end
|
234
254
|
|
235
255
|
context "with disabled default_url_options option" do
|
236
256
|
let(:_options) { {:default_url_options => {:trailing_slash => false}} }
|
237
257
|
it "should not use trailing_slash" do
|
238
|
-
expect(evaljs("Routes.inbox_path(1, {test: 'params'})")).to eq(
|
258
|
+
expect(evaljs("Routes.inbox_path(1, {test: 'params'})")).to eq(test_routes.inbox_path(1, :test => 'params'))
|
239
259
|
end
|
240
260
|
|
241
261
|
it "should use it by params" do
|
242
|
-
expect(evaljs("Routes.inbox_path(1, {trailing_slash: true})")).to eq(
|
262
|
+
expect(evaljs("Routes.inbox_path(1, {trailing_slash: true})")).to eq(test_routes.inbox_path(1, :trailing_slash => true))
|
243
263
|
end
|
244
264
|
end
|
245
265
|
end
|
@@ -248,7 +268,7 @@ describe JsRoutes, "options" do
|
|
248
268
|
context "with default option" do
|
249
269
|
let(:_options) { Hash.new }
|
250
270
|
it "should use snake case routes" do
|
251
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq(
|
271
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq(test_routes.inbox_path(1))
|
252
272
|
expect(evaljs("Routes.inboxPath")).to be_nil
|
253
273
|
end
|
254
274
|
end
|
@@ -258,8 +278,8 @@ describe JsRoutes, "options" do
|
|
258
278
|
it "should generate camel case routes" do
|
259
279
|
expect(evaljs("Routes.inbox_path")).to be_nil
|
260
280
|
expect(evaljs("Routes.inboxPath")).not_to be_nil
|
261
|
-
expect(evaljs("Routes.inboxPath(1)")).to eq(
|
262
|
-
expect(evaljs("Routes.inboxMessagesPath(10)")).to eq(
|
281
|
+
expect(evaljs("Routes.inboxPath(1)")).to eq(test_routes.inbox_path(1))
|
282
|
+
expect(evaljs("Routes.inboxMessagesPath(10)")).to eq(test_routes.inbox_messages_path(:inbox_id => 10))
|
263
283
|
end
|
264
284
|
end
|
265
285
|
end
|
@@ -268,74 +288,29 @@ describe JsRoutes, "options" do
|
|
268
288
|
context "with default option" do
|
269
289
|
let(:_options) { Hash.new }
|
270
290
|
it "should generate only path links" do
|
271
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq(
|
291
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq(test_routes.inbox_path(1))
|
272
292
|
expect(evaljs("Routes.inbox_url")).to be_nil
|
273
293
|
end
|
274
294
|
end
|
275
295
|
|
276
|
-
context 'with deprecated, non-boolean config value' do
|
277
|
-
around(:each) do |example|
|
278
|
-
ActiveSupport::Deprecation.silence do
|
279
|
-
example.run
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
context "with host" do
|
284
|
-
let(:_options) { { :url_links => "http://localhost" } }
|
285
|
-
it "should generate path and url links" do
|
286
|
-
expect(evaljs("Routes.inbox_path")).not_to be_nil
|
287
|
-
expect(evaljs("Routes.inbox_url")).not_to be_nil
|
288
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq(routes.inbox_path(1))
|
289
|
-
expect(evaljs("Routes.inbox_url(1)")).to eq("http://localhost#{routes.inbox_path(1)}")
|
290
|
-
expect(evaljs("Routes.inbox_url(1, { test_key: \"test_val\" })")).to eq("http://localhost#{routes.inbox_path(1, :test_key => "test_val")}")
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
context "with invalid host" do
|
295
|
-
it "should raise error" do
|
296
|
-
expect { JsRoutes.generate({ :url_links => "localhost" }) }.to raise_error RuntimeError
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
context "with host and camel_case" do
|
301
|
-
let(:_options) { { :camel_case => true, :url_links => "http://localhost" } }
|
302
|
-
it "should generate path and url links" do
|
303
|
-
expect(evaljs("Routes.inboxPath")).not_to be_nil
|
304
|
-
expect(evaljs("Routes.inboxUrl")).not_to be_nil
|
305
|
-
expect(evaljs("Routes.inboxPath(1)")).to eq(routes.inbox_path(1))
|
306
|
-
expect(evaljs("Routes.inboxUrl(1)")).to eq("http://localhost#{routes.inbox_path(1)}")
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
context "with host and prefix" do
|
311
|
-
let(:_options) { { :prefix => "/api", :url_links => "https://example.com" } }
|
312
|
-
it "should generate path and url links" do
|
313
|
-
expect(evaljs("Routes.inbox_path")).not_to be_nil
|
314
|
-
expect(evaljs("Routes.inbox_url")).not_to be_nil
|
315
|
-
expect(evaljs("Routes.inbox_path(1)")).to eq("/api#{routes.inbox_path(1)}")
|
316
|
-
expect(evaljs("Routes.inbox_url(1)")).to eq("https://example.com/api#{routes.inbox_path(1)}")
|
317
|
-
end
|
318
|
-
end
|
319
|
-
end
|
320
|
-
|
321
296
|
context "when configuring with default_url_options" do
|
322
297
|
context "when only host option is specified" do
|
323
298
|
let(:_options) { { :url_links => true, :default_url_options => {:host => "example.com"} } }
|
324
299
|
|
325
300
|
it "uses the specified host, defaults protocol to http, defaults port to 80 (leaving it blank)" do
|
326
|
-
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com#{
|
301
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com#{test_routes.inbox_path(1)}")
|
327
302
|
end
|
328
303
|
|
329
304
|
it "does not override protocol when specified in route" do
|
330
|
-
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{
|
305
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{test_routes.new_session_path}")
|
331
306
|
end
|
332
307
|
|
333
308
|
it "does not override host when specified in route" do
|
334
|
-
expect(evaljs("Routes.sso_url()")).to eq(
|
309
|
+
expect(evaljs("Routes.sso_url()")).to eq(test_routes.sso_url)
|
335
310
|
end
|
336
311
|
|
337
312
|
it "does not override port when specified in route" do
|
338
|
-
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{
|
313
|
+
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{test_routes.portals_path}")
|
339
314
|
end
|
340
315
|
end
|
341
316
|
|
@@ -343,19 +318,19 @@ describe JsRoutes, "options" do
|
|
343
318
|
let(:_options) { { :url_links => true, :default_url_options => {:host => "example.com", :protocol => "ftp"} } }
|
344
319
|
|
345
320
|
it "uses the specified protocol and host, defaults port to 80 (leaving it blank)" do
|
346
|
-
expect(evaljs("Routes.inbox_url(1)")).to eq("ftp://example.com#{
|
321
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("ftp://example.com#{test_routes.inbox_path(1)}")
|
347
322
|
end
|
348
323
|
|
349
324
|
it "does not override protocol when specified in route" do
|
350
|
-
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{
|
325
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{test_routes.new_session_path}")
|
351
326
|
end
|
352
327
|
|
353
328
|
it "does not override host when host is specified in route" do
|
354
|
-
expect(evaljs("Routes.sso_url()")).to eq("ftp://sso.example.com#{
|
329
|
+
expect(evaljs("Routes.sso_url()")).to eq("ftp://sso.example.com#{test_routes.sso_path}")
|
355
330
|
end
|
356
331
|
|
357
332
|
it "does not override port when specified in route" do
|
358
|
-
expect(evaljs("Routes.portals_url()")).to eq("ftp://example.com:8080#{
|
333
|
+
expect(evaljs("Routes.portals_url()")).to eq("ftp://example.com:8080#{test_routes.portals_path}")
|
359
334
|
end
|
360
335
|
end
|
361
336
|
|
@@ -363,49 +338,49 @@ describe JsRoutes, "options" do
|
|
363
338
|
let(:_options) { { :url_links => true, :default_url_options => {:host => "example.com", :port => 3000} } }
|
364
339
|
|
365
340
|
it "uses the specified host and port, defaults protocol to http" do
|
366
|
-
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com:3000#{
|
341
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com:3000#{test_routes.inbox_path(1)}")
|
367
342
|
end
|
368
343
|
|
369
344
|
it "does not override protocol when specified in route" do
|
370
|
-
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com:3000#{
|
345
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com:3000#{test_routes.new_session_path}")
|
371
346
|
end
|
372
347
|
|
373
348
|
it "does not override host, protocol, or port when host is specified in route" do
|
374
|
-
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com:3000" +
|
349
|
+
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com:3000" + test_routes.sso_path)
|
375
350
|
end
|
376
351
|
|
377
352
|
it "does not override port when specified in route" do
|
378
|
-
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{
|
353
|
+
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{test_routes.portals_path}")
|
379
354
|
end
|
380
355
|
end
|
381
356
|
|
382
357
|
context "with camel_case option" do
|
383
358
|
let(:_options) { { :camel_case => true, :url_links => true, :default_url_options => {:host => "example.com"} } }
|
384
359
|
it "should generate path and url links" do
|
385
|
-
expect(evaljs("Routes.inboxUrl(1)")).to eq("http://example.com#{
|
386
|
-
expect(evaljs("Routes.newSessionUrl()")).to eq("https://example.com#{
|
387
|
-
expect(evaljs("Routes.ssoUrl()")).to eq(
|
388
|
-
expect(evaljs("Routes.portalsUrl()")).to eq("http://example.com:8080#{
|
360
|
+
expect(evaljs("Routes.inboxUrl(1)")).to eq("http://example.com#{test_routes.inbox_path(1)}")
|
361
|
+
expect(evaljs("Routes.newSessionUrl()")).to eq("https://example.com#{test_routes.new_session_path}")
|
362
|
+
expect(evaljs("Routes.ssoUrl()")).to eq(test_routes.sso_url)
|
363
|
+
expect(evaljs("Routes.portalsUrl()")).to eq("http://example.com:8080#{test_routes.portals_path}")
|
389
364
|
end
|
390
365
|
end
|
391
366
|
|
392
367
|
context "with prefix option" do
|
393
368
|
let(:_options) { { :prefix => "/api", :url_links => true, :default_url_options => {:host => 'example.com'} } }
|
394
369
|
it "should generate path and url links" do
|
395
|
-
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com/api#{
|
396
|
-
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com/api#{
|
397
|
-
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com/api#{
|
398
|
-
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080/api#{
|
370
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com/api#{test_routes.inbox_path(1)}")
|
371
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com/api#{test_routes.new_session_path}")
|
372
|
+
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com/api#{test_routes.sso_path}")
|
373
|
+
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080/api#{test_routes.portals_path}")
|
399
374
|
end
|
400
375
|
end
|
401
376
|
|
402
377
|
context "with compact option" do
|
403
378
|
let(:_options) { { :compact => true, :url_links => true, :default_url_options => {:host => 'example.com'} } }
|
404
379
|
it "does not affect url helpers" do
|
405
|
-
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com#{
|
406
|
-
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{
|
407
|
-
expect(evaljs("Routes.sso_url()")).to eq(
|
408
|
-
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{
|
380
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com#{test_routes.inbox_path(1)}")
|
381
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{test_routes.new_session_path}")
|
382
|
+
expect(evaljs("Routes.sso_url()")).to eq(test_routes.sso_url)
|
383
|
+
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{test_routes.portals_path}")
|
409
384
|
end
|
410
385
|
end
|
411
386
|
end
|
@@ -430,23 +405,23 @@ describe JsRoutes, "options" do
|
|
430
405
|
it "uses the current host" do
|
431
406
|
expect(evaljs("Routes.inbox_path")).not_to be_nil
|
432
407
|
expect(evaljs("Routes.inbox_url")).not_to be_nil
|
433
|
-
expect(evaljs("Routes.inbox_url(1)")).to eq("http://current.example.com#{
|
434
|
-
expect(evaljs("Routes.inbox_url(1, { test_key: \"test_val\" })")).to eq("http://current.example.com#{
|
435
|
-
expect(evaljs("Routes.new_session_url()")).to eq("https://current.example.com#{
|
436
|
-
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com#{
|
408
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://current.example.com#{test_routes.inbox_path(1)}")
|
409
|
+
expect(evaljs("Routes.inbox_url(1, { test_key: \"test_val\" })")).to eq("http://current.example.com#{test_routes.inbox_path(1, :test_key => "test_val")}")
|
410
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://current.example.com#{test_routes.new_session_path}")
|
411
|
+
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com#{test_routes.sso_path}")
|
437
412
|
|
438
413
|
end
|
439
414
|
|
440
415
|
it "uses host option as an argument" do
|
441
|
-
expect(evaljs("Routes.portals_url({host: 'another.com'})")).to eq(
|
416
|
+
expect(evaljs("Routes.portals_url({host: 'another.com'})")).to eq(test_routes.portals_url(host: 'another.com'))
|
442
417
|
end
|
443
418
|
|
444
419
|
it "uses port option as an argument" do
|
445
|
-
expect(evaljs("Routes.portals_url({host: 'localhost', port: 8080})")).to eq(
|
420
|
+
expect(evaljs("Routes.portals_url({host: 'localhost', port: 8080})")).to eq(test_routes.portals_url(host: 'localhost', port: 8080))
|
446
421
|
end
|
447
422
|
|
448
423
|
it "uses protocol option as an argument" do
|
449
|
-
expect(evaljs("Routes.portals_url({host: 'localhost', protocol: 'https'})")).to eq(
|
424
|
+
expect(evaljs("Routes.portals_url({host: 'localhost', protocol: 'https'})")).to eq(test_routes.portals_url(protocol: 'https', host: 'localhost'))
|
450
425
|
end
|
451
426
|
end
|
452
427
|
end
|
@@ -456,23 +431,21 @@ describe JsRoutes, "options" do
|
|
456
431
|
let(:_options) { { :compact => true } }
|
457
432
|
it "removes _path suffix from path helpers" do
|
458
433
|
expect(evaljs("Routes.inbox_path")).to be_nil
|
459
|
-
expect(evaljs("Routes.inboxes()")).to eq(
|
460
|
-
expect(evaljs("Routes.inbox(2)")).to eq(
|
434
|
+
expect(evaljs("Routes.inboxes()")).to eq(test_routes.inboxes_path())
|
435
|
+
expect(evaljs("Routes.inbox(2)")).to eq(test_routes.inbox_path(2))
|
461
436
|
end
|
462
437
|
|
463
438
|
context "with url_links option" do
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
example.run
|
468
|
-
end
|
439
|
+
around(:each) do |example|
|
440
|
+
ActiveSupport::Deprecation.silence do
|
441
|
+
example.run
|
469
442
|
end
|
443
|
+
end
|
470
444
|
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
end
|
445
|
+
let(:_options) { { :compact => true, :url_links => true, default_url_options: {host: 'localhost'} } }
|
446
|
+
it "should not strip urls" do
|
447
|
+
expect(evaljs("Routes.inbox(1)")).to eq(test_routes.inbox_path(1))
|
448
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://localhost#{test_routes.inbox_path(1)}")
|
476
449
|
end
|
477
450
|
end
|
478
451
|
end
|
@@ -483,7 +456,7 @@ describe JsRoutes, "options" do
|
|
483
456
|
expect {
|
484
457
|
expect(evaljs("Routes.inbox_message_path({inbox_id: 1, id: 2, _options: true})")).to eq("")
|
485
458
|
}.to raise_error(js_error_class)
|
486
|
-
expect(evaljs("Routes.inbox_message_path({inbox_id: 1, id: 2, __options__: true})")).to eq(
|
459
|
+
expect(evaljs("Routes.inbox_message_path({inbox_id: 1, id: 2, __options__: true})")).to eq(test_routes.inbox_message_path(inbox_id: 1, id: 2))
|
487
460
|
end
|
488
461
|
end
|
489
462
|
|