decko 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/decko.gemspec +3 -3
  3. data/features/attach.feature +11 -7
  4. data/features/follow.feature +45 -44
  5. data/features/navbox.feature +1 -1
  6. data/features/notifications.feature +1 -1
  7. data/features/pointer_inputs.feature +7 -0
  8. data/features/reference.feature +5 -1
  9. data/features/step_definitions/email_steps.rb +4 -0
  10. data/features/step_definitions/wagn_steps.rb +6 -3
  11. data/features/step_definitions/web_steps.rb +1 -0
  12. data/features/support/delayed_job.rb +1 -0
  13. data/features/support/env.rb +5 -2
  14. data/features/toolbar.feature +13 -11
  15. data/lib/decko/application.rb +1 -0
  16. data/lib/decko/commands/cucumber_command.rb +2 -2
  17. data/lib/decko/commands/cucumber_command/parser.rb +8 -0
  18. data/lib/decko/commands/rspec_command.rb +3 -3
  19. data/lib/decko/config/environments/development.rb +3 -2
  20. data/lib/decko/config/environments/production.rb +4 -0
  21. data/lib/decko/config/environments/test.rb +2 -2
  22. data/lib/decko/config/initializers/sedate_parser.rb +7 -0
  23. data/lib/decko/engine.rb +1 -1
  24. data/lib/decko/generators/decko/templates/Gemfile +16 -22
  25. data/lib/decko/mods_spec_helper.rb +0 -1
  26. data/lib/decko/response.rb +18 -12
  27. data/lib/decko/tasks/alias.rb +31 -0
  28. data/lib/decko/tasks/decko.rake +16 -43
  29. data/lib/decko/tasks/decko/bootstrap.rake +65 -62
  30. data/lib/decko/tasks/test.rake +10 -3
  31. data/rails/controllers/card_controller.rb +16 -10
  32. data/rails/engine-routes.rb +4 -1
  33. data/spec/controllers/card_controller_spec.rb +77 -58
  34. data/spec/controllers/location_spec.rb +4 -4
  35. metadata +10 -9
  36. data/lib/decko/tasks/decko/migrate.rake +0 -77
@@ -22,6 +22,15 @@ namespace :test do
22
22
  ENV["GENERATE_FIXTURES"] = "true"
23
23
  raise "must be test env" unless Rails.env == "test"
24
24
 
25
+ Rake::Task["test:repopulate_database"].invoke
26
+
27
+ puts ">>extracting to fixtures"
28
+ puts `rake test:extract_fixtures --trace`
29
+ end
30
+
31
+ desc "seeds database and populates it with test data"
32
+ task repopulate_database: :environment do
33
+ raise "must be test env" unless Rails.env == "test"
25
34
  Rake::Task["decko:reset_cache"]
26
35
 
27
36
  puts "reseed test db"
@@ -29,11 +38,9 @@ namespace :test do
29
38
 
30
39
  puts ">>populating test data"
31
40
  puts `rake test:populate_template_database --trace`
32
-
33
- puts ">>extracting to fixtures"
34
- puts `rake test:extract_fixtures --trace`
35
41
  end
36
42
 
43
+
37
44
  desc "dump current db to test fixtures"
38
45
  task extract_fixtures: :environment do
39
46
  raise "must be test env" unless Rails.env == "test"
@@ -49,17 +49,24 @@ class CardController < ActionController::Base
49
49
 
50
50
  #-------( FILTERS )
51
51
 
52
- before_filter :setup, except: [:asset]
53
- before_filter :authenticate, except: [:asset]
54
- before_filter :load_id, only: [:read]
55
- before_filter :load_card, except: [:asset]
56
- before_filter :refresh_card, only: [:create, :update, :delete]
52
+ before_action :setup, except: [:asset]
53
+ before_action :authenticate, except: [:asset]
54
+ before_action :load_id, only: [:read]
55
+ before_action :load_card, except: [:asset]
56
+ before_action :refresh_card, only: [:create, :update, :delete]
57
57
 
58
58
  def setup
59
59
  request.format = :html unless params[:format] # is this used??
60
- Card::Mod::Loader.refresh_script_and_style if Rails.env.development?
60
+ Card::Machine.refresh_script_and_style if Rails.env.development?
61
61
  Card::Cache.renew
62
62
  Card::Env.reset controller: self
63
+ # unprotect_card_params!
64
+ end
65
+
66
+ def unprotect_card_params!
67
+ # FIXME: always wear protection
68
+ return unless params[:card].is_a? ActionController::Parameters
69
+ params[:card].to_unsafe_h
63
70
  end
64
71
 
65
72
  def authenticate
@@ -71,7 +78,7 @@ class CardController < ActionController::Base
71
78
  end
72
79
 
73
80
  def load_card
74
- @card = Card.deep_fetch params
81
+ @card = Card.controller_fetch params
75
82
  raise Card::Error::NotFound unless @card
76
83
  @card.select_action_by_params params #
77
84
  Card::Env[:main_name] = params[:main] || (card && card.name) || ""
@@ -107,8 +114,7 @@ class CardController < ActionController::Base
107
114
  card.action = :read
108
115
  card.content = card.last_draft_content if use_draft?
109
116
 
110
- formatname = format_from_params
111
- format = card.format formatname
117
+ format = format_from_params card
112
118
 
113
119
  view ||= params[:view]
114
120
  result = card.act do
@@ -116,7 +122,7 @@ class CardController < ActionController::Base
116
122
  end
117
123
 
118
124
  status = format.error_status || status
119
- deliver formatname, result, status
125
+ deliver format, result, status
120
126
  end
121
127
 
122
128
  def render_errors
@@ -41,7 +41,10 @@ Decko::Engine.routes.draw do
41
41
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~
42
42
 
43
43
  # standard non-RESTful
44
- get "(card)/:action(/:id(.:format))" => "card", action: /create|read|update|delete|asset/
44
+ %w[create read update delete asset].each do |action|
45
+ get "(card)/#{action}(/:id(.:format))" => "card", action: action
46
+ end
47
+
45
48
  match "(card)/create(/:id(.:format))" => "card#create", via: [:post, :patch]
46
49
  match "(card)/update(/:id(.:format))" => "card#update", via: [:post, :put, :patch]
47
50
  match "(card)/delete(/:id(.:format))" => "card#delete", via: :delete
@@ -1,6 +1,6 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
- describe CardController do
3
+ RSpec.describe CardController, type: :controller do
4
4
  routes { Decko::Engine.routes }
5
5
 
6
6
  include Capybara::DSL
@@ -63,11 +63,11 @@ describe CardController do
63
63
  # maybe think about refactoring to use mocks etc. to reduce
64
64
  # test dependencies.
65
65
  it "creates cards" do
66
- post :create, card: {
66
+ post :create, params: { card: {
67
67
  name: "NewCardFoo",
68
68
  type: "Basic",
69
69
  content: "Bananas"
70
- }
70
+ } }
71
71
  assert_response 302
72
72
  c = Card["NewCardFoo"]
73
73
  expect(c.type_code).to eq(:basic)
@@ -75,18 +75,18 @@ describe CardController do
75
75
  end
76
76
 
77
77
  it "handles permission denials" do
78
- post :create, card: {
79
- name: "LackPerms",
80
- type: "Html"
81
- }
78
+ post :create, params: { card: { name: "LackPerms", type: "Html" } }
82
79
  assert_response 403
83
80
  expect(Card["LackPerms"]).to be_nil
84
81
  end
85
82
 
86
83
  # no controller-specific handling. move test elsewhere
87
84
  it "creates cardtype cards" do
88
- xhr :post, :create,
89
- card: { "content" => "test", type: "Cardtype", name: "Editor" }
85
+ post :create,
86
+ xhr: true,
87
+ params: { card: {
88
+ "content" => "test", type: "Cardtype", name: "Editor"
89
+ } }
90
90
  expect(assigns["card"]).not_to be_nil
91
91
  assert_response 200
92
92
  c = Card["Editor"]
@@ -98,9 +98,9 @@ describe CardController do
98
98
  @c = Card.create! name: "Problem", content: "boof"
99
99
  @c.delete!
100
100
  post :create,
101
- card: {
101
+ params: { card: {
102
102
  "name" => "Problem", "type" => "Phrase", "content" => "noof"
103
- }
103
+ } }
104
104
  assert_response 302
105
105
  c = Card["Problem"]
106
106
  expect(c.type_code).to eq(:phrase)
@@ -108,25 +108,26 @@ describe CardController do
108
108
 
109
109
  context "multi-create" do
110
110
  it "catches missing name error" do
111
- post :create, "card" => {
111
+ post :create, params: { "card" => {
112
112
  "name" => "",
113
113
  "type" => "Fruit",
114
114
  "subcards" => { "+text" => { "content" => "<p>abraid</p>" } }
115
- }, "view" => "open"
115
+ }, "view" => "open" }
116
116
  assert_response 422
117
117
  expect(assigns["card"].errors[:name].first).to eq("can't be blank")
118
118
  end
119
119
 
120
120
  it "creates card with subcards" do
121
121
  login_as "joe_admin"
122
- xhr :post, :create, success: "REDIRECT: /", card: {
122
+ $stop = true
123
+ post :create, xhr: true, params: { success: "REDIRECT: /", card: {
123
124
  name: "Gala",
124
125
  type: "Fruit",
125
126
  subcards: {
126
127
  "+kind" => { content: "apple" },
127
128
  "+color" => { type: "Phrase", content: "red" }
128
129
  }
129
- }
130
+ } }
130
131
  assert_response 200
131
132
  expect(Card["Gala"]).not_to be_nil
132
133
  expect(Card["Gala+kind"].content).to eq("apple")
@@ -135,14 +136,14 @@ describe CardController do
135
136
  end
136
137
 
137
138
  it "renders errors if create fails" do
138
- post :create, "card" => { "name" => "Joe User" }
139
+ post :create, params: { card: { name: "Joe User" } }
139
140
  assert_response 422
140
141
  end
141
142
 
142
143
  it "redirects to thanks if present" do
143
144
  login_as "joe_admin"
144
- xhr :post, :create, success: "REDIRECT: /thank_you",
145
- card: { "name" => "Wombly" }
145
+ post :create, xhr: true, params: { success: "REDIRECT: /thank_you",
146
+ card: { "name" => "Wombly" } }
146
147
  assert_response 200
147
148
  json = JSON.parse response.body
148
149
  expect(json["redirect"]).to match(/^http.*\/thank_you$/)
@@ -150,25 +151,25 @@ describe CardController do
150
151
 
151
152
  it "redirects to card if thanks is blank" do
152
153
  login_as "joe_admin"
153
- post :create, success: "REDIRECT: _self",
154
- "card" => { "name" => "Joe+boop" }
154
+ post :create, params: { success: "REDIRECT: _self",
155
+ card: { name: "Joe+boop" } }
155
156
  assert_redirected_to "/Joe+boop"
156
157
  end
157
158
 
158
159
  it "redirects to previous" do
159
160
  # Fruits (from shared_data) are anon creatable but not readable
160
161
  login_as :anonymous
161
- post :create, { success: "REDIRECT: *previous",
162
- "card" => { "type" => "Fruit", name: "papaya" } },
163
- history: ["/blam"]
162
+ post :create, params: { success: "REDIRECT: *previous",
163
+ "card" => { "type" => "Fruit", name: "papaya" } },
164
+ session: { history: ["/blam"] }
164
165
  assert_redirected_to "/blam"
165
166
  end
166
167
  end
167
168
 
168
169
  describe "#read" do
169
170
  it "works for basic request" do
170
- get :read, id: "Sample_Basic"
171
- expect(response.body.match(/\<body[^>]*\>/im)).to be_truthy
171
+ get :read, params: { id: "Sample_Basic" }
172
+ expect(response.body).to match(/\<body[^>]*\>/im)
172
173
  # have_selector broke in commit 8d3bf2380eb8197410e962304c5e640fced684b9,
173
174
  # presumably because of a gem (like capybara?)
174
175
  # response.should have_selector('body')
@@ -178,17 +179,17 @@ describe CardController do
178
179
 
179
180
  it "handles nonexistent card with create permission" do
180
181
  login_as "joe_user"
181
- get :read, id: "Sample_Fako"
182
+ get :read, params: { id: "Sample_Fako" }
182
183
  assert_response :success
183
184
  end
184
185
 
185
186
  it "handles nonexistent card without create permissions" do
186
- get :read, id: "Sample_Fako"
187
+ get :read, params: { id: "Sample_Fako" }
187
188
  assert_response 404
188
189
  end
189
190
 
190
191
  it "handles nonexistent card ids" do
191
- get :read, id: "~9999999"
192
+ get :read, params: { id: "~9999999" }
192
193
  assert_response 404
193
194
  end
194
195
 
@@ -196,9 +197,9 @@ describe CardController do
196
197
  Card::Auth.as_bot do
197
198
  Card.create! name: "Strawberry", type: "Fruit" # only admin can read
198
199
  end
199
- get :read, id: "Strawberry"
200
+ get :read, params: { id: "Strawberry" }
200
201
  assert_response 403
201
- get :read, id: "Strawberry", format: "txt"
202
+ get :read, params: { id: "Strawberry", format: "txt" }
202
203
  assert_response 403
203
204
  end
204
205
 
@@ -208,7 +209,7 @@ describe CardController do
208
209
  end
209
210
 
210
211
  it "works on index" do
211
- get :read, view: "new"
212
+ get :read, params: { view: "new" }
212
213
  expect(assigns["card"].name).to eq("")
213
214
  assert_response :success, "response should succeed"
214
215
  assert_equal Card::BasicID, assigns["card"].type_id,
@@ -216,20 +217,20 @@ describe CardController do
216
217
  end
217
218
 
218
219
  it "new with name" do
219
- post :read, card: { name: "BananaBread" }, view: "new"
220
+ post :read, params: { card: { name: "BananaBread" }, view: "new" }
220
221
  assert_response :success, "response should succeed"
221
222
  assert_equal "BananaBread", assigns["card"].name,
222
223
  "@card.name should == BananaBread"
223
224
  end
224
225
 
225
226
  it "new with existing name" do
226
- get :read, card: { name: "A" }, view: "new"
227
+ get :read, params: { card: { name: "A" }, view: "new" }
227
228
  # really?? how come this is ok?
228
229
  assert_response :success, "response should succeed"
229
230
  end
230
231
 
231
232
  it "new with type_code" do
232
- post :read, card: { type: "Date" }, view: "new"
233
+ post :read, params: { card: { type: "Date" }, view: "new" }
233
234
  assert_response :success, "response should succeed"
234
235
  assert_equal Card::DateID, assigns["card"].type_id,
235
236
  "@card type should == Date"
@@ -237,12 +238,13 @@ describe CardController do
237
238
 
238
239
  it "new should work for creatable nonviewable cardtype" do
239
240
  login_as :anonymous
240
- get :read, type: "Fruit", view: "new"
241
+ get :read, params: { type: "Fruit", view: "new" }
241
242
  assert_response :success
242
243
  end
243
244
 
244
245
  it "uses card params name over id in new cards" do
245
- get :read, id: "my_life", card: { name: "My LIFE" }, view: "new"
246
+ get :read, params: { id: "my_life",
247
+ card: { name: "My LIFE" }, view: "new" }
246
248
  expect(assigns["card"].name).to eq("My LIFE")
247
249
  end
248
250
  end
@@ -254,14 +256,25 @@ describe CardController do
254
256
  end
255
257
 
256
258
  it "creates missing machine output file" do
257
- args = { id: @all_style.machine_output_card.name,
259
+ args = { params: { id: @all_style.machine_output_card.name,
258
260
  format: "css",
259
- explicit_file: true }
261
+ explicit_file: true } }
260
262
  get :read, args
261
263
  # output_card = Card[:all, :style, :machine_output]
262
264
  expect(response).to redirect_to(@all_style.machine_output_url)
263
265
  get :read, args
264
266
  expect(response.status).to eq(200)
267
+ expect(response.content_type).to eq("text/css")
268
+ end
269
+ end
270
+
271
+ context "js" do
272
+ let(:all_js) { Card[:all, :script] }
273
+
274
+ it "has correct MIME type" do
275
+ get :read, params: { id: all_js.machine_output_card.name, format: "js" }
276
+ expect(response.status).to eq 200
277
+ expect(response.content_type).to eq "text/javascript"
265
278
  end
266
279
  end
267
280
 
@@ -275,17 +288,17 @@ describe CardController do
275
288
  end
276
289
 
277
290
  it "handles image with no read permission" do
278
- get :read, id: "mao2"
291
+ get :read, params: { id: "mao2" }
279
292
  assert_response 403, "denies html card view"
280
- get :read, id: "mao2", format: "jpg"
293
+ get :read, params: { id: "mao2", format: "jpg" }
281
294
  assert_response 403, "denies simple file view"
282
295
  end
283
296
 
284
297
  it "handles image with read permission" do
285
298
  login_as "joe_admin"
286
- get :read, id: "mao2"
299
+ get :read, params: { id: "mao2" }
287
300
  assert_response 200
288
- get :read, id: "mao2", format: "jpg"
301
+ get :read, params: { id: "mao2", format: "jpg" }
289
302
  assert_response 200
290
303
  end
291
304
  end
@@ -305,8 +318,7 @@ describe CardController do
305
318
  end
306
319
 
307
320
  it "denies access to other directories" do
308
- args = { filename: "/../../Gemfile" }
309
- get :asset, args
321
+ get :asset, params: { filename: "/../../Gemfile" }
310
322
  expect(response.status).to eq(404)
311
323
  end
312
324
  end
@@ -319,8 +331,8 @@ describe CardController do
319
331
 
320
332
  describe "#update" do
321
333
  it "works" do
322
- xhr :post, :update, id: "~#{@simple_card.id}",
323
- card: { content: "brand new content" }
334
+ post :update, xhr: true, params: { id: "~#{@simple_card.id}",
335
+ card: { content: "brand new content" } }
324
336
  assert_response :success, "edited card"
325
337
  assert_equal "brand new content", Card["Sample Basic"].content,
326
338
  "content was updated"
@@ -328,17 +340,22 @@ describe CardController do
328
340
 
329
341
  it "rename without update references should work" do
330
342
  f = Card.create! type: "Cardtype", name: "Apple"
331
- xhr :post, :update, id: "~#{f.id}", card: {
332
- name: "Newt",
333
- update_referers: "false"
334
- }
343
+ post :update, xhr: true,
344
+ params: {
345
+ id: "~#{f.id}",
346
+ card: { name: "Newt", update_referers: "false" }
347
+ }
335
348
  expect(assigns["card"].errors.empty?).not_to be_nil
336
349
  assert_response :success
337
350
  expect(Card["Newt"]).not_to be_nil
338
351
  end
339
352
 
340
353
  it "update type_code" do
341
- xhr :post, :update, id: "~#{@simple_card.id}", card: { type: "Date" }
354
+ post :update, xhr: true,
355
+ params: {
356
+ id: "~#{@simple_card.id}",
357
+ card: { type: "Date" }
358
+ }
342
359
  assert_response :success, "changed card type"
343
360
  expect(Card["Sample Basic"].type_code).to eq(:date)
344
361
  end
@@ -347,7 +364,7 @@ describe CardController do
347
364
  describe "delete" do
348
365
  it "works" do
349
366
  c = Card.create(name: "Boo", content: "booya")
350
- post :delete, id: "~#{c.id}"
367
+ post :delete, params: { id: "~#{c.id}" }
351
368
  assert_response :redirect
352
369
  expect(Card["Boo"]).to eq(nil)
353
370
  end
@@ -360,14 +377,14 @@ describe CardController do
360
377
  t2 = Card.create! name: "Testable1+bandana", content: "world"
361
378
  end
362
379
 
363
- get :read, id: t1.key
364
- get :read, id: t2.key
380
+ get :read, params: { id: t1.key }
381
+ get :read, params: { id: t2.key }
365
382
 
366
- post :delete, id: "~" + t2.id.to_s
383
+ post :delete, params: { id: "~" + t2.id.to_s }
367
384
  assert_nil Card[t2.name]
368
385
  assert_redirected_to "/#{t1.name}"
369
386
 
370
- post :delete, id: "~" + t1.id.to_s
387
+ post :delete, params: { id: "~" + t1.id.to_s }
371
388
  assert_redirected_to "/"
372
389
  assert_nil Card[t1.name]
373
390
  end
@@ -378,8 +395,10 @@ describe CardController do
378
395
  Card.create name: "basicname+*self+*comment",
379
396
  content: "[[Anyone Signed In]]"
380
397
  end
381
- post :update, id: "basicname",
382
- card: { comment: " and more\n \nsome lines\n\n" }
398
+ post :update, params: {
399
+ id: "basicname",
400
+ card: { comment: " and more\n \nsome lines\n\n" }
401
+ }
383
402
  cont = Card["basicname"].content
384
403
  expect(cont).to match(/basiccontent/)
385
404
  expect(cont).to match(/some lines/)