magic_lamp 0.9.0 → 0.9.9
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.
- checksums.yaml +4 -4
- data/README.md +79 -75
- data/app/assets/javascripts/magic_lamp.js +2 -0
- data/app/assets/javascripts/magic_lamp/application.js +14 -0
- data/app/assets/javascripts/magic_lamp/boot.js +1 -0
- data/app/assets/javascripts/magic_lamp/genie.js +97 -0
- data/app/assets/javascripts/magic_lamp/magic_lamp.js +35 -0
- data/app/assets/stylesheets/magic_lamp/application.css +15 -0
- data/app/controllers/magic_lamp/application_controller.rb +4 -0
- data/app/controllers/magic_lamp/fixtures_controller.rb +35 -0
- data/app/helpers/magic_lamp/application_helper.rb +4 -0
- data/app/views/layouts/magic_lamp/application.html.erb +14 -0
- data/config/routes.rb +4 -0
- data/lib/magic_lamp.rb +83 -20
- data/lib/magic_lamp/engine.rb +9 -0
- data/lib/magic_lamp/fixture_creator.rb +2 -10
- data/lib/magic_lamp/render_catcher.rb +15 -0
- data/lib/magic_lamp/version.rb +1 -1
- data/lib/tasks/magic_lamp_tasks.rake +4 -0
- data/spec/controllers/magic_lamp/fixtures_controller_spec.rb +73 -0
- data/spec/dummy/app/views/orders/bar.html.erb +1 -0
- data/spec/dummy/config/application.rb +7 -1
- data/spec/dummy/config/environments/development.rb +1 -0
- data/spec/dummy/config/environments/production.rb +1 -2
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/routes.rb +2 -54
- data/spec/dummy/config/secrets.yml +2 -2
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/{20140623002513_create_orders.rb → 20140801133550_create_orders.rb} +0 -0
- data/spec/dummy/db/schema.rb +1 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +61270 -0
- data/spec/dummy/log/test.log +25531 -13475
- data/spec/dummy/spec/magical/magic_lamp.rb +12 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/05ecd34d23e110728a2f04ad35ec8834 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/09bc89d8ac4ccacfcf2f4db466e7735f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0dc7d2551b4cf3f654b16902e208703c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/18650d8ff9b0a83b32e55b58917ec791 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/18a0c4b365b6a030c56ac85e8aa6bd6e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/199574de4a8028cea9307b5e55d8f8be +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1a894d48e2e8089537ae95e3798d49a2 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/24591221375d773f23385966709a900b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2bd1588b3767c789462d94a5fd27df88 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2ccef21649a61deac2c84f622753b77b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/38b32c335f7377670791219def8ce6d7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/38d787c2adf281dccb80274318dcf538 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3929ae7429411cd81cad5d5ed72b4912 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3c20b64b10f3325ed7f3b6695648fd8d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/480053cec74750ba76acfd86f7ff1051 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5bbf09297502a156801e9c65f4bd3db7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5ced43e55c875dddf3aca75fa148ca3e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6284ee4c2b5be7652a79edb6d4705cee +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/68b6ad376fe519ddaf9b84e87c2b077c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/69080d1368510f3bcff08c323a5913a7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6c1f143bdf6ffea1fb2fa7b967f9a437 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/759e97d6d411bc4cef7055a778e1bef3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7f7dcf7837dbb7f150b7364ad7920712 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/86023efec2465a88617e5a47a38f1f55 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/87e991f1f72e200b4bded1eb8871ee31 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/88fe64427f1fff8e41ca8ad0170da88a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8d1d9aa6d95fc9c10dfc6e6d49778b2f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8ed4b4f20fb65446181984e6df7d7c9b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8f4a370f455559b7a209ecd758a3bb3d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/96210dc070e479fcee862294afe5efc1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/972b6b0bb1fc0b1123077b4b2f4394bd +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9825272284630c2926f661645205382a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9fdefd8efa47bbe9a18f1faff6252e95 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b212d365916d6c2f783d5d73ae451562 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b2a142b210c2cbfe4a58040684b3c33c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b458300066aff956f7af9a6d2ae99abc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b98b0da97c57b492a76eeb1d0faf80d7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bceac3272b3e329aba55cb672fa18719 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bfa154e8a12acdbc85028ad8130d9043 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c5ff389414942659c1c69d2f4f32978c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cf573b52d944e8aea7f1dc03f9be9b2c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d42871ab2eba219379cd7aa9f993c575 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d98de652252dc6ae11b5b6db5588705b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/db0cbe7314816ff20016f88d20dc5569 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ed02174e8f8230d1ff62c67e51f01576 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f0aa53eb377a5d7cc83657ef33b02d25 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f1ffba5065c7038b154a287981b34743 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f5d1b7d2ec1c89dc32cc982b43502dc8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f6256b2e4e609981d9eb420aae5bef46 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fd3d67db3401095777d74ebf3cb94a01 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fdc3718e0a84d340a897f87179d95c84 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2fdee9aa34e89b0182a7523c4484e5f6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/36a1fb9df9acb7490c5ac1284b2de56b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b78b6f63e1fe791ab77083cd45eb5105 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e4468469b981ba614a29626880137332 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/pids/server.pid +1 -0
- data/spec/javascripts/genie_spec.js +210 -0
- data/spec/javascripts/magic_lamp_spec.js +185 -0
- data/spec/javascripts/spec_helper.js +109 -0
- data/spec/javascripts/support/sinon-chai.js +126 -0
- data/spec/javascripts/support/underscore-1.6.js +1343 -0
- data/spec/lib/fixture_creator_spec.rb +6 -17
- data/spec/lib/magic_lamp_spec.rb +143 -56
- data/spec/lib/render_catcher_spec.rb +35 -0
- data/spec/rails_helper.rb +3 -13
- data/spec/spec_helper.rb +2 -3
- data/spec/teaspoon_env.rb +186 -0
- metadata +206 -15
- data/lib/tasks/magic_lamp_tasks.rb +0 -44
- data/spec/dummy/spec/magic_lamp.rb +0 -4
- data/spec/dummy/spec/magic_lamp/foo/foo_lamp.rb +0 -1
- data/spec/dummy/spec/magic_lamp/rake/rake_lamp.rb +0 -3
- data/spec/integration/integration_spec.rb +0 -21
- data/spec/tasks/magic_lamp_tasks_spec.rb +0 -34
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
require "rails_helper"
|
|
2
2
|
|
|
3
3
|
describe MagicLamp::FixtureCreator do
|
|
4
|
-
before do
|
|
5
|
-
FileUtils.rm_rf(Rails.root.join("tmp/magic_lamp"))
|
|
6
|
-
end
|
|
7
|
-
|
|
8
4
|
context "attr_accessor" do
|
|
9
5
|
context "render_arguments" do
|
|
10
6
|
it { should respond_to :render_arguments }
|
|
@@ -23,26 +19,19 @@ describe MagicLamp::FixtureCreator do
|
|
|
23
19
|
end
|
|
24
20
|
end
|
|
25
21
|
|
|
26
|
-
describe "#
|
|
27
|
-
let(:
|
|
28
|
-
|
|
29
|
-
before do
|
|
30
|
-
MagicLamp.create_tmp_directory
|
|
31
|
-
subject.create_fixture("fixture_name", OrdersController) do
|
|
22
|
+
describe "#generate_template" do
|
|
23
|
+
let(:rendered) do
|
|
24
|
+
subject.generate_template(OrdersController) do
|
|
32
25
|
render :foo
|
|
33
26
|
end
|
|
34
27
|
end
|
|
35
28
|
|
|
36
|
-
it "
|
|
37
|
-
expect(
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "contains the template" do
|
|
41
|
-
expect(File.read(fixture_path)).to eq("foo\n")
|
|
29
|
+
it "returns the template as a string" do
|
|
30
|
+
expect(rendered).to eq("foo\n")
|
|
42
31
|
end
|
|
43
32
|
|
|
44
33
|
it "does not render the layout by default" do
|
|
45
|
-
expect(
|
|
34
|
+
expect(rendered).to_not match(/The layout/)
|
|
46
35
|
end
|
|
47
36
|
end
|
|
48
37
|
|
data/spec/lib/magic_lamp_spec.rb
CHANGED
|
@@ -1,98 +1,185 @@
|
|
|
1
1
|
require "rails_helper"
|
|
2
2
|
|
|
3
3
|
describe MagicLamp do
|
|
4
|
+
before do
|
|
5
|
+
subject.registered_fixtures = {}
|
|
6
|
+
end
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
after do
|
|
9
|
+
subject.registered_fixtures = {}
|
|
10
|
+
end
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
context "attr_accessor" do
|
|
13
|
+
it { should respond_to :registered_fixtures }
|
|
14
|
+
it { should respond_to :registered_fixtures= }
|
|
15
|
+
end
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
context "aliases" do
|
|
18
|
+
let(:register_fixture) { subject.method(:register_fixture) }
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
it "rub is the same as register_fixture" do
|
|
21
|
+
expect(subject.method(:rub)).to eq(register_fixture)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "wish is the same as register_fixture" do
|
|
25
|
+
expect(subject.method(:wish)).to eq(register_fixture)
|
|
21
26
|
end
|
|
22
27
|
end
|
|
23
28
|
|
|
24
|
-
describe "#
|
|
25
|
-
let(:
|
|
29
|
+
describe "#register_fixture" do
|
|
30
|
+
let(:fixture_name) { "foo" }
|
|
31
|
+
let(:controller_class) { "doesn't matter here" }
|
|
32
|
+
let(:block) { Proc.new { "so?" } }
|
|
33
|
+
|
|
34
|
+
it "caches the controller class and block" do
|
|
35
|
+
subject.register_fixture(controller_class, fixture_name, &block)
|
|
36
|
+
expect(subject.registered_fixtures[fixture_name]).to eq([controller_class, block])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "raises an error without a block" do
|
|
40
|
+
expect do
|
|
41
|
+
subject.register_fixture(controller_class, fixture_name)
|
|
42
|
+
end.to raise_error(ArgumentError, /requires a block/)
|
|
43
|
+
end
|
|
26
44
|
|
|
27
|
-
|
|
28
|
-
|
|
45
|
+
context "defaults" do
|
|
46
|
+
let(:at_index) { subject.registered_fixtures["index"] }
|
|
47
|
+
|
|
48
|
+
it "uses ApplicationController as the default controller" do
|
|
49
|
+
subject.register_fixture { render :index }
|
|
50
|
+
expect(at_index.first).to eq(::ApplicationController)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "fixture name" do
|
|
54
|
+
it "raises an error if the fixture is already registered by that name" do
|
|
55
|
+
subject.register_fixture { render :index }
|
|
56
|
+
expect do
|
|
57
|
+
subject.register_fixture { render :index }
|
|
58
|
+
end.to raise_error(MagicLamp::AlreadyRegisteredFixtureError, "a fixture called 'index' has already been registered")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "ApplicationController" do
|
|
62
|
+
it "uses the first argument to render when given 2" do
|
|
63
|
+
render_block = Proc.new { render :index, foo: :bar }
|
|
64
|
+
subject.register_fixture(::ApplicationController, &render_block)
|
|
65
|
+
|
|
66
|
+
expect(at_index).to eq([::ApplicationController, render_block])
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "uses the only argument when it isn't a hash" do
|
|
70
|
+
render_block = Proc.new { render :index }
|
|
71
|
+
subject.register_fixture(::ApplicationController, &render_block)
|
|
72
|
+
expect(at_index).to eq([::ApplicationController, render_block])
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "1 hash argument" do
|
|
76
|
+
it "raises an error if it can't figure out a default name" do
|
|
77
|
+
expect do
|
|
78
|
+
subject.register_fixture(::ApplicationController) { render collection: [1, 2, 3] }
|
|
79
|
+
end.to raise_error(MagicLamp::AmbiguousFixtureNameError, /Unable to infer fixture name/)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "uses the name at the template key" do
|
|
83
|
+
render_block = Proc.new { render template: :index }
|
|
84
|
+
subject.register_fixture(::ApplicationController, &render_block)
|
|
85
|
+
expect(at_index).to eq([::ApplicationController, render_block])
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "uses the name at the partial key" do
|
|
89
|
+
render_block = Proc.new { render partial: :index }
|
|
90
|
+
subject.register_fixture(::ApplicationController, &render_block)
|
|
91
|
+
expect(at_index).to eq([::ApplicationController, render_block])
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context "other controller" do
|
|
97
|
+
it "prepends the controller's name to the fixture_name" do
|
|
98
|
+
render_block = Proc.new { render partial: :index }
|
|
99
|
+
subject.register_fixture(OrdersController, &render_block)
|
|
100
|
+
expect(subject.registered_fixtures["orders/index"]).to eq([OrdersController, render_block])
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
29
104
|
end
|
|
30
105
|
end
|
|
31
106
|
|
|
32
|
-
describe "#
|
|
33
|
-
|
|
107
|
+
describe "#load_lamp_files" do
|
|
108
|
+
it "loads all lamp files" do
|
|
109
|
+
subject.load_lamp_files
|
|
110
|
+
expect(subject.registered_fixtures["orders/foo"]).to be_an(Array)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "blows out registered_fixtures on each call" do
|
|
114
|
+
old_registry = subject.registered_fixtures
|
|
115
|
+
subject.load_lamp_files
|
|
116
|
+
expect(subject.registered_fixtures).to_not equal(old_registry)
|
|
34
117
|
|
|
35
|
-
|
|
36
|
-
subject.
|
|
118
|
+
old_registry = subject.registered_fixtures
|
|
119
|
+
subject.load_lamp_files
|
|
120
|
+
expect(subject.registered_fixtures).to_not equal(old_registry)
|
|
37
121
|
end
|
|
122
|
+
end
|
|
38
123
|
|
|
39
|
-
|
|
40
|
-
|
|
124
|
+
describe "#registered?" do
|
|
125
|
+
|
|
126
|
+
it "returns true if the fixture is registered" do
|
|
127
|
+
subject.registered_fixtures["foo"] = :something
|
|
128
|
+
expect(subject.registered?("foo")).to eq(true)
|
|
41
129
|
end
|
|
42
130
|
|
|
43
|
-
it "
|
|
44
|
-
expect
|
|
45
|
-
subject.create_tmp_directory
|
|
46
|
-
end.to_not raise_error
|
|
131
|
+
it "returns false if the fixture is not registered" do
|
|
132
|
+
expect(subject.registered?("bar")).to eq(false)
|
|
47
133
|
end
|
|
48
134
|
end
|
|
49
135
|
|
|
50
|
-
describe "#
|
|
51
|
-
let(:
|
|
136
|
+
describe "#generate_fixture" do
|
|
137
|
+
let(:block) { Proc.new { render :foo } }
|
|
52
138
|
|
|
53
139
|
before do
|
|
54
|
-
subject.
|
|
55
|
-
subject.remove_tmp_directory
|
|
140
|
+
subject.registered_fixtures["foo_test"] = [OrdersController, block]
|
|
56
141
|
end
|
|
57
142
|
|
|
58
|
-
it "
|
|
59
|
-
expect(
|
|
143
|
+
it "returns the template" do
|
|
144
|
+
expect(subject.generate_fixture("foo_test")).to eq("foo\n")
|
|
60
145
|
end
|
|
61
146
|
|
|
62
|
-
it "
|
|
147
|
+
it "raises an error when told to generate a template that is not registered" do
|
|
63
148
|
expect do
|
|
64
|
-
subject.
|
|
65
|
-
end.
|
|
149
|
+
subject.generate_fixture("brokenture")
|
|
150
|
+
end.to raise_error(MagicLamp::UnregisteredFixtureError, /is not a registered fixture/)
|
|
66
151
|
end
|
|
67
152
|
end
|
|
68
153
|
|
|
69
|
-
describe "#
|
|
154
|
+
describe "#generate_all_fixtures" do
|
|
155
|
+
let!(:result) { subject.generate_all_fixtures }
|
|
156
|
+
let(:foo_fixture) { result["orders/foo"] }
|
|
157
|
+
let(:bar_fixture) { result["orders/bar"] }
|
|
158
|
+
let(:form_fixture) { result["orders/form"] }
|
|
70
159
|
|
|
71
|
-
it "
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
expect(fixture_creator).to receive(:create_fixture) do |fixture_name, controller_class, &block|
|
|
77
|
-
expect(fixture_name).to eq("foo")
|
|
78
|
-
expect(controller_class).to eq(OrdersController)
|
|
79
|
-
expect(block).to eq(passed_block)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
subject.create_fixture("foo", OrdersController, &passed_block)
|
|
160
|
+
it "returns a hash of all registered fixtures" do
|
|
161
|
+
expect(foo_fixture).to eq("foo\n")
|
|
162
|
+
expect(bar_fixture).to eq("bar\n")
|
|
163
|
+
expect(form_fixture).to match(/<div class="actions"/)
|
|
83
164
|
end
|
|
84
165
|
end
|
|
85
166
|
|
|
86
|
-
describe "#
|
|
167
|
+
describe "#path" do
|
|
168
|
+
context "spec directory" do
|
|
169
|
+
let(:spec_path) { Rails.root.join("spec") }
|
|
87
170
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
171
|
+
it "returns a default path starting from spec" do
|
|
172
|
+
expect(subject.path).to eq(spec_path)
|
|
173
|
+
end
|
|
91
174
|
end
|
|
92
175
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
176
|
+
context "no spec directory" do
|
|
177
|
+
let(:test_path) { Rails.root.join("test") }
|
|
178
|
+
|
|
179
|
+
it "returns a default path starting from test" do
|
|
180
|
+
allow(Dir).to receive(:exist?).and_return(false)
|
|
181
|
+
expect(subject.path).to eq(test_path)
|
|
182
|
+
end
|
|
96
183
|
end
|
|
97
184
|
end
|
|
98
185
|
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe RenderCatcher do
|
|
4
|
+
|
|
5
|
+
context "attr_accessor" do
|
|
6
|
+
it { should respond_to :render_argument }
|
|
7
|
+
it { should respond_to :render_argument= }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe "#render" do
|
|
11
|
+
it "saves its first arguments as render argument" do
|
|
12
|
+
subject.render :foo, :bar, :baz
|
|
13
|
+
expect(subject.render_argument).to eq(:foo)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "#first_render_argument" do
|
|
18
|
+
let(:block) { Proc.new { render :foo, :bar, :baz } }
|
|
19
|
+
let(:result) { subject.first_render_argument(&block) }
|
|
20
|
+
|
|
21
|
+
it "returns the first argument to render given a block" do
|
|
22
|
+
expect(result).to eq(:foo)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "#method_missing" do
|
|
27
|
+
it "does nothing when an unknown method is called" do
|
|
28
|
+
expect do
|
|
29
|
+
subject.foo
|
|
30
|
+
subject.foo = "what"
|
|
31
|
+
subject.bar(1, 2, 3) { |x| "never gonna happen" }
|
|
32
|
+
end.to_not raise_error
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
data/spec/rails_helper.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# This file is copied to spec/ when you run
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
|
2
2
|
ENV["RAILS_ENV"] ||= "test"
|
|
3
3
|
require "spec_helper"
|
|
4
|
-
require File.expand_path("../dummy/config/environment
|
|
4
|
+
require File.expand_path("../dummy/config/environment", __FILE__)
|
|
5
5
|
require "rspec/rails"
|
|
6
6
|
|
|
7
7
|
# Requires supporting ruby files with custom matchers and macros, etc, in
|
|
@@ -9,7 +9,7 @@ require "rspec/rails"
|
|
|
9
9
|
# run as spec files by default. This means that files in spec/support that end
|
|
10
10
|
# in _spec.rb will both be required and run as specs, causing the specs to be
|
|
11
11
|
# run twice. It is recommended that you do not name files matching this glob to
|
|
12
|
-
# end with _spec.rb. You can configure this pattern with
|
|
12
|
+
# end with _spec.rb. You can configure this pattern with the --pattern
|
|
13
13
|
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
|
|
14
14
|
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
|
15
15
|
|
|
@@ -17,8 +17,6 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
|
|
17
17
|
# If you are not using ActiveRecord, you can remove this line.
|
|
18
18
|
ActiveRecord::Migration.maintain_test_schema!
|
|
19
19
|
|
|
20
|
-
Rails.application.load_tasks
|
|
21
|
-
|
|
22
20
|
RSpec.configure do |config|
|
|
23
21
|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
|
24
22
|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
|
@@ -42,12 +40,4 @@ RSpec.configure do |config|
|
|
|
42
40
|
# The different available types are documented in the features, such as in
|
|
43
41
|
# https://relishapp.com/rspec/rspec-rails/docs
|
|
44
42
|
config.infer_spec_type_from_file_location!
|
|
45
|
-
|
|
46
|
-
config.before(:suite) do
|
|
47
|
-
FileUtils.rm_rf(Rails.root.join("tmp/magic_lamp"))
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
config.after(:suite) do
|
|
51
|
-
FileUtils.rm_rf(Rails.root.join("tmp/magic_lamp"))
|
|
52
|
-
end
|
|
53
43
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -23,7 +23,6 @@ RSpec.configure do |config|
|
|
|
23
23
|
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
|
|
24
24
|
# get run.
|
|
25
25
|
config.filter_run :focus
|
|
26
|
-
config.filter_run_excluding :integration
|
|
27
26
|
config.run_all_when_everything_filtered = true
|
|
28
27
|
|
|
29
28
|
# Many RSpec users commonly either run the entire suite or an individual
|
|
@@ -33,13 +32,13 @@ RSpec.configure do |config|
|
|
|
33
32
|
# Use the documentation formatter for detailed output,
|
|
34
33
|
# unless a formatter has already been configured
|
|
35
34
|
# (e.g. via a command-line flag).
|
|
36
|
-
config.default_formatter = "
|
|
35
|
+
config.default_formatter = "progress"
|
|
37
36
|
end
|
|
38
37
|
|
|
39
38
|
# Print the 10 slowest examples and example groups at the
|
|
40
39
|
# end of the spec run, to help surface which specs are running
|
|
41
40
|
# particularly slow.
|
|
42
|
-
# config.profile_examples =
|
|
41
|
+
# config.profile_examples = 10
|
|
43
42
|
|
|
44
43
|
# Run specs in random order to surface order dependencies. If you find an
|
|
45
44
|
# order dependency and want to debug it, you can fix the order by providing
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Set RAILS_ROOT and load the environment if it's not already loaded.
|
|
2
|
+
unless defined?(Rails)
|
|
3
|
+
ENV["RAILS_ROOT"] = File.expand_path("../dummy/", __FILE__)
|
|
4
|
+
require File.expand_path("../dummy/config/environment", __FILE__)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Teaspoon.configure do |config|
|
|
8
|
+
# Determines where the Teaspoon routes will be mounted. Changing this to "/jasmine" would allow you to browse to
|
|
9
|
+
# `http://localhost:3000/jasmine` to run your tests.
|
|
10
|
+
#config.mount_at = "/teaspoon"
|
|
11
|
+
|
|
12
|
+
# Specifies the root where Teaspoon will look for files. If you're testing an engine using a dummy application it can
|
|
13
|
+
# be useful to set this to your engines root (e.g. `Teaspoon::Engine.root`).
|
|
14
|
+
# Note: Defaults to `Rails.root` if nil.
|
|
15
|
+
#config.root = nil
|
|
16
|
+
config.root = MagicLamp::Engine.root
|
|
17
|
+
|
|
18
|
+
# Paths that will be appended to the Rails assets paths
|
|
19
|
+
# Note: Relative to `config.root`.
|
|
20
|
+
#config.asset_paths = ["spec/javascripts", "spec/javascripts/stylesheets"]
|
|
21
|
+
config.asset_paths << MagicLamp::Engine.root.join("lib/magic_lamp")
|
|
22
|
+
|
|
23
|
+
config.driver = "selenium"
|
|
24
|
+
config.driver_options = { client_driver: :chrome }
|
|
25
|
+
|
|
26
|
+
# Fixtures are rendered through a controller, which allows using HAML, RABL/JBuilder, etc. Files in these paths will
|
|
27
|
+
# be rendered as fixtures.
|
|
28
|
+
#config.fixture_paths = ["spec/javascripts/fixtures"]
|
|
29
|
+
|
|
30
|
+
# SUITES
|
|
31
|
+
#
|
|
32
|
+
# You can modify the default suite configuration and create new suites here. Suites are isolated from one another.
|
|
33
|
+
#
|
|
34
|
+
# When defining a suite you can provide a name and a block. If the name is left blank, :default is assumed. You can
|
|
35
|
+
# omit various directives and the ones defined in the default suite will be used.
|
|
36
|
+
#
|
|
37
|
+
# To run a specific suite
|
|
38
|
+
# - in the browser: http://localhost/teaspoon/[suite_name]
|
|
39
|
+
# - with the rake task: rake teaspoon suite=[suite_name]
|
|
40
|
+
# - with the cli: teaspoon --suite=[suite_name]
|
|
41
|
+
config.suite do |suite|
|
|
42
|
+
|
|
43
|
+
# Specify the framework you would like to use. This allows you to select versions, and will do some basic setup for
|
|
44
|
+
# you -- which you can override with the directives below. This should be specified first, as it can override other
|
|
45
|
+
# directives.
|
|
46
|
+
# Note: If no version is specified, the latest is assumed.
|
|
47
|
+
#
|
|
48
|
+
# Available: jasmine[1.3.1, 2.0.0], mocha[1.10.0, 1.17.1] qunit[1.12.0, 1.14.0]
|
|
49
|
+
suite.use_framework :mocha, "1.17.1"
|
|
50
|
+
|
|
51
|
+
# Specify a file matcher as a regular expression and all matching files will be loaded when the suite is run. These
|
|
52
|
+
# files need to be within an asset path. You can add asset paths using the `config.asset_paths`.
|
|
53
|
+
#suite.matcher = "{spec/javascripts,app/assets}/**/*_spec.{js,js.coffee,coffee}"
|
|
54
|
+
|
|
55
|
+
# This suites spec helper, which can require additional support files. This file is loaded before any of your test
|
|
56
|
+
# files are loaded.
|
|
57
|
+
#suite.helper = "spec_helper"
|
|
58
|
+
|
|
59
|
+
# The core Teaspoon javascripts. It's recommended to include only the base files here, as you can require support
|
|
60
|
+
# libraries from your spec helper.
|
|
61
|
+
# Note: For CoffeeScript files use `"teaspoon/jasmine"` etc.
|
|
62
|
+
#
|
|
63
|
+
# Available: teaspoon-jasmine, teaspoon-mocha, teaspoon-qunit
|
|
64
|
+
#suite.javascripts = ["mocha/1.17.1", "teaspoon-mocha"]
|
|
65
|
+
|
|
66
|
+
# You can include your own stylesheets if you want to change how Teaspoon looks.
|
|
67
|
+
# Note: Spec related CSS can and should be loaded using fixtures.
|
|
68
|
+
#suite.stylesheets = ["teaspoon"]
|
|
69
|
+
|
|
70
|
+
# Partial to be rendered in the head tag of the runner. You can use the provided ones or define your own by creating
|
|
71
|
+
# a `_boot.html.erb` in your fixtures path, and adjust the config to `"/boot"` for instance.
|
|
72
|
+
#
|
|
73
|
+
# Available: boot, boot_require_js
|
|
74
|
+
#suite.boot_partial = "boot"
|
|
75
|
+
|
|
76
|
+
# Partial to be rendered in the body tag of the runner. You can define your own to create a custom body structure.
|
|
77
|
+
#suite.body_partial = "body"
|
|
78
|
+
|
|
79
|
+
# Assets to be ignored when generating coverage reports. Accepts an array of filenames or regular expressions. The
|
|
80
|
+
# default excludes assets from vendor, gems and support libraries.<br/><br/>
|
|
81
|
+
#suite.no_coverage = [%r{/lib/ruby/gems/}, %r{/vendor/assets/}, %r{/support/}, %r{/(.+)_helper.}]
|
|
82
|
+
|
|
83
|
+
# Hooks allow you to use `Teaspoon.hook("fixtures")` before, after, or during your spec run. This will make a
|
|
84
|
+
# synchronous Ajax request to the server that will call all of the blocks you've defined for that hook name.
|
|
85
|
+
#suite.hook :fixtures, proc{ }
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Example suite. Since we're just filtering to files already within the root test/javascripts, these files will also
|
|
90
|
+
# be run in the default suite -- but can be focused into a more specific suite.
|
|
91
|
+
#config.suite :targeted do |suite|
|
|
92
|
+
# suite.matcher = "test/javascripts/targeted/*_test.{js,js.coffee,coffee}"
|
|
93
|
+
#end
|
|
94
|
+
|
|
95
|
+
# CONSOLE RUNNER SPECIFIC
|
|
96
|
+
#
|
|
97
|
+
# These configuration directives are applicable only when running via the rake task or command line interface. These
|
|
98
|
+
# directives can be overridden using the command line interface arguments or with ENV variables when using the rake
|
|
99
|
+
# task.
|
|
100
|
+
#
|
|
101
|
+
# Command Line Interface:
|
|
102
|
+
# teaspoon --driver=phantomjs --server-port=31337 --fail-fast=true --format=junit --suite=my_suite /spec/file_spec.js
|
|
103
|
+
#
|
|
104
|
+
# Rake:
|
|
105
|
+
# teaspoon DRIVER=phantomjs SERVER_PORT=31337 FAIL_FAST=true FORMATTERS=junit suite=my_suite
|
|
106
|
+
|
|
107
|
+
# Specify which headless driver to use. Supports PhantomJS and Selenium Webdriver.
|
|
108
|
+
#
|
|
109
|
+
# Available: phantomjs, selenium
|
|
110
|
+
# PhantomJS: https://github.com/modeset/teaspoon/wiki/Using-PhantomJS
|
|
111
|
+
# Selenium Webdriver: https://github.com/modeset/teaspoon/wiki/Using-Selenium-WebDriver
|
|
112
|
+
#config.driver = "phantomjs"
|
|
113
|
+
|
|
114
|
+
# Specify additional options for the driver.
|
|
115
|
+
#
|
|
116
|
+
# PhantomJS: https://github.com/modeset/teaspoon/wiki/Using-PhantomJS
|
|
117
|
+
# Selenium Webdriver: https://github.com/modeset/teaspoon/wiki/Using-Selenium-WebDriver
|
|
118
|
+
#config.driver_options = nil
|
|
119
|
+
|
|
120
|
+
# Specify the timeout for the driver. Specs are expected to complete within this time frame or the run will be
|
|
121
|
+
# considered a failure. This is to avoid issues that can arise where tests stall.
|
|
122
|
+
#config.driver_timeout = 180
|
|
123
|
+
|
|
124
|
+
# Specify a server to use with Rack (e.g. thin, mongrel). If nil is provided Rack::Server is used.
|
|
125
|
+
#config.server = nil
|
|
126
|
+
|
|
127
|
+
# Specify a port to run on a specific port, otherwise Teaspoon will use a random available port.
|
|
128
|
+
#config.server_port = nil
|
|
129
|
+
|
|
130
|
+
# Timeout for starting the server in seconds. If your server is slow to start you may have to bump this, or you may
|
|
131
|
+
# want to lower this if you know it shouldn't take long to start.
|
|
132
|
+
#config.server_timeout = 20
|
|
133
|
+
|
|
134
|
+
# Force Teaspoon to fail immediately after a failing suite. Can be useful to make Teaspoon fail early if you have
|
|
135
|
+
# several suites, but in environments like CI this may not be desirable.
|
|
136
|
+
#config.fail_fast = true
|
|
137
|
+
|
|
138
|
+
# Specify the formatters to use when outputting the results.
|
|
139
|
+
# Note: Output files can be specified by using `"junit>/path/to/output.xml"`.
|
|
140
|
+
#
|
|
141
|
+
# Available: dot, documentation, clean, json, junit, pride, snowday, swayze_or_oprah, tap, tap_y, teamcity
|
|
142
|
+
#config.formatters = ["dot"]
|
|
143
|
+
|
|
144
|
+
# Specify if you want color output from the formatters.
|
|
145
|
+
#config.color = true
|
|
146
|
+
|
|
147
|
+
# Teaspoon pipes all console[log/debug/error] to $stdout. This is useful to catch places where you've forgotten to
|
|
148
|
+
# remove them, but in verbose applications this may not be desirable.
|
|
149
|
+
#config.suppress_log = false
|
|
150
|
+
|
|
151
|
+
# COVERAGE REPORTS / THRESHOLD ASSERTIONS
|
|
152
|
+
#
|
|
153
|
+
# Coverage reports requires Istanbul (https://github.com/gotwarlost/istanbul) to add instrumentation to your code and
|
|
154
|
+
# display coverage statistics.
|
|
155
|
+
#
|
|
156
|
+
# Coverage configurations are similar to suites. You can define several, and use different ones under different
|
|
157
|
+
# conditions.
|
|
158
|
+
#
|
|
159
|
+
# To run with a specific coverage configuration
|
|
160
|
+
# - with the rake task: rake teaspoon USE_COVERAGE=[coverage_name]
|
|
161
|
+
# - with the cli: teaspoon --coverage=[coverage_name]
|
|
162
|
+
|
|
163
|
+
# Specify that you always want a coverage configuration to be used.
|
|
164
|
+
#config.use_coverage = nil
|
|
165
|
+
|
|
166
|
+
config.coverage do |coverage|
|
|
167
|
+
|
|
168
|
+
# Which coverage reports Instanbul should generate. Correlates directly to what Istanbul supports.
|
|
169
|
+
#
|
|
170
|
+
# Available: text-summary, text, html, lcov, lcovonly, cobertura, teamcity
|
|
171
|
+
#coverage.reports = ["text-summary", "html"]
|
|
172
|
+
|
|
173
|
+
# The path that the coverage should be written to - when there's an artifact to write to disk.
|
|
174
|
+
# Note: Relative to `config.root`.
|
|
175
|
+
#coverage.output_dir = "coverage"
|
|
176
|
+
|
|
177
|
+
# Various thresholds requirements can be defined, and those thresholds will be checked at the end of a run. If any
|
|
178
|
+
# aren't met the run will fail with a message. Thresholds can be defined as a percentage (0-100), or nil.
|
|
179
|
+
#coverage.statements = nil
|
|
180
|
+
#coverage.functions = nil
|
|
181
|
+
#coverage.branches = nil
|
|
182
|
+
#coverage.lines = nil
|
|
183
|
+
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|