mercury-rails 0.8.0 → 0.9.0

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 (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
+