decko 0.3.3 → 0.3.4

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/lib/decko/generators/decko/templates/Gemfile +1 -0
  3. metadata +5 -109
  4. data/.rspec +0 -4
  5. data/Guardfile +0 -32
  6. data/decko.gemspec +0 -42
  7. data/features/attach.feature +0 -85
  8. data/features/autonaming.feature +0 -19
  9. data/features/conflict.feature +0 -41
  10. data/features/follow.feature +0 -64
  11. data/features/history.feature +0 -27
  12. data/features/layouts.feature +0 -25
  13. data/features/navbox.feature +0 -34
  14. data/features/notifications.feature +0 -33
  15. data/features/paging.feature +0 -34
  16. data/features/pointer_inputs.feature +0 -81
  17. data/features/presetting_content.feature +0 -13
  18. data/features/reference.feature +0 -26
  19. data/features/reset_password.feature +0 -35
  20. data/features/rules.feature +0 -45
  21. data/features/setup.feature +0 -32
  22. data/features/signup.feature +0 -61
  23. data/features/step_definitions/decko_steps.rb +0 -532
  24. data/features/step_definitions/email_steps.rb +0 -216
  25. data/features/step_definitions/history_steps.rb +0 -5
  26. data/features/step_definitions/web_steps.rb +0 -155
  27. data/features/step_definitions/window_steps.rb +0 -27
  28. data/features/structure.feature +0 -41
  29. data/features/support/debugger.rb +0 -44
  30. data/features/support/delayed_job.rb +0 -20
  31. data/features/support/env.rb +0 -115
  32. data/features/support/file.txt +0 -1
  33. data/features/support/image.png +0 -0
  34. data/features/support/image2.jpg +0 -0
  35. data/features/support/paths.rb +0 -63
  36. data/features/support/scopes.rb +0 -34
  37. data/features/support/wagn_env.rb +0 -11
  38. data/features/table_of_contents.feature +0 -36
  39. data/features/toolbar.feature +0 -29
  40. data/features/update_includers.feature +0 -75
  41. data/lib/decko/tasks/.gitkeep +0 -0
  42. data/spec/controllers/card_controller_spec.rb +0 -407
  43. data/spec/controllers/location_spec.rb +0 -25
  44. data/spec/javascripts/helpers/.gitkeep +0 -0
  45. data/spec/javascripts/helpers/jasmine-jquery.js +0 -812
  46. data/spec/javascripts/support/jasmine.yml.erb +0 -79
  47. data/spec/javascripts/support/jasmine_config.rb +0 -21
  48. data/spec/javascripts/support/jasmine_runner.rb +0 -21
  49. data/spec/javascripts/wagn_spec.coffee +0 -42
  50. data/test/1.10.0-data-dump.sql +0 -359
  51. data/test/performance/card_create_test.rb +0 -21
  52. data/test/performance/fetch_test.rb +0 -9
  53. data/test/performance/homepage_test.rb +0 -9
  54. data/test/performance/render_test.rb +0 -10
  55. data/test/script/run_engine_deck.sh +0 -47
  56. data/test/script/run_mig.sh +0 -29
  57. data/test/test_helper.rb +0 -125
@@ -1,532 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- # rubocop:disable Lint/AmbiguousRegexpLiteral
3
- require "uri"
4
- require "cgi"
5
- support_paths_file = File.join File.dirname(__FILE__), "..", "support", "paths"
6
- require File.expand_path support_paths_file
7
-
8
- if RUBY_VERSION =~ /^2/
9
- require "byebug"
10
- else
11
- require "debugger"
12
- end
13
-
14
- Given /^site simulates setup need$/ do
15
- Card::Auth.simulate_setup_need!
16
- end
17
-
18
- Given /^site stops simulating setup need$/ do
19
- Card::Auth.simulate_setup_need! false
20
- step "I am signed out"
21
- end
22
-
23
- Given /^I am signed in as (.+)$/ do |account_name|
24
- accounted = Card[account_name]
25
- visit "/update/:signin?card[subcards][%2B*email][content]="\
26
- "#{accounted.account.email}&card[subcards][%2B*password][content]=joe_pass"
27
- # could optimize by specifying simple text success page
28
- end
29
-
30
- Given /^I am signed out$/ do
31
- visit "/"
32
- step 'I follow "Sign out"' if page.has_content? "Sign out"
33
- end
34
-
35
- # Given /^I sign in as (.+)$/ do |account_name|
36
- # # FIXME: define a faster simulate method ("I am logged in as")
37
- # accounted = Card[account_name]
38
- # @current_id = accounted.id
39
- # visit "/:signin"
40
- # fill_in "card[subcards][+*email][content]", with: accounted.account.email
41
- # fill_in "card[subcards][+*password][content]", with: 'joe_pass'
42
- # click_button "Sign in"
43
- # page.should have_content(account_name)
44
- # end
45
-
46
- Given /^the card (.*) contains "([^\"]*)"$/ do |cardname, content|
47
- Card::Auth.as_bot do
48
- card = Card.fetch cardname, new: {}
49
- card.content = content
50
- card.save!
51
- end
52
- end
53
-
54
- When /^(.*) edits? "([^\"]*)"$/ do |username, cardname|
55
- signed_in_as(username) do
56
- visit "/card/edit/#{cardname.to_name.url_key}"
57
- end
58
- end
59
-
60
- When /^(.*) edits? "([^\"]*)" entering "([^\"]*)" into wysiwyg$/ do
61
- |username, cardname, content|
62
- signed_in_as(username) do
63
- visit "/card/edit/#{cardname.to_name.url_key}"
64
- page.execute_script "$('#main .d0-card-content').val('#{content}')"
65
- click_button "Submit"
66
- wait_for_ajax
67
- end
68
- end
69
-
70
- When /^(.*) edits? "([^\"]*)" setting (.*) to "([^\"]*)"$/ do
71
- |username, cardname, _field, content|
72
- signed_in_as(username) do
73
- visit "/card/edit/#{cardname.to_name.url_key}"
74
- set_content "card[content]", content
75
- click_button "Submit"
76
- wait_for_ajax
77
- end
78
- end
79
-
80
- When /^(.*) edits? "([^\"]*)" filling in "([^\"]*)"$/ do |_username, cardname, content|
81
- visit "/card/edit/#{cardname.to_name.url_key}"
82
- fill_in "card[content]", with: content
83
- end
84
-
85
- When /^(.*) edits? "([^\"]*)" with plusses:/ do |username, cardname, plusses|
86
- signed_in_as(username) do
87
- visit "/card/edit/#{cardname.to_name.url_key}"
88
- plusses.hashes.first.each do |name, content|
89
- set_content "card[subcards][+#{name}][content]", content
90
- end
91
- click_button "Submit"
92
- wait_for_ajax
93
- end
94
- end
95
-
96
- def set_content name, content, _cardtype=nil
97
- Capybara.ignore_hidden_elements = false
98
- wait_for_ajax
99
- set_ace_editor_content(name, content) ||
100
- set_pm_editor_content(name, content) ||
101
- set_tinymce_editor_content(name, content) ||
102
- fill_in(name, with: content)
103
- Capybara.ignore_hidden_elements = true
104
- end
105
-
106
- def set_ace_editor_content name, content
107
- find_editor ".ace-editor-textarea[name='#{name}']" do |_editors|
108
- return unless page.evaluate_script("typeof ace != 'undefined'")
109
- sleep(0.5)
110
- content = escape_quotes content
111
- page.execute_script "ace.edit($('.ace_editor').get(0))"\
112
- ".getSession().setValue('#{content}')"
113
- end
114
- end
115
-
116
- def set_pm_editor_content name, content
117
- find_editor ".prosemirror-editor > [name='#{name}']" do |editors|
118
- content = escape_quotes content
119
- editor_id = editors.first.first(:xpath, ".//..")[:id]
120
- page.execute_script "$('##{editor_id} .ProseMirror').text('#{content}')"
121
- end
122
- end
123
-
124
- def set_tinymce_editor_content name, content
125
- find_editor "textarea[name='#{name}']" do |editors|
126
- editor_id = editors.first[:id]
127
- return unless page.evaluate_script("typeof tinyMCE != 'undefined' && "\
128
- "tinyMCE.get('#{editor_id}') != null")
129
- sleep(0.5)
130
- content = escape_quotes content
131
- page.execute_script "tinyMCE.get('#{editor_id}').setContent('#{content}')"
132
- end
133
- end
134
-
135
- def escape_quotes content
136
- content.gsub("'", "\\'")
137
- end
138
-
139
- def find_editor selector
140
- editors = all(selector)
141
- return unless editors.present?
142
- yield editors
143
- true
144
- end
145
-
146
- When /^(.*) creates?\s*a?\s*([^\s]*) card "(.*)" with content "(.*)"$/ do
147
- |username, cardtype, cardname, content|
148
- create_card(username, cardtype, cardname, content) do
149
- set_content "card[content]", content, cardtype
150
- end
151
- end
152
-
153
- When /^(.*) creates?\s*([^\s]*) card "([^"]*)"$/ do |username, cardtype, cardname|
154
- create_card username, cardtype, cardname
155
- end
156
-
157
- When /^(.*) creates?\s*([^\s]*) card "([^"]*)" with plusses:$/ do
158
- |username, cardtype, cardname, plusses|
159
- create_card(username, cardtype, cardname) do
160
- plusses.hashes.first.each do |name, content|
161
- set_content "card[subcards][+#{name}][content]", content, cardtype
162
- end
163
- end
164
- end
165
-
166
- When /^(.*) deletes? "([^\"]*)"$/ do |username, cardname|
167
- signed_in_as(username) do
168
- visit "/card/delete/#{cardname.to_name.url_key}"
169
- end
170
- end
171
-
172
- When /^(?:|I )enter "([^"]*)" into "([^"]*)"$/ do |value, field|
173
- selector = ".RIGHT-#{field.to_name.safe_key} input.d0-card-content"
174
- find(selector).set value
175
- end
176
-
177
- When /^(?:|I )upload the (.+) "(.+)"$/ do |attachment_name, filename|
178
- Capybara.ignore_hidden_elements = false
179
- attach_file "card_#{attachment_name}", find_file(filename)
180
- Capybara.ignore_hidden_elements = true
181
- wait_for_ajax
182
- end
183
-
184
- def find_file filename
185
- roots = "{#{Cardio.root}/mod/**,#{Cardio.gem_root}/mod/**,#{Decko.gem_root}}"
186
- paths = Dir.glob(File.join(roots, "features", "support", filename))
187
- raise ArgumentError, "couldn't find file '#{filename}'" if paths.empty?
188
- paths.first
189
- end
190
-
191
- Given /^(.*) (is|am) watching "([^\"]+)"$/ do |user, _verb, cardname|
192
- Delayed::Worker.new.work_off
193
- user = Card::Auth.current.name if user == "I"
194
- signed_in_as user do
195
- step "the card #{cardname}+#{user}+*follow contains \"[[*always]]\""
196
- end
197
- end
198
-
199
- Given /^(.*) (is|am) not watching "([^\"]+)"$/ do |user, _verb, cardname|
200
- user = Card::Auth.current.name if user == "I"
201
- signed_in_as user do
202
- step "the card #{cardname}+#{user}+*follow contains \"[[*never]]\""
203
- end
204
- end
205
-
206
- When /I wait a sec/ do
207
- sleep 1
208
- end
209
-
210
- When /I wait (\d+) seconds?$/ do |period|
211
- sleep period.to_i
212
- end
213
-
214
- def wait_for_ajax
215
- Timeout.timeout(Capybara.default_max_wait_time) do
216
- sleep(0.5) until finished_all_ajax_requests?
217
- end
218
- end
219
-
220
- def finished_all_ajax_requests?
221
- jquery_undefined? || page.evaluate_script("jQuery.active").zero?
222
- end
223
-
224
- def jquery_undefined?
225
- page.evaluate_script("typeof(jQuery) === 'undefined'")
226
- end
227
-
228
- When /^I wait for ajax response$/ do
229
- wait_for_ajax
230
- end
231
-
232
- # Then /what/ do
233
- # save_and_open_page
234
- # end
235
- #
236
- Then /debug/ do
237
- require "pry"
238
- #
239
- nil
240
- end
241
- # if RUBY_VERSION =~ /^2/
242
- # else
243
- # debugger
244
- # end
245
- # nil
246
- # end
247
-
248
- def create_card username, cardtype, cardname, content=""
249
- signed_in_as(username) do
250
- if cardtype == "Pointer"
251
- Card.create name: cardname, type: cardtype, content: content
252
- else
253
- visit "/card/new?card[name]=#{CGI.escape(cardname)}&type=#{cardtype}"
254
- yield if block_given?
255
- click_button "Submit"
256
- wait_for_ajax
257
- end
258
- end
259
- end
260
-
261
- def signed_in_as username
262
- sameuser = (username == "I")
263
- sameuser ||= (Card::Auth.current.key == username.to_name.key)
264
- was_signed_in = Card::Auth.current_id if Card::Auth.signed_in?
265
- step "I am signed in as #{username}" unless sameuser
266
- yield
267
- return if sameuser
268
- msg = if was_signed_in
269
- "I am signed in as #{Card[was_signed_in].name}"
270
- else
271
- 'I follow "Sign out"'
272
- end
273
- step msg
274
- end
275
-
276
- When /^In (.*) I follow "([^\"]*)"$/ do |section, link|
277
- within scope_of(section) do
278
- click_link link
279
- end
280
- end
281
-
282
- When /^In (.*) I click "(.*)"$/ do |section, link|
283
- within scope_of(section) do
284
- click_link link
285
- end
286
- end
287
-
288
- When /^I click "(.*)" within "(.*)"$/ do |link, selector|
289
- within selector do
290
- click_link link
291
- end
292
- end
293
-
294
- When /^In (.*) I find link with class "(.*)" and click it$/ do |section, css_class|
295
- within scope_of(section) do
296
- find("a.#{css_class}").click
297
- end
298
- end
299
-
300
- When /^In (.*) I find link with icon "(.*)" and click it$/ do |section, icon|
301
- within scope_of(section) do
302
- find("a > i.material-icons", text: icon).click
303
- end
304
- end
305
-
306
- When /^In (.*) I find button with icon "(.*)" and click it$/ do |section, icon|
307
- within scope_of(section) do
308
- find("button > i.material-icons", text: icon).click
309
- end
310
- end
311
-
312
- Given /^Jobs are dispatched$/ do
313
- Delayed::Worker.new.work_off
314
- end
315
-
316
- Then /^No errors in the job queue$/ do
317
- if (last = Delayed::Job.last) && (last.last_error)
318
- puts last.last_error
319
- expect(last.last_error).to be_blank
320
- end
321
- end
322
-
323
-
324
- Then /I submit$/ do
325
- click_button "Submit"
326
- end
327
-
328
- When /^I open the main card menu$/ do
329
- slot = "$('#main .menu-slot .vertical-card-menu._show-on-hover .card-slot')"
330
- page.execute_script "#{slot}.show()"
331
- page.find("#main .menu-slot .card-menu a").click
332
- end
333
-
334
- When /^I close the modal window$/ do
335
- page.find(".modal-menu .close-modal").click
336
- end
337
-
338
- # When /^I pick (.*)$/ do |menu_item|
339
- # end
340
-
341
- Then /the card (.*) should contain "([^\"]*)"$/ do |cardname, content|
342
- visit path_to("card #{cardname}")
343
- within scope_of("main card content") do
344
- expect(page).to have_content(content)
345
- end
346
- end
347
-
348
- Then /the card (.*) should not contain "([^\"]*)"$/ do |cardname, content|
349
- visit path_to("card #{cardname}")
350
- within scope_of("main card content") do
351
- expect(page).not_to have_content(content)
352
- end
353
- end
354
-
355
- Then /the card (.*) should point to "([^\"]*)"$/ do |cardname, content|
356
- visit path_to("card #{cardname}")
357
- within scope_of("pointer card content") do
358
- expect(page).to have_content(content)
359
- end
360
- end
361
-
362
- Then /the card (.*) should not point to "([^\"]*)"$/ do |cardname, content|
363
- visit path_to("card #{cardname}")
364
- within scope_of("pointer card content") do
365
- expect(page).not_to have_content(content)
366
- end
367
- end
368
-
369
- Then /^In (.*) I should see "([^\"]*)"$/ do |section, text|
370
- within scope_of(section) do
371
- if text.index("|")
372
- expect(text.split("|").any? { |t| have_content(t) }).to be
373
- else
374
- expect(page).to have_content(text)
375
- end
376
- end
377
- end
378
-
379
- Then /^I should see "([^\"]*)" in the editor$/ do |text|
380
- within_frame 0 do
381
- expect(page).to have_content(text)
382
- end
383
- end
384
-
385
- Then /^In (.*) I should not see "([^\"]*)"$/ do |section, text|
386
- within scope_of(section) do
387
- expect(page).not_to have_content(text)
388
- end
389
- end
390
-
391
- class_re = /^In (.*) I should (not )?see a ([^\"]*) with class "([^\"]*)"$/
392
- Then class_re do |selection, neg, element, selector|
393
- # checks for existence of a element with a class in a selection context
394
- element = "a" if element == "link"
395
- within scope_of(selection) do
396
- verb = neg ? :should_not : :should
397
- page.send(verb, have_css([element, selector].join(".")))
398
- end
399
- end
400
-
401
- content_re = /^In (.*) I should (not )?see a ([^\"]*) with content "([^\"]*)"$/
402
- Then content_re do |selection, neg, element, content|
403
- # checks for existence of a element with a class in a selection context
404
- element = "a" if element == "link"
405
- within scope_of(selection) do
406
- verb = neg ? :should_not : :should
407
- page.send(verb, have_css(element, text: content))
408
- end
409
- end
410
-
411
- Then /^the "([^"]*)" field should contain "([^"]*)"$/ do |field, value|
412
- expect(field_labeled(field).value).to match(/#{value}/)
413
- end
414
-
415
- Then /^"([^"]*)" should be selected for "([^"]*)"$/ do |value, field|
416
- element = field_labeled(field).element
417
- selected = element.search ".//option[@selected = 'selected']"
418
- expect(selected.inner_html).to match /#{value}/
419
- end
420
-
421
- Then /^"([^"]*)" should be signed in$/ do |user| # "
422
- has_css?(".my-card-link", text: user)
423
- end
424
-
425
- When /^I press enter to search$/ do
426
- find("#_keyword").native.send_keys(:return)
427
- end
428
-
429
- ## variants of standard steps to handle """ style quoted args
430
- Then /^I should see$/ do |text|
431
- expect(page).to have_content(text)
432
- end
433
-
434
- Then /^I should see a preview image of size (.+)$/ do |size|
435
- find("span.preview img[src*='#{size}.png']")
436
- end
437
-
438
- Then /^I should see an image of size "(.+)" and type "(.+)"$/ do |size, type|
439
- find("img[src*='#{size}.#{type}']")
440
- end
441
-
442
- img_sld = /^within "(.+)" I should see an image of size "(.+)" and type "(.+)"$/
443
- Then img_sld do |selector, size, type|
444
- within selector do
445
- find("img[src*='#{size}.#{type}']")
446
- end
447
- end
448
-
449
- img_should = /^I should see a non-coded image of size "(.+)" and type "(.+)"$/
450
- Then img_should do |size, type|
451
- element = find("img[src*='#{size}.#{type}']")
452
- expect(element[:src]).to match(%r{/~\d+/})
453
- end
454
-
455
- Then /^I should see "([^\"]*)" in color (.*)$/ do |text, css_class|
456
- page.has_css?(".diff-#{css_class}", text: text)
457
- end
458
-
459
- Then /^I should see css class "([^\"]*)"$/ do |css_class|
460
- find(css_class)
461
- end
462
-
463
- css_should = /^I should see css class "([^\"]*)" within "(.*)"$/
464
- Then css_should do |css_class, selector|
465
- within selector do
466
- find(css_class)
467
- end
468
- end
469
-
470
- When /^I fill in "([^\"]*)" with$/ do |field, value|
471
- fill_in(field, with: value)
472
- end
473
-
474
- When(/^I scroll (-?\d+) pixels$/) do |number|
475
- page.execute_script "window.scrollBy(0, #{number})"
476
- end
477
-
478
- When(/^I scroll (\d+) pixels down$/) do |number|
479
- page.execute_script "window.scrollBy(0, #{number})"
480
- end
481
-
482
- When(/^I scroll (\d+) pixels up$/) do |number|
483
- page.execute_script "window.scrollBy(0, -#{number})"
484
- end
485
-
486
- module Capybara
487
- module Node
488
- # adapt capybara methods to fill in forms to decko's form interface
489
- module Actions
490
- alias_method :original_fill_in, :fill_in
491
- alias_method :original_select, :select
492
-
493
- def fill_in locator, options={}
494
- decko_fill_in(locator, options) || original_fill_in(locator, options)
495
- end
496
-
497
- def select value, options={}
498
- decko_select(value, options) || original_select(value, options)
499
- end
500
-
501
- def decko_fill_in locator, options
502
- el = labeled_field(:input, locator) || labeled_field(:textarea, locator)
503
- return unless el
504
- el.set options[:with]
505
- true
506
- end
507
-
508
- def decko_select value, options
509
- el = labeled_field :select, options[:from], visible: false
510
- return unless el
511
- value = el.find("option", text: value, visible: false)["value"]
512
- choose_value el, value
513
- true
514
- end
515
-
516
- def choose_value el, value
517
- id = el["id"]
518
- session.execute_script("$('##{id}').val('#{value}')")
519
- # session.execute_script("$('##{id}').trigger('chosen:updated')")
520
- # session.execute_script("$('##{id}').change()")
521
- end
522
-
523
- def labeled_field type, label, options={}
524
- label.gsub!(/^\+/, "") # because '+' is in an extra span,
525
- # descendant-or-self::text doesn't find it
526
- first :xpath,
527
- "//label[descendant-or-self::text()='#{label}']/..//#{type}",
528
- options.merge(wait: 5)
529
- end
530
- end
531
- end
532
- end