mercury-rails 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/app/assets/images/mercury/toolbar/primary/tools.png +0 -0
  2. data/app/assets/images/mercury/toolbar/primary/user.png +0 -0
  3. data/app/assets/javascripts/mercury/dialogs/snippetpanel.js.coffee +1 -1
  4. data/app/assets/javascripts/mercury/lightview.js.coffee +11 -4
  5. data/app/assets/javascripts/mercury/locales/ar.locale.js.coffee +0 -4
  6. data/app/assets/javascripts/mercury/locales/da.locale.js.coffee +0 -4
  7. data/app/assets/javascripts/mercury/locales/de.locale.js.coffee +0 -4
  8. data/app/assets/javascripts/mercury/locales/es.locale.js.coffee +0 -4
  9. data/app/assets/javascripts/mercury/locales/example.local.js.coffee +0 -4
  10. data/app/assets/javascripts/mercury/locales/fr.locale.js.coffee +0 -4
  11. data/app/assets/javascripts/mercury/locales/hu.locale.js.coffee +209 -0
  12. data/app/assets/javascripts/mercury/locales/it.locale.js.coffee +0 -4
  13. data/app/assets/javascripts/mercury/locales/ko.local.js.coffee +0 -4
  14. data/app/assets/javascripts/mercury/locales/nl.locale.js.coffee +0 -4
  15. data/app/assets/javascripts/mercury/locales/pt.locale.js.coffee +0 -4
  16. data/app/assets/javascripts/mercury/locales/ru.locale.js.coffee +200 -0
  17. data/app/assets/javascripts/mercury/locales/sv.local.js.coffee +0 -4
  18. data/app/assets/javascripts/mercury/locales/swedish_chef.locale.js.coffee +0 -4
  19. data/app/assets/javascripts/mercury/locales/zh.local.js.coffee +0 -4
  20. data/app/assets/javascripts/mercury/mercury-compiled.js +10720 -0
  21. data/app/assets/javascripts/mercury/mercury.js.coffee +1 -1
  22. data/app/assets/javascripts/mercury/modal.js.coffee +14 -7
  23. data/app/assets/javascripts/mercury/modals/htmleditor.js.coffee +1 -1
  24. data/app/assets/javascripts/mercury/modals/insertmedia.js.coffee +2 -0
  25. data/app/assets/javascripts/mercury/modals/inserttable.js.coffee +10 -4
  26. data/app/assets/javascripts/mercury/page_editor.js.coffee +9 -9
  27. data/app/assets/javascripts/mercury/palette.js.coffee +1 -1
  28. data/app/assets/javascripts/mercury/panel.js.coffee +1 -0
  29. data/app/assets/javascripts/mercury/region.js.coffee +3 -3
  30. data/app/assets/javascripts/mercury/regions/{full.coffee → full.js.coffee} +2 -2
  31. data/app/assets/javascripts/mercury/regions/{markdown.coffee → markdown.js.coffee} +7 -1
  32. data/app/assets/javascripts/mercury/regions/snippets.js.coffee +1 -1
  33. data/app/assets/javascripts/mercury/select.js.coffee +1 -1
  34. data/app/assets/javascripts/mercury/snippet.js.coffee +40 -21
  35. data/app/assets/javascripts/mercury/toolbar.button.js.coffee +35 -20
  36. data/app/assets/javascripts/mercury/toolbar.expander.js.coffee +4 -3
  37. data/app/assets/javascripts/mercury/toolbar.js.coffee +6 -2
  38. data/app/assets/stylesheets/_mercury-bootstrap-overrides.scss +61 -0
  39. data/app/assets/stylesheets/_mercury-sass.scss +33 -0
  40. data/app/assets/stylesheets/mercury.css +1 -0
  41. data/app/assets/stylesheets/mercury/all_images.css.erb +4 -0
  42. data/app/assets/stylesheets/mercury/dialog.css +5 -2
  43. data/app/assets/stylesheets/mercury/mercury.css +0 -1
  44. data/app/assets/stylesheets/mercury/toolbar.css +3 -0
  45. data/app/assets/stylesheets/mercury/uploader.css +1 -1
  46. data/app/views/mercury/modals/media.html +10 -0
  47. data/app/views/mercury/panels/snippets.html +6 -1
  48. data/app/views/mercury/snippets/example/options.html.erb +1 -1
  49. data/app/views/mercury/snippets/no_options/preview.html.erb +1 -0
  50. data/features/loading/loading.feature +1 -1
  51. data/features/regions/full/basic_editing.feature +2 -2
  52. data/features/regions/full/inserting_media.feature +18 -0
  53. data/features/regions/full/inserting_snippets.feature +11 -0
  54. data/features/step_definitions/custom_web_steps.rb +22 -0
  55. data/features/step_definitions/mercury_steps.rb +1 -439
  56. data/features/support/selectors.rb +23 -0
  57. data/lib/generators/mercury/install/images/templates/ar_paperclip_image.rb +2 -0
  58. data/lib/mercury/cucumber/step_definitions.rb +13 -0
  59. data/lib/mercury/cucumber/step_definitions/mercury_steps.rb +408 -0
  60. data/{features → lib/mercury/cucumber}/support/mercury_contents.rb +1 -1
  61. data/{features → lib/mercury/cucumber}/support/mercury_selectors.rb +0 -20
  62. data/lib/mercury/rails.rb +1 -0
  63. data/lib/mercury/version.rb +1 -1
  64. data/spec/dummy/config/application.rb +4 -1
  65. data/spec/dummy/config/database.yml +10 -0
  66. data/spec/dummy/db/.gitkeep +0 -0
  67. data/spec/dummy/public/index.html +13 -2
  68. data/spec/javascripts/mercury/lightview_spec.js.coffee +33 -1
  69. data/spec/javascripts/mercury/modal_spec.js.coffee +35 -3
  70. data/spec/javascripts/mercury/modals/htmleditor_spec.js.coffee +1 -1
  71. data/spec/javascripts/mercury/modals/insertmedia_spec.js.coffee +6 -2
  72. data/spec/javascripts/mercury/modals/inserttable_spec.js.coffee +10 -0
  73. data/spec/javascripts/mercury/page_editor_spec.js.coffee +6 -5
  74. data/spec/javascripts/mercury/region_spec.js.coffee +4 -0
  75. data/spec/javascripts/mercury/snippet_spec.js.coffee +65 -21
  76. data/spec/javascripts/mercury/toolbar_spec.js.coffee +22 -0
  77. data/spec/javascripts/templates/mercury/modals/insertmedia.html +10 -0
  78. metadata +26 -16
  79. data/spec/dummy/config/database.example.yml +0 -25
  80. data/spec/dummy/config/database.travisci.yml +0 -4
@@ -15,7 +15,7 @@ module MercuryContentsHelpers
15
15
  def parse_snippet_options_from(options_string)
16
16
  json = []
17
17
  options_string.scan(/(?:,\s)?([^:]*): ("[^"]*")/).each do |pair|
18
- json << %Q{'options[#{pair[0]}]': #{pair[1]}}
18
+ json << %Q{'#{pair[0]}': #{pair[1]}}
19
19
  end
20
20
 
21
21
  "{#{json.join(', ')}}"
@@ -123,26 +123,6 @@ module MercurySelectorsHelpers
123
123
  end
124
124
  end
125
125
 
126
- def region_selector_for(locator)
127
- case locator.downcase
128
-
129
- when 'the first full region', 'the full region' then '#full_1'
130
- when 'the first markdown region', 'the markdown region' then '#markdown_1'
131
- when 'the first snippets region', 'the first snippet region', 'the snippets region', 'the snippet region' then '#snippets_1'
132
-
133
- else locator
134
- end
135
- end
136
-
137
- def snippet_name_for(locator)
138
- case locator.downcase
139
-
140
- when 'the example snippet' then 'example'
141
-
142
- else locator
143
- end
144
- end
145
-
146
126
  end
147
127
 
148
128
  World(MercurySelectorsHelpers)
@@ -1,4 +1,5 @@
1
1
  module Mercury
2
+ require 'coffee_script'
2
3
  require 'mercury/version'
3
4
  require 'mercury/engine'
4
5
  end
@@ -1,3 +1,3 @@
1
1
  module Mercury
2
- VERSION = '0.8.0'
2
+ VERSION = '0.9.0'
3
3
  end
@@ -1,6 +1,9 @@
1
1
  require File.expand_path('../boot', __FILE__)
2
2
 
3
- require 'rails/all'
3
+ require 'action_controller/railtie'
4
+ require 'active_record/railtie'
5
+ require 'action_mailer/railtie'
6
+ require 'sprockets/railtie'
4
7
 
5
8
  Bundler.require
6
9
  require "mercury-rails"
@@ -0,0 +1,10 @@
1
+ development:
2
+ adapter: sqlite3
3
+ database: db/development.sqlite3
4
+ pool: 5
5
+ timeout: 5000
6
+
7
+ test:
8
+ adapter: sqlite3
9
+ database: ":memory:"
10
+ timeout: 500
File without changes
@@ -22,6 +22,8 @@
22
22
 
23
23
  // preload snippets
24
24
  Event.observe(window, "mercury:ready", function() {
25
+ Mercury.config.regions.dataAttributes = ['information'];
26
+
25
27
  Mercury.saveURL = '/contents';
26
28
  Mercury.Snippet.load({
27
29
  snippet_0: {name: 'example', options: {'options[favorite_beer]': "Bells Hopslam", 'options[first_name]': "00"}},
@@ -39,6 +41,15 @@
39
41
  snippet_12: {name: 'example', options: {'options[favorite_beer]': "Bells Hopslam", 'options[first_name]': "12"}},
40
42
  snippet_13: {name: 'example', options: {'options[favorite_beer]': "Bells Hopslam", 'options[first_name]': "13"}}
41
43
  });
44
+
45
+ Mercury.PageEditor.prototype.save = function() {
46
+ var data = this.serialize();
47
+ var lightview = Mercury.lightview(null, {title: 'Saving', closeButton: true});
48
+ setTimeout(function() {
49
+ var textarea = '<textarea style="width:100%;height:300px" wrap="off">' + top.JSON.stringify(data, null, ' ') + '</textarea>';
50
+ lightview.loadContent('<div style="width:500px">Saving in the demo is disabled, but you can see what would be sent to the server below.' + textarea + '</div>');
51
+ }, 500);
52
+ };
42
53
  });
43
54
 
44
55
  var newRegionIndex = 1;
@@ -109,7 +120,7 @@
109
120
 
110
121
  <!-- begin full region 1 -->
111
122
  <h1>Full region</h1>
112
- <div id="full_1" data-mercury="full">
123
+ <div id="full_1" data-mercury="full" data-information="foo">
113
124
  If the first line of content isn't wrapped in an element you can't set justification (mozilla only bug).
114
125
 
115
126
  <h2>text with a meta tag (that will be removed)</h2>
@@ -192,7 +203,7 @@
192
203
 
193
204
  <!-- begin simple region 1 -->
194
205
  <h1>Simple region (h1 tag)</h1>
195
- <h1 id="simple_1" data-mercury="simple">This is a simple region</h1>
206
+ <h1 id="simple_1" data-mercury="simple" data-information="foo">This is a simple region</h1>
196
207
  <!-- end simple region 1 -->
197
208
 
198
209
  <!-- begin simple region 2 -->
@@ -28,7 +28,7 @@ describe "Mercury.lightview", ->
28
28
  it "returns an instance", ->
29
29
  ret = Mercury.lightview('/foo')
30
30
  expect(ret).toEqual(Mercury.lightview.instance)
31
- expect(ret).toEqual(new Mercury.Lightview('/foo'))
31
+ expect(ret.show).toEqual(Mercury.Lightview.prototype.show)
32
32
 
33
33
 
34
34
  describe "#show", ->
@@ -38,6 +38,14 @@ describe "Mercury.lightview", ->
38
38
  @updateSpy = spyOn(Mercury.Lightview.prototype, 'update').andCallFake(=>)
39
39
  @appearSpy = spyOn(Mercury.Lightview.prototype, 'appear').andCallFake(=>)
40
40
 
41
+ it "sets options.ujsHandling to true unless set to false", ->
42
+ instance = new Mercury.Lightview()
43
+ instance.show()
44
+ expect(instance.options.ujsHandling).toEqual(true)
45
+ instance = new Mercury.Lightview('', {ujsHandling: false})
46
+ instance.show()
47
+ expect(instance.options.ujsHandling).toEqual(false)
48
+
41
49
  it "triggers the focus:window event", ->
42
50
  spy = spyOn(Mercury, 'trigger').andCallFake(=>)
43
51
  new Mercury.Lightview().show()
@@ -441,6 +449,12 @@ describe "Mercury.lightview", ->
441
449
  @lightview.loadContent('<span>foo</span>')
442
450
  expect($('.mercury-lightview-content').html()).toEqual('<span>Bork!</span>')
443
451
 
452
+ it "makes any element with the lightview-close class close the lightview", ->
453
+ spy = spyOn(@lightview, 'hide').andCallFake(=>)
454
+ @lightview.loadContent('<span class="lightview-close">foo</span>')
455
+ jasmine.simulate.click(@lightview.contentElement.find('.lightview-close').get(0))
456
+ expect(spy.callCount).toEqual(1)
457
+
444
458
  it "calls resize", ->
445
459
  @lightview.loadContent('content')
446
460
  expect(@resizeSpy.callCount).toEqual(1)
@@ -458,6 +472,24 @@ describe "Mercury.lightview", ->
458
472
  expect($('.mercury-lightview-title span').html()).toEqual('new title')
459
473
 
460
474
 
475
+ describe "#serializeForm", ->
476
+
477
+ beforeEach ->
478
+ spyOn(Mercury.Lightview.prototype, 'appear').andCallFake(=>)
479
+ @lightview = Mercury.lightview('/blank.html', {appendTo: $('#test'), title: 'title'})
480
+
481
+ describe "without a form", ->
482
+
483
+ it "returns an empty object", ->
484
+ expect(@lightview.serializeForm()).toEqual({})
485
+
486
+ describe "with a form", ->
487
+
488
+ it "returns an object of the serialized form", ->
489
+ @lightview.loadContent('<form><input name="options[foo]" value="bar"/></form>')
490
+ expect(@lightview.serializeForm()).toEqual({options: {foo: 'bar'}})
491
+
492
+
461
493
  describe "#reset", ->
462
494
 
463
495
  beforeEach ->
@@ -16,7 +16,7 @@ describe "Mercury.modal", ->
16
16
  $(window).unbind('mercury:resize')
17
17
  $(document).unbind('keydown')
18
18
 
19
- describe "singleton method", ->
19
+ describe "builder method", ->
20
20
 
21
21
  beforeEach ->
22
22
  @showSpy = spyOn(Mercury.Modal.prototype, 'show').andCallFake(=>)
@@ -27,8 +27,8 @@ describe "Mercury.modal", ->
27
27
 
28
28
  it "returns an instance", ->
29
29
  ret = Mercury.modal('/foo')
30
- expect(ret).toEqual(Mercury.modal.instance)
31
- expect(ret).toEqual(new Mercury.Modal('/foo'))
30
+ expect(ret.constructor).toEqual(Mercury.Modal)
31
+ expect(ret.show).toEqual(Mercury.Modal.prototype.show)
32
32
 
33
33
 
34
34
  describe "#show", ->
@@ -38,6 +38,14 @@ describe "Mercury.modal", ->
38
38
  @updateSpy = spyOn(Mercury.Modal.prototype, 'update').andCallFake(=>)
39
39
  @appearSpy = spyOn(Mercury.Modal.prototype, 'appear').andCallFake(=>)
40
40
 
41
+ it "sets options.ujsHandling to true unless set to false", ->
42
+ instance = new Mercury.Modal()
43
+ instance.show()
44
+ expect(instance.options.ujsHandling).toEqual(true)
45
+ instance = new Mercury.Modal('', {ujsHandling: false})
46
+ instance.show()
47
+ expect(instance.options.ujsHandling).toEqual(false)
48
+
41
49
  it "triggers the focus:window event", ->
42
50
  spy = spyOn(Mercury, 'trigger').andCallFake(=>)
43
51
  new Mercury.Modal().show()
@@ -433,6 +441,12 @@ describe "Mercury.modal", ->
433
441
  @modal.loadContent('<span>foo</span>')
434
442
  expect($('.mercury-modal-content').html()).toEqual('<span>Bork!</span>')
435
443
 
444
+ it "makes any element with the modal-close class close the modal", ->
445
+ spy = spyOn(@modal, 'hide').andCallFake(=>)
446
+ @modal.loadContent('<span class="modal-close">foo</span>')
447
+ jasmine.simulate.click(@modal.contentElement.find('.modal-close').get(0))
448
+ expect(spy.callCount).toEqual(1)
449
+
436
450
  it "calls resize", ->
437
451
  @modal.loadContent('content')
438
452
  expect(@resizeSpy.callCount).toEqual(1)
@@ -456,6 +470,24 @@ describe "Mercury.modal", ->
456
470
  expect($('.mercury-modal-title a').css('display')).toEqual('none')
457
471
 
458
472
 
473
+ describe "#serializeForm", ->
474
+
475
+ beforeEach ->
476
+ spyOn(Mercury.Modal.prototype, 'appear').andCallFake(=>)
477
+ @modal = Mercury.modal('/blank.html', {appendTo: $('#test'), title: 'title'})
478
+
479
+ describe "without a form", ->
480
+
481
+ it "returns an empty object", ->
482
+ expect(@modal.serializeForm()).toEqual({})
483
+
484
+ describe "with a form", ->
485
+
486
+ it "returns an object of the serialized form", ->
487
+ @modal.loadContent('<form><input name="options[foo]" value="bar"/></form>')
488
+ expect(@modal.serializeForm()).toEqual({options: {foo: 'bar'}})
489
+
490
+
459
491
  describe "#reset", ->
460
492
 
461
493
  beforeEach ->
@@ -22,7 +22,7 @@ describe "Mercury.modalHandlers.htmlEditor", ->
22
22
  spy = spyOn(Mercury, 'trigger').andCallFake(=>)
23
23
  jasmine.simulate.click($('#submit').get(0))
24
24
  expect(spy.callCount).toEqual(1)
25
- expect(spy.argsForCall[0]).toEqual(['action', {action: 'replaceHTML', value: '<span>html content</span>'}])
25
+ expect(spy.argsForCall[0]).toEqual(['action', {action: 'replaceHTML', value: '<span>html \ncontent</span>'}])
26
26
 
27
27
  it "hides the modal", ->
28
28
  spy = spyOn(@modal, 'hide').andCallFake(=>)
@@ -53,7 +53,7 @@ describe "Mercury.modalHandlers.insertMedia", ->
53
53
 
54
54
  beforeEach ->
55
55
  @focusSpy = spyOn($.fn, 'focus').andCallThrough()
56
- @selection = {is: -> $('<img>', {src: '/foo.gif', align: 'right'})}
56
+ @selection = {is: -> $('<img>', {src: '/foo.gif', align: 'right', style: 'float: left;'})}
57
57
  Mercury.region = selection: => @selection
58
58
  @insertMedia.initialize()
59
59
 
@@ -67,6 +67,9 @@ describe "Mercury.modalHandlers.insertMedia", ->
67
67
  it "sets the image alignment option", ->
68
68
  expect($('#media_image_alignment').val()).toEqual('right')
69
69
 
70
+ it "sets the image float option", ->
71
+ expect($('#media_image_float').val()).toEqual('left')
72
+
70
73
  describe "an existing youtube video", ->
71
74
 
72
75
  beforeEach ->
@@ -176,13 +179,14 @@ describe "Mercury.modalHandlers.insertMedia", ->
176
179
  beforeEach ->
177
180
  $('#media_image_url').val('http://domain/foo.gif')
178
181
  $('#media_image_alignment').val('right')
182
+ $('#media_image_float').val('left')
179
183
 
180
184
  it "triggers an action with the proper values", ->
181
185
  jasmine.simulate.click($('input[type=submit]').get(0))
182
186
  expect(@triggerSpy.callCount).toEqual(1)
183
187
  expect(@triggerSpy.argsForCall[0][0]).toEqual('action')
184
188
  expect(@triggerSpy.argsForCall[0][1]['action']).toEqual('insertImage')
185
- expect(@triggerSpy.argsForCall[0][1]['value']).toEqual({src: 'http://domain/foo.gif', align: 'right'})
189
+ expect(@triggerSpy.argsForCall[0][1]['value']).toEqual({src: 'http://domain/foo.gif', align: 'right', style: 'float: left;'})
186
190
 
187
191
  describe "a youtube video", ->
188
192
 
@@ -118,6 +118,11 @@ describe "Mercury.modalHandlers.insertTable", ->
118
118
  jasmine.simulate.keyup($('#table_border').get(0))
119
119
  expect($('table').attr('border')).toEqual('2')
120
120
 
121
+ it "removes the property if empty value specified", ->
122
+ $('#table_border').val('')
123
+ jasmine.simulate.keyup($('#table_border').get(0))
124
+ expect($('table').attr('border')).toEqual(undefined)
125
+
121
126
 
122
127
  describe "changing the cellspacing", ->
123
128
 
@@ -134,6 +139,11 @@ describe "Mercury.modalHandlers.insertTable", ->
134
139
  jasmine.simulate.keyup($('#table_spacing').get(0))
135
140
  expect($('table').attr('cellspacing')).toEqual('12')
136
141
 
142
+ it "removes the property if empty value specified", ->
143
+ $('#table_spacing').val('')
144
+ jasmine.simulate.keyup($('#table_spacing').get(0))
145
+ expect($('table').attr('cellspacing')).toEqual(undefined)
146
+
137
147
 
138
148
  describe "submitting", ->
139
149
 
@@ -440,6 +440,7 @@ describe "Mercury.PageEditor", ->
440
440
  Mercury.Toolbar = -> {
441
441
  toolbar: true,
442
442
  height: (-> 100),
443
+ top: (-> 0),
443
444
  show: (=> spec.toolbarShowCallCount += 1),
444
445
  hide: (=> spec.toolbarHideCallCount += 1)
445
446
  }
@@ -509,19 +510,19 @@ describe "Mercury.PageEditor", ->
509
510
  describe "#resize", ->
510
511
 
511
512
  beforeEach ->
512
- Mercury.Toolbar = -> {toolbar: true, height: -> 100}
513
+ Mercury.Toolbar = -> {toolbar: true, height: (-> 100), top: (-> 50)}
513
514
  Mercury.Statusbar = -> {statusbar: true, top: -> 500}
514
515
  Mercury.PageEditor.prototype.initializeFrame = ->
515
516
  @pageEditor = new Mercury.PageEditor('', {appendTo: $('#test')})
516
517
 
517
518
  it "sets the display rectangle to displayRect", ->
518
519
  @pageEditor.resize()
519
- expect(Mercury.displayRect.top).toEqual(100)
520
- expect(Mercury.displayRect.height).toEqual(500 - 100)
520
+ expect(Mercury.displayRect.top).toEqual(100+50)
521
+ expect(Mercury.displayRect.height).toEqual(500 - (100+50))
521
522
 
522
523
  it "resizes the iframe", ->
523
524
  @pageEditor.resize()
524
- expect($('.mercury-iframe').css('height')).toEqual("#{500 - 100}px")
525
+ expect($('.mercury-iframe').css('height')).toEqual("#{500 - (100+50)}px")
525
526
 
526
527
  it "triggers a resize event", ->
527
528
  spy = spyOn(Mercury, 'trigger').andCallFake(=>)
@@ -739,7 +740,7 @@ describe "Mercury.PageEditor", ->
739
740
  spy = spyOn(Mercury, 'trigger').andCallFake(=>)
740
741
  @pageEditor.save()
741
742
  expect(spy.callCount).toEqual(1)
742
- expect(spy.argsForCall[0]).toEqual(['saved'])
743
+ expect(spy.argsForCall[0]).toEqual(['saved', 'data'])
743
744
 
744
745
  describe "on failed ajax request", ->
745
746
 
@@ -268,6 +268,10 @@ describe "Mercury.Region", ->
268
268
  @region.element.attr('data-version', 2)
269
269
  expect(@region.dataAttributes()).toEqual({scope: 'scope', version: '2'})
270
270
 
271
+ it "looks to @container if it's set", ->
272
+ @region.container = $('<div>').attr('data-version', 3)
273
+ expect(@region.dataAttributes()).toEqual({scope: undefined, version: '3'})
274
+
271
275
 
272
276
  describe "#serialize", ->
273
277
 
@@ -189,7 +189,7 @@ describe "Mercury.Snippet", ->
189
189
 
190
190
  it "returns an object with name and options", ->
191
191
  ret = @snippet.serialize()
192
- expect(ret).toEqual({name: 'foo', options: {foo: 'bar'}})
192
+ expect(ret).toEqual({name: 'foo', foo: 'bar'})
193
193
 
194
194
 
195
195
 
@@ -202,21 +202,45 @@ describe "Mercury.Snippet class methods", ->
202
202
 
203
203
  beforeEach ->
204
204
  @modalSpy = spyOn(Mercury, 'modal').andCallFake(=>)
205
+ @triggerSpy = spyOn(Mercury, 'trigger').andCallFake(=>)
205
206
 
206
- it "opens a modal with the name in the url", ->
207
- Mercury.Snippet.displayOptionsFor('foo')
208
- expect(@modalSpy.callCount).toEqual(1)
209
- expect(@modalSpy.argsForCall[0]).toEqual(["/mercury/snippets/foo/options.html", {title: 'Snippet Options', handler: 'insertSnippet', snippetName: 'foo'}])
207
+ describe "with options", ->
210
208
 
211
- it "sets the snippet back to nothing", ->
212
- Mercury.snippet = 'foo'
213
- Mercury.Snippet.displayOptionsFor('foo')
214
- expect(Mercury.snippet).toEqual(null)
209
+ it "opens a modal with the name in the url", ->
210
+ Mercury.Snippet.displayOptionsFor('foo')
211
+ expect(@modalSpy.callCount).toEqual(1)
212
+ expect(@modalSpy.argsForCall[0]).toEqual(["/mercury/snippets/foo/options.html", {title: 'Snippet Options', handler: 'insertSnippet', snippetName: 'foo', loadType : 'POST'}])
215
213
 
216
- it "can pass options to the modal", ->
217
- Mercury.Snippet.displayOptionsFor('foo', {option1: 'option1'})
218
- expect(@modalSpy.callCount).toEqual(1)
219
- expect(@modalSpy.argsForCall[0]).toEqual(["/mercury/snippets/foo/options.html", {title: 'Snippet Options', handler: 'insertSnippet', snippetName: 'foo', option1: 'option1'}])
214
+ it "sets the snippet back to nothing", ->
215
+ Mercury.snippet = 'foo'
216
+ Mercury.Snippet.displayOptionsFor('foo')
217
+ expect(Mercury.snippet).toEqual(null)
218
+
219
+ it "can pass options to the modal", ->
220
+ Mercury.Snippet.displayOptionsFor('foo', {option1: 'option1'})
221
+ expect(@modalSpy.callCount).toEqual(1)
222
+ expect(@modalSpy.argsForCall[0]).toEqual(["/mercury/snippets/foo/options.html", {title: 'Snippet Options', handler: 'insertSnippet', snippetName: 'foo', loadType: 'POST', option1: 'option1'}])
223
+
224
+ it "doesn't trigger an event to insert the snippet", ->
225
+ Mercury.Snippet.displayOptionsFor('foo')
226
+ expect(@triggerSpy.callCount).toEqual(0)
227
+
228
+ describe "without options", ->
229
+
230
+ it "triggers an event to insert the snippet", ->
231
+ Mercury.Snippet.displayOptionsFor('foo', {}, false)
232
+ expect(@triggerSpy.callCount).toEqual(1)
233
+ expect(@triggerSpy.argsForCall[0][0]).toEqual('action')
234
+ expect(@triggerSpy.argsForCall[0][1]['action']).toEqual('insertSnippet')
235
+
236
+ it "doesn't open a modal", ->
237
+ Mercury.Snippet.displayOptionsFor('foo', {}, false)
238
+ expect(@modalSpy.callCount).toEqual(0)
239
+
240
+ it "sets the snippet back to nothing", ->
241
+ Mercury.snippet = 'foo'
242
+ Mercury.Snippet.displayOptionsFor('foo', {}, false)
243
+ expect(Mercury.snippet).toEqual(null)
220
244
 
221
245
 
222
246
  describe ".create", ->
@@ -235,15 +259,31 @@ describe "Mercury.Snippet class methods", ->
235
259
  it "pushes into the collection array", ->
236
260
  Mercury.Snippet.create('foo', {foo: 'bar'})
237
261
  expect(Mercury.Snippet.all.length).toEqual(1)
238
-
239
- describe "when an snuppet exist with an identical identity", ->
262
+
263
+ describe "when a snippet exist with an identical identity", ->
240
264
  it "generates a unique identity", ->
241
265
  Mercury.Snippet.load
242
- snippet_1: {name: 'foo', options: {foo: 'bar'}}
243
- snippet_2: {name: 'bar', options: {baz: 'pizza'}}
266
+ snippet_0: {name: 'foo0', options: {foo: 'bar'}}
267
+ snippet_1: {name: 'foo1', options: {foo: 'bar'}}
268
+ snippet_3: {name: 'bar3', options: {baz: 'pizza'}}
244
269
 
245
270
  ret = Mercury.Snippet.create('noobie', {noobie: 'one'})
246
- expect(ret.identity).toEqual('snippet_0')
271
+ expect(ret.identity).toEqual('snippet_2')
272
+
273
+ it "generates a unique identity with an un-ordered snippet list", ->
274
+ Mercury.Snippet.load
275
+ snippet_0: {name: 'foo0', options: {foo: 'bar'}}
276
+ snippet_1: {name: 'foo1', options: {foo: 'bar'}}
277
+ snippet_2: {name: 'foo2', options: {foo: 'bar'}}
278
+ snippet_12: {name: 'bar12', options: {baz: 'pizza'}}
279
+ snippet_6: {name: 'bar6', options: {baz: 'pizza'}}
280
+ snippet_7: {name: 'bar7', options: {baz: 'pizza'}}
281
+ snippet_3: {name: 'foo3', options: {foo: 'bar'}}
282
+ snippet_4: {name: 'foo4', options: {foo: 'bar'}}
283
+ snippet_5: {name: 'foo5', options: {foo: 'bar'}}
284
+
285
+ ret = Mercury.Snippet.create('noobie', {noobie: 'one'})
286
+ expect(ret.identity).toEqual('snippet_8')
247
287
 
248
288
  describe ".find", ->
249
289
 
@@ -261,10 +301,14 @@ describe "Mercury.Snippet class methods", ->
261
301
 
262
302
  beforeEach ->
263
303
  @snippets = {
264
- snippet_1: {name: 'foo', options: {foo: 'bar'}}
265
- snippet_2: {name: 'bar', options: {baz: 'pizza'}}
304
+ snippet_1: {name: 'foo', something: {foo: 'bar'}}
305
+ snippet_2: {name: 'bar', something: {baz: 'pizza'}}
266
306
  }
307
+ Mercury.Snippet.load(@snippets)
267
308
 
268
309
  it "creates a new instance for each item in the collection", ->
269
- Mercury.Snippet.load(@snippets)
270
310
  expect(Mercury.Snippet.all.length).toEqual(2)
311
+
312
+ it 'sets the options', ->
313
+ expect(Mercury.Snippet.find('snippet_1').options.something.foo).toEqual('bar')
314
+